В этом посте я собираюсь продолжить изучение способов сериализации объектов в приложениях 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>