Понятие сериализации объектов

Термин сериализация описывает процесс сохранения (и, возможно, передачи) состояния объекта в потоке (т.е. файловом потоке и потоке в памяти). Последовательность сохраняемых данных содержит всю необходимую информацию, необходимую для реконструкции (или десериализации) состояния объекта с целью последующего использования. Применяя эту технологию, очень просто сохранять большие объемы данных (в различных форматах) с минимальными усилиями. Обычно сохранение данных с помощью сериализации выливается в код меньшего объема, чем применение классов для чтения/записи из пространства имен System.IO.

Например, предположим, что создано настольное приложение с графическим интерфейсом, в котором необходимо предоставить конечным пользователям возможность сохранения их предпочтений (цвета окон, размер шрифта и т.п.). Для этого можно определить класс по имени UserPrefs и инкапсулировать в нем примерно два десятка полей данных. В случае применения типа System.IO.BinaryWriter придется вручную сохранять каждое поле объекта UserPrefs. Аналогично, когда понадобится загрузить данные из файла обратно в память, придется использовать System.IO.BinaryReader и, опять-таки, вручную читать каждое значение, чтобы реконструировать новый объект UserPrefs.

Сэкономить значительное время можно, снабдив класс UserPrefs атрибутом [Serializable]:

[Serializable]

public class UserPrefs

{

public string WindowColor;

public int FontSize;

}

После этого полное состояние объекта может быть сохранено с помощью всего нескольких строк кода:

UserPrefs userData = new UserPrefs ();

userData.WindowColor = "Yellow";

userData.FontSize = 0;

// BinaryFormatter сохраняет данные в двоичном формате.

// Чтобы получить доступ к BinaryFormatter, понадобится

// импортировать System.Runtimе.Serialization.Formatters.Binary.

BinaryFormatter binFormat = new BinaryFormatter();

// Сохранить объект в локальном файле.

using (Stream fStream = new FileStream("user.dat", FileMode.Create, FileAccess.Write))

{

binFormat.Serialize(fStream, userData);

}

Хотя сохранять объекты с помощью механизма сериализации объектов.NET довольно просто, процесс, происходящий при этом "за кулисами", достаточно сложен. Например, когда объект сохраняется в потоке, все ассоциированные с ним данные (т.е. данные базового класса и содержащиеся в нем объекты) также автоматически сериализуются. Поэтому, при попытке сериализовать производный класс в игру вступают также все данные по цепочке наследования. И как будет показано, набор взаимосвязанных объектов, участвующих в этом, представляется графом объектов. Службы сериализации.NET также позволяют сохранять граф объектов в различных форматах. В предыдущем примере кода применялся тип BinaryFormatter, поэтому состояние объекта UserPrefs сохраняется в компактном двоичном формате. Граф объектов можно также сохранить в формате SOAP или XML, используя другие типы форматеров. Эти форматы полезны, когда необходимо гарантировать возможность передачи хранимых объектов между разными операционными системами, языками и архитектурами.

Граф объектов может быть сохранен в любом типе, унаследованном от System.IO.Stream. В предыдущем примере объект UserPrefs был сохранен в локальном файле через тип FileStream. Однако если вместо этого понадобится сохранить объект в определенной области памяти, можно применить тип MemoryStream. Главное, чтобы последовательность данных корректно представляла состояние объектов в графе.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: