2012-07-04 2 views
8

Хранение данных в Azure Table Services через TableServiceEntity вы ограничены обычными базовыми типами (int, string, datetime и т. Д.), Которые имеют общедоступный get/set.Azure TableServiceEntity - хранение сложных классов

Там нет ни обычной магии вы привыкли ожидать от сериализации, которая занимается коллекции, сложных типов, наследование и т.д.

Различные способы борьбы с этим может быть

  • Hooking в события WritingEntity and ReadingEntity для задания вручную свойств (в том числе для сложных типов с использованием некоторого метода сериализации для свойства простой строки).
  • Подобно выше, но использовать дополнительный «класс хранения», чтобы перевести между YourClass < -> YourClassStorage < -> TableServices
  • Используя рамки, такие как Lokad.Cloud's FatEntities или Lucifure

я пропустил что-нибудь? Какой метод может быть лучшим в каких обстоятельствах?

ответ

5

Наследование поддерживается АТС. Все унаследованные свойства в реализованном конкретном классе будут сохраняться и извлекаться. Однако сложные типы действительно не поддерживаются.

Существует, по крайней мере, еще один способ борьбы с сохранением деревьев объектов и отношений объектов: Хранить связанные объекты отдельно под другим разделом KeyKey/RowKey.

Простейший (грубой) способ реализации этого подхода может потребовать, чтобы вы выполняли несколько вызовов для ОВД, чтобы вы могли десериализовать объекты должным образом.

Если количество транзакций, выполняемых в отношении хранения данных, более важно, чем используемое пространство для хранения и используемая полоса пропускания, более элегантным расширением этого подхода будет внедрение интерфейсов для ваших объектов и создание «широкого» сущностного объекта, который реализует все эти интерфейсы - и это тот парень, который хранится и извлекается. Каждый объект Union, который извлекается, используется только через определенный интерфейс. Вы можете хранить коллекции, а также просто связанные объекты таким образом - просто убедитесь, что ваш PartitionKey одинаковый для всех, кто связан с объектом Union, и у вас есть способ определить, какой объект Union представляет тип сущности.

НТН

3

Я не уверен, если это отвечает на ваш вопрос, но если вам нужно загрузить сложные типы можно просто сериализовать данные в массив байтов.

Мне нужно было загрузить список KeyValuePair в TableStorage, поэтому я просто использовал двоичный форматтер, чтобы сериализовать его в массив байтов, затем десериализовать и отбрасывать его при извлечении.

Serialize:

MemoryStream ms = new MemoryStream(); 
BinaryFormatter bf = new BinaryFormatter(); 
bf.Serialize(ms, keyValuePairList); 
byte[] ba = ms.ToArray(); 

Deserialize и отбрасывать назад:

MemoryStream ms = new MemoryStream(byteArray); 
BinaryFormatter bf = new BinaryFormatter(); 
var obj = bf.Deserialize(ms); 

//cast object back to List of KeyValuePair 
var keyValuePairList = (List< KeyValuePair<string,string> >)obj; 
+0

Благодаря Шахин - я покрывал, что «перекинув в WritingEntity и ReadingEntity событий», но я думаю, вы можете просто сделать его свойство read only byte [] и оставить только Read/WriteEntity – Ryan

Смежные вопросы