ПриМеЧание
Начиная.с.версии.3 5,.в. NET.Framework.класс.SoapFormatter.считается.устаревшим.
и.не.рекомендуется.к.использованию .Однако.его.имеет.смысл.применять.при.отладке.
кода.сериализации,.так.как.он.создает.доступный.для.чтения.текст.в.формате.XML .
Если.в.выходном.коде.вы.хотите.воспользоваться.механизмами.XML-сериализации.
и.XML-десериализации,.обратитесь.к.классам.XmlSerializer.и.DataContractSerializer
Для сериализации графа объектов достаточно вызвать метод
Serialize
модуля
форматирования и передать ему, во-первых, ссылку на объект потока ввода-вы-
вода, во-вторых, ссылку на сериализуемый граф. Поток ввода-вывода указывает,
куда следует поместить сериализуемые байты. Его роль может играть объект
любого типа, производного от абстрактного базового класса
System.IO.Stream
.
Это означает, что граф может быть сериализован в тип
MemoryStream
,
FileStream
,
NetworkStream
и т. п.
669
Практический.пример.сериализации/десериализации
Во втором параметре метода
Serialize
является ссылка на объект любого типа:
Int32
,
String
,
DateTime
,
Exception
,
List
,
Dictionary,
DateTime>
и т. п. Объект, на который ссылается параметр
objectGraph
, может, в свою очередь,
содержать ссылки на другие объекты. К примеру, параметр
objectGraph
быть ссыл-
кой на коллекцию объектов, которые, в свою очередь, могут ссылаться на другие
объекты. Метод
Serialize
сериализует в поток все объекты графа.
Модуль форматирования «знает», как сериализовать весь граф, ссылаясь на
описывающие тип каждого объекта метаданные. Для отслеживания состояния
экземплярных полей в типе каждого объекта в процессе сериализации метод
Serialize
использует отражение. Если какие-то из полей ссылаются на другие
объекты, метод сериализует и их.
Модули форматирования используют хорошо проработанные алгоритмы. На-
пример, они знают, что каждый объект в графе должен сериализоваться всего один
раз. Благодаря этому при перекрестной ссылке двух объектов модуль форматиро-
вания не входит в бесконечный цикл.
В моем методе
SerializeToMemory
при возвращении управления методом
Serialize
объект
MemoryStream
просто возвращается вызывающему коду. При-
ложение использует содержимое этого неструктурированного массива байтов тем
способом, который считает необходимым. Например, оно может сохранить массив
в файле, скопировать в буфер обмена, переслать по сети и т. п.
Метод
DeserializeFromStream
превращает поток ввода-вывода обратно в граф
объекта. Эта операция еще проще сериализации. В моем коде был сконструирован
объект
BinaryFormatter
, после чего оставалось вызвать его метод
Deserialize
.
Этот метод берет в качестве параметра поток ввода-вывода и возвращает ссылку
на корневой объект десериализованного графа.
При этом внутри метод
Deserialize
исследует содержимое потока, создает
экземпляры всех обнаруженных в потоке объектов и инициализирует все их, при-
сваивая им значения, которые граф объекта имел до сериализации. Обычно затем
следует приведение ссылки на возвращенный методом
Deserialize
объект к типу,
который ожидает увидеть приложение.
Do'stlaringiz bilan baham: |