На этот раз я расскажу о сериализации DataContract JSON с использованием DataContractJsonSerializer . Этот тип сериализации очень похож на сериализацию DataContract, описанную в моем предыдущем уроке . Сериализация DataContract JSON в основном используется службами Windows Communication Foundation (WCF), но я попытаюсь применить этот подход к среде Windows Phone 7.
Дополнительная информация
Добавление ссылок
Помните, что для DataContractAttribute требуется добавить пространство имен System.Runtime.Serialization в проект. Для этого щелкните правой кнопкой мыши имя проекта и выберите «Добавить ссылку». Выберите пространство имен System.Runtime.Serialization на вкладке .NET (см. Изображение ниже).
DataContractJsonSerializer — это класс другой сборки System.ServiceModel.Web, поэтому вам необходимо добавить эту сборку и в ваш проект.
Создание примера класса
Я собираюсь использовать точно такой же класс, который я создал для сериализации DataContract (проверьте код ниже). Чтобы разрешить сериализацию объекта с использованием сериализации 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 }; } }
Сериализация
Для сериализации пользовательского объекта с использованием сериализации DataContact JSON вам потребуется объект Stream для записи сериализованных данных и пользовательский объект для сериализации. Просто создайте экземпляр DataContractJsonSerializer на основе типа объекта и передайте поток и пользовательский объект в качестве входных параметров в метод WriteObject (см. Код ниже).
public static void Serialize(Stream streamObject, object objForSerialization) { if (objForSerialization == null || streamObject == null) return; DataContractJsonSerializer ser = new DataContractJsonSerializer(objForSerialization.GetType()); ser.WriteObject(streamObject, objForSerialization); }
Десериализация
Десериализация аналогична сериализации, но для десериализации объекта из потока необходимо вызвать метод ReadObject экземпляра DataContractJsonSerializer.
public static object Deserialize(Stream streamObject, Type serializedObjectType) { if (serializedObjectType == null || streamObject == null) return null; DataContractJsonSerializer ser = new DataContractJsonSerializer(serializedObjectType); return ser.ReadObject(streamObject); }
тестирование
Как и во всех предыдущих уроках сериализации, я создал код для тестирования как сериализации, так и десериализации.
public static void Test() { // serialization MemoryStream ms = new MemoryStream(); DataContractJSONSerializationHelper.Serialize(ms, new SampleData()); ms.Position = 0; // deserialization var sampleData = DataContractJSONSerializationHelper.Deserialize(ms, typeof(SampleData)); ms.Close(); }
Мне нравится размер генерируемых сериализованных данных по сравнению с другими подходами сериализации. Возможно, я собираюсь попробовать это на более сложных объектах, но текущий результат должен выглядеть так:
{"ContentText":"some text","SomeItems":[1,2,3]}