Статьи

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

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