Статьи

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

В настоящее время я ищу лучшее решение для сериализации объектов в среде Windows Phone 7. Я начну свой квест с сериализации XML с использованием класса XmlSerializer (популярное решение в Silverlight). В этой статье я покажу, как сериализовать и десериализовать объекты с использованием XmlSerializer, позже я попытаюсь сравнить несколько способов сериализации, чтобы выяснить, какой из них является лучшим.

Дополнительная информация

Создание примера класса

Я создал специальный класс SampleData для сериализации и десериализации. Это очень простой класс, содержащий только два свойства и объявление конструктора для заполнения обоих свойств (см. Код ниже). Для управления генерацией XML для класса вы можете использовать XmlAttribute, XmlElement и т. Д. Обратите внимание, что сериализовать можно только общедоступные свойства . Более подробную информацию о генерации XML можно найти здесь и здесь (веб-сайт MSDN).

public class SampleData
{
    [XmlElement]
    public string ContentText { get; set; }
 
    [XmlElement]
    public List<int> SomeItems { get; set; }
 
    public SampleData()
    {
        ContentText = "some text";
        SomeItems = new List<int>() { 1, 2, 3 };
    }
}

Добавление ссылки

Помните, что XmlSerializer требует добавления пространства имен System.Xml.Serialization в проект. Для этого щелкните правой кнопкой мыши имя проекта и выберите «Добавить ссылку». Выберите пространство имен System.Xml.Serialization на вкладке .NET (см. Изображение ниже).

 

Сериализация

Процессы сериализации и десериализации очень просты в реализации. Для обеих операций вам нужно будет создать экземпляр класса XmlSerializer и передать ему тип объекта для сериализации. Кроме того, для сериализации вам понадобится потоковый объект для хранения сериализованного объекта. Для сериализации объекта просто вызовите метод Serialize экземпляра XmlSerializer. Я создал следующий метод для сериализации:

public static void Serialize(Stream streamObject, object objForSerialization)
{
    if (objForSerialization == null || streamObject == null)
        return;
 
    XmlSerializer serializer = new XmlSerializer(objForSerialization.GetType());
    serializer.Serialize(streamObject, objForSerialization);
}

ограничения

  • Класс для сериализации должен быть публичным
  • Член класса для сериализации должен быть публичным
  • Беспараметрический конструктор для класса

Десериализация

Для десериализации объекта вам понадобится поток для чтения ранее сериализованных данных и типа объекта. Я также создал пример метода десериализации (код ниже), который возвращает десериализованный объект.

public static object Deserialize(Stream streamObject, Type serializedObjectType)
{
    if (serializedObjectType == null || streamObject == null)
        return null;
 
    XmlSerializer serializer = new XmlSerializer(serializedObjectType);
    return serializer.Deserialize(streamObject);
}

Тестирование сериализации и десериализации

Я использовал следующий метод для проверки сериализации и десериализации с помощью XmlSerializer. В результате экземпляр класса SampleData после десериализации в точности совпадает с экземпляром до сериализации.

public static void TestXMLSerialization()
{
    // serialization
    MemoryStream ms = new MemoryStream();
    XMLSerializerHelper.Serialize(ms, new SampleData());
    ms.Position = 0;
 
    // deserialization
    var sampleData = XMLSerializerHelper.Deserialize(ms, typeof(SampleData));
 
    ms.Close();
}

Вот как выглядит сериализованный экземпляр класса SampleData:

<?xml version="1.0"?>
<SampleData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <ContentText>some text</ContentText>
  <SomeItems>1</SomeItems>
  <SomeItems>2</SomeItems>
  <SomeItems>3</SomeItems>
</SampleData>