Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Прога - ответы2.docx
Скачиваний:
19
Добавлен:
23.04.2019
Размер:
206.38 Кб
Скачать

Стандартные форматеры сериализации

Среда .NET предоставляет следующие форматеры:

  • BinaryFormatter сериализует состояние объекта в поток, используя двоичный формат. Этот тип определен в пространстве имен System.Runtime.Serialization.Formatters.Binary

  • SoapFormatter сохраняет состояние объекта в виде сообщения SOAP (XML-формат для обмена сообщениями с веб-службами). Этот тип определен в пространстве имен System.Runtime.Serialization.Formatters.Soap

  • XmlSerializer используется для сохранения объектов в XML. Чтобы использовать этот тип, нужно использовать пространство имен System.Xml.Serialization

Пример работы с форматером BinaryFormatter:

UserPrefs userData = new UserPrefs();

userData.WindowColor = "Yellow";

userData.FontSize = 0;

BinaryFormatter binFormat = new BinaryFormatter();

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

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

{

binFormat.Serialize(fStream, userData);

}

// Прочитать UserPrefs из двоичного файла.

using ( Stream fStream = File.OpenRead(fileName) )

{

UserPrefs prefsFromDisk = (UserPrefs)binFormat.Deserialize(fStream);

}

Настройка сериализации с использованием атрибутов

Для дополнительного управления сериализацией .NET предоставляет возможность определять методы, оснащаемые специальными атрибутами:

[OnSerializing]

Метод будет вызван при сериализации объекта

[OnSerialized]

Метод будет вызван после сериализации объекта

[OnDeserializing]

Метод будет вызван при десериализации объекта

[OnDeserialized]

Метод будет вызван после десериализации объекта

Эти атрибуты сериализации определены в пространстве имен System.Runtime.Serialization. В случае применения этих атрибутов метод должен быть определен так, чтобы принимать параметр StreamingContext и не возвращать ничего.

Пример:

[Serializable]

public class UserPrefs

{

public string WindowColor;

public int FontSize;

[OnSerializing]

private void OnSerializing(StreamingContext context)

{

// будет вызван при сериализации

}

[OnSerialized]

private void OnSerialized(StreamingContext context)

{

// Будет вызван сразу после сериализации

}

}

Выводы:

  • Сериализация – сохранение объектов в потоке для последующего полного восстановления его состояния.

  • При сериализации класса сохраняются также все объекты, от которых он зависит (наследуя или включая). Для установления связей среда строит граф объектов.

  • Для сериализации объект должен быть отмечен атрибутом [Serializable]. Если какие-либо поля не должны сохраняться – их нужно отметить атрибутом [NonSerialized].

  • BinaryFormatter и SoapFormatter сериализуют все поля и свойства, XmlSerializer – только public поля или private поля с public свойствами.

  • BinaryFormatter сохраняет данные в компактном двоичном формате, SoapFormatter – в формате SOAP для веб-служб, XmlSerializer – в XML-формате.

  • Для тонкого управления сериализацией можно использовать методы, помеченные специальными атрибутами [OnSerializing], [OnSerialized], [OnDeserializing], [OnDeserialized]