Разработка распределенных приложений в Microsoft.NET Framework


Классы сериализации SoapFormatter и BinaryFormatter - часть 2


Рассматриваемые классы форматирования, реализующие интерфейс IFormatter, преобразуют эти имена в некоторый вид, передаваемый между доменами приложения через потоки ввода-вывода.

Рассмотрим пример создания класса с интерфейсом ISerializable и собственным механизмом сериализации.

using System; using System.IO; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters; using System.Runtime.Serialization.Formatters.Binary; using System.Reflection; [Serializable] public class Person : ISerializable { public String name; public Person() { }

Метод GetObjectData используется на первом шаге сериализации класса. В ходе его работы в объект класса SerializationInfo добавляется информация о полях класса, подлежащих сериализации. Для получения метаданных о полях класса используется статический метод GetSerializableMembers класса FormatterServices.

public void GetObjectData(SerializationInfo info, StreamingContext context) { Type thisType = this.GetType(); MemberInfo[] serializableMembers = FormatterServices.GetSerializableMembers(thisType, context); foreach (MemberInfo serializableMember in serializableMembers) { // Не обрабатывать поля с аттрибутом NonSerializedAttribute if (!(Attribute.IsDefined(serializableMember, typeof(NonSerializedAttribute)))) { info.AddValue(serializableMember.Name, ((FieldInfo)serializableMember).GetValue(this)); } } }

Для проведения десериализации класс содержит конструктор специального вида, заполняющий поля класса значениями из объекта класса SerializationInfo.

protected Person(SerializationInfo info, StreamingContext context) { Type thisType = this.GetType(); MemberInfo[] serializableMembers = FormatterServices.GetSerializableMembers(thisType, context); foreach (MemberInfo serializableMember in serializableMembers) { FieldInfo fieldInformation = (FieldInfo)serializableMember; if (!(Attribute.IsDefined(serializableMember, typeof(NonSerializedAttribute)))) { fieldInformation.SetValue(this, info.GetValue(fieldInformation.Name, fieldInformation.FieldType)); } } } } // Person

Ниже приведен пример использования созданного класса Person.




Начало  Назад  Вперед



Книжный магазин