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