Сериализация и десериализация собственных типов данных

Хотя до сих пор об этом ничего не говорилось, тем не менее пришла пора узнать о существовании одной дополнительной особенности, присутствующей в ItemFileReadStore и ItemFileWriteStore, которая позволяет упаковывать и распаковывать данные произвольного типа. Причина, по которой может потребоваться выполнять отображение типов, часто обусловлена тем, что приходится иметь дело с атрибутами, значения которых не являются данными простых типов, литерами объектов или массивами. В таких случаях у вас есть возможность либо вручную собирать атрибуты, что привносит дополнительную сложность в логику приложения, либо запрятать логику сериализации в другом месте.

Неявное отображение типов
Неявное отображение типов в ItemFileReadStore происходит автоматически, если в данных присутствуют два специальных атрибута _type и _value. Атрибут _type идентифицирует функциюконструктор, которой должно передаваться значение атрибута _value. Объекты JavaScript типа Date являются наиболее типичным примером данных, при использовании которых можно ощутить преимущества отображения типов.

Типичный элемент данных из нашего существующего набора, в котором используется значение даты, мог бы выглядеть.
Пример 9.17.


Использование возможности отображения типа
для десериализации значения
...
{
name : "Light Cinnamon",
description : "Very light brown, dry , tastes like toasted grain with
distinct sour tones, baked, bready"
lastBrewed : {
'_type' : "Date",
'_value':"2008-06-15T00:00:00Z"}
}
}
...

Этот пример выглядит достаточно просто, но только при предположении, что функцияконструктор Date уже определена! После десериализации данных любые значения атрибута lastBrewed будут являться полноценными объектами типа Date, а не обычными строками:
var coffeeItem;
coffeeStore.fetchItemByIdentity({
identity : "Light Cinnamon",
onItem : function(item, request) {
coffeeItem = item;
}
});
coffeeStore.getValue(coffeeItem, "lastBrewed"); //Настоящий объект Date

Отображение собственных типов
При необходимости вы можете определить объект JavaScript, где задать функцию с именем deserialize и свойством type, которые могли бы использоваться для конструирования значения. Для механизма ItemFileWriteStore также можно определить функцию serialize.


Ниже в примере 9.18 демонстрируется пример объекта, представляющий со бой отображение объектов типа Date, который можно указать при конструировании набора данных для механизма ItemFileWriteStore.

Пример 9.18. Использование объекта отображения типа при создании набора данных для ItemFileWriteStore
dojo.require('dojo.date');
dojo.addOnLoad(function( ) {
var map = {
"Date": {
type: Date,
deserialize: function(value){
return dojo.date.stamp.fromISOString(value);
},
serialize: function(object){
return dojo.date.stamp.toISOString(object);
}
}
};
coffeeStore = new dojo.data.ItemFileReadStore({
url:"coffee.json",
typeMap : map
});
});

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Dojo на эту тему:
ItemFileReadStore
ItemFileWriteStore
Анализ ItemFileReadStore
Запрос дочерних элементов
Иерархии и ссылки в формате JSON

Вернуться в раздел: Dojo / Абстракция данных