В VB.NET сериализацию объектов можно реализовать несколькими способами: стандартными .NET-сериализаторами (BinaryFormatter, XmlSerializer, DataContractSerializer, JsonSerializer).
Когда использовать:
BinaryFormatter — устарел, использовать не рекомендуется по соображениям безопасности.XmlSerializer — удобно для обмена данными с внешними программами и для хранения настроек.DataContractSerializer — подходит для сериализации сложных объектов и взаимодействия с WCF.JsonSerializer (System.Text.Json или Newtonsoft.Json) — для современных веб-API и межъязыкового взаимодействия.Тонкости:
Пример кода с XmlSerializer:
<Serializable()> Public Class Person Public Property Name As String Public Property Age As Integer End Class Dim p As New Person With {.Name = "Ivan", .Age = 30} Dim serializer As New Xml.Serialization.XmlSerializer(GetType(Person)) Using stream As New IO.FileStream("person.xml", IO.FileMode.Create) serializer.Serialize(stream, p) End Using
Можно ли сериализовать объект, который содержит свойства с типами, не помеченными как сериализуемые? Что произойдет?
Ответ:
Если класс содержит члены (свойства/поля), тип которых не помечен как сериализуемый, сериализация завершится ошибкой. Например, объект с полем типа FileStream не получится сериализовать через XmlSerializer — возникнет исключение, так как этот тип не поддерживает сериализацию.
История
Ошибка сериализации из-за приватного конструктора: При миграции данных разработчик попытался сериализовать класс с единственным приватным конструктором. Итог — сериализация упала с ошибкой, процесс миграции прервался.
История
Циклические ссылки: В проекте для сериализации использовался XmlSerializer, но между объектами были циклические ссылки. Сериализация приводила к StackOverflowException и необработанным сбоям служб.
История
Случайная потеря данных: В сложном объекте серилизуемый через JsonSerializer член помечали
[JsonIgnore]случайно, что приводило к потере части данных при пересылке, и дальнейшая десериализация теряла важные параметры объекта.