На этот раз я расскажу о сериализации 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]}