В этом посте я собираюсь продолжить изучение способов сериализации объектов в приложениях Windows Phone 7. На этот раз я объясню сериализацию DataContract с использованием класса DataContractSerializer . Этот тип сериализации может также применяться к приложениям Silverlight.
Дополнительная информация
Добавление ссылки
Помните, что для DataContractSerializer требуется добавить пространство имен System.Runtime.Serialization в проект. Для этого щелкните правой кнопкой мыши имя проекта и выберите «Добавить ссылку». Выберите пространство имен System.Runtime.Serialization на вкладке .NET (см. Изображение ниже).
Создание примера класса
Я собираюсь использовать почти тот же класс, который я создал для учебника по XmlSerializer , но немного измененный. Чтобы разрешить сериализацию объекта с использованием сериализации DataContract, необходимо добавить DataContractAttribute в класс (открытый класс). Генерацией XML можно управлять с помощью DataMemberAttribute для тех свойств, которые необходимо сериализовать, и IgnoreDataMemberAttribute для тех свойств, которые необходимо игнорировать во время сериализации. Публичные свойства будут автоматически выставлены. Посмотрите на пример ниже.
[DataContractAttribute] public class SampleData { [DataMember] public string ContentText { get; set; } [DataMember] public List<int> SomeItems { get; set; } public SampleData() { ContentText = "some text"; SomeItems = new List<int>() { 1, 2, 3 }; } }
Сериализация
Для сериализации объекта необходимо создать экземпляр класса DataContractSerializer (передавая тип сериализованного объекта в качестве входного параметра), а затем записать сериализованные данные в объект потока с помощью метода WriteObject, который принимает поток и объект, помеченный атрибутом DataContractAttribute, в качестве входных параметров. ,
public static void Serialize(Stream streamObject, object objForSerialization) { if (objForSerialization == null || streamObject == null) return; DataContractSerializer ser = new DataContractSerializer(objForSerialization.GetType()); ser.WriteObject(streamObject, objForSerialization); }
Десериализация
Десериализация также очень проста. Чтобы десериализовать объект, вам нужно снова создать экземпляр класса DataContractSerializer (передать конструктору тип сериализованного объекта), а затем прочитать сериализованные данные из объекта потока, используя метод ReadObject, который принимает объект потока в качестве параметра.
public static object Deserialize(Stream streamObject, Type serializedObjectType) { if (serializedObjectType == null || streamObject == null) return null; DataContractSerializer ser = new DataContractSerializer(serializedObjectType); return ser.ReadObject(streamObject); }
тестирование
Я использовал следующий метод для проверки сериализации и десериализации с использованием DataContractSerializer. В результате экземпляр класса SampleData после десериализации в точности совпадает с экземпляром до сериализации.
public static void Test() { // serialization MemoryStream ms = new MemoryStream(); DataContractSerializationHelper.Serialize(ms, new SampleData()); ms.Position = 0; // deserialization var sampleData = DataContractSerializationHelper.Deserialize(ms, typeof(SampleData)); ms.Close(); }
Вот как выглядит сериализованный экземпляр класса SampleData:
<SampleData xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/EugeneDotnetWPSamples.Serialization.DataContract"> <ContentText>some text</ContentText> <SomeItems xmlns:d2p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays"> <d2p1:int>1</d2p1:int> <d2p1:int>2</d2p1:int> <d2p1:int>3</d2p1:int> </SomeItems> </SampleData>