Создание классов, сериализуемых в Tessa BSON и типизированный Tessa JSON
Создание классов, сериализуемых в Tessa BSON и типизированный Tessa JSON¶
В Tessa используется модифицированный сериализатор JSON. В отличие от стандартного JSON, в описании поля после парного двоеточия (“::”) может быть указан тип данных. Пример:
{
"Alias": "RoleTypes",
"CompositionID::uid": "443a5394-1db2-44d8-b519-cbc991f39fdf",
"OrderPos::int": 0
}
При создании класса, содержимое которого сериализуется в типизированный JSON (например, в response.Info в расширениях на карточку), рекомендуется унаследовать его от Tessa.Platform.Storage.StorageSerializable:
[Serializable, DataContract]
public sealed class CardTypeInfo : StorageSerializable
{
public string Name { get; set; }
public Guid Id { get; set; }
protected override void SerializeCore(Dictionary<string, object> storage)
{
storage[nameof(this.Id)] = this.Id;
storage[nameof(this.Name)] = this.Name;
}
protected override void DeserializeCore(Dictionary<string, object> storage)
{
this.Id = storage.TryGet<Guid>(nameof(this.Id));
this.Name = storage.TryGet<string>(nameof(this.Name));
}
}
Кроме типизированного JSON, применяется модифицированный сериализатор BSON, где могут сериализоваться только поля примитивных типов, хеш-таблицы и списки. Для BSON-сериализации удобно использовать класс - наследник Tessa.Platform.Storage.StorageObject.
[Serializable]
public sealed class CardTypeInfo : StorageObject
{
public CardTypeInfo()
: this(new Dictionary<string, object>())
{
}
public CardTypeInfo(Dictionary<string, object> storage)
: base(storage)
{
}
private CardTypeInfo(SerializationInfo info, StreamingContext context)
: base(info, context)
{
}
private const string IDKey = "ID";
private const string NameKey = "Name";
public Guid ID
{
get { return this.Get<Guid>(IDKey); }
set { this.Set(IDKey, value); }
}
public string Name
{
get { return this.Get<string>(NameKey); }
set { this.Set(NameKey, value); }
}
}
Создаём объект, который записываем в Info:
var typeInfo = new CardTypeInfo { ID = Guid.NewGuid(), Name = "random type" };
response.Info["TypeInfo"] = typeInfo.GetStorage();
Читаем объект из Info:
var typeInfo = new CardTypeInfo(response.Info.Get<Dictionary<string, object>>("TypeInfo"));
Guid id = typeInfo.ID;
string name = typeInfo.Name;