День сто пятьдесят четвёртый. #ЗаметкиНаПолях

Сериализация. Начало

Сериализация - это процесс преобразования объекта в поток байтов для хранения его в памяти, базе данных или файле. Основная цель - сохранить состояние объекта, чтобы иметь возможность воссоздать его при необходимости. Обратный процесс называется десериализацией.

Объект сериализуется в поток, который переносит не только данные, но и информацию о типе объекта, например его версию, имя сборки и языковые стандарты. Из этого потока он может быть сохранен в базе данных, файле или памяти.



Примеры использования:

- отправка объекта в удаленное приложение с помощью веб-службы,

- передача объекта из одного домена в другой,

- передача объекта через брандмауэр в виде строки XML,

- поддержание безопасности при передаче пользовательских данных между приложениями,

- сохранение набора объектов (например, состояние приложения) в качестве «резервной копии»,

- глубокое копирование объектов (об этом позже).



Чтобы сериализовать объект, вам нужен сериализуемый объект, поток, содержащий сериализованный объект, и средство форматирования. System.Runtime.Serialization содержит классы, необходимые для сериализации и десериализации объектов.

Примените атрибут Serializable к типу, чтобы указать, что экземпляры этого типа могут быть сериализованы. При попытке сериализовать объект, не помеченный атрибутом Serializable, выбрасывается исключение. Атрибут Serializable не наследуется производными типами.

Если сериализованный класс содержит ссылки на объекты других классов, помеченные атрибутом Serializable, эти объекты также будут сериализованы.



Пример

public static void Main()

{

var objects = new List<string> { "Jeff", "Kristin", "Grant" };

var stream = SerializeToMemory(objects);



stream.Position = 0;

var deserialized = (List<string>)DeserializeFromMemory(stream);



foreach (var s in deserialized)

Console.WriteLine(s);

}



private static Stream SerializeToMemory(object objects)

{

var stream = new MemoryStream();

new BinaryFormatter().Serialize(stream, objects);

return stream;

}

private static object DeserializeFromMemory(Stream stream)

{

return new BinaryFormatter().Deserialize(stream);

}



Метод SerializeToMemory создаёт объект System.IO.MemoryStream, чтобы разместить поток сериализованных данных в памяти. Затем используется объект BinaryFormatter из пространства имён System.Runtime.Serialization.Formatters.Binary. Этот объект, реализующий интерфейс IFormatter, «умеет» сериализовывать объекты в поток байтов и десериализовывать их из него.

Метод DeserializeFromMemory использует тот же поток данных из памяти, чтобы выполнить обратные действия.



Продолжение следует…



Источники:

- Джеффри Рихтер “CLR via C#”. 3-е изд. – СПб.: Питер, 2012. Глава 24.

-
https://docs.microsoft.com/ru-ru/dotnet/csharp/programming-guide/concepts/serialization/