Статьи

Сериализация Windows Phone 7: Сериализация DataContract

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