В настоящее время я ищу лучшее решение для сериализации объектов в среде 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>