Azure TableServiceEntity - 存储复杂的类

时间:2012-07-04 14:46:12

标签: c# azure azure-table-storage

通过TableServiceEntity在Azure Table Services中存储数据,您只能使用具有公共get / set的常用基本类型(int,string,datetime等)。

您从序列化中得到的通常的魔法都没有处理集合,复杂类型,继承等。

处理此问题的不同方法可能是

  • 挂钩WritingEntity and ReadingEntity事件以手动设置属性(包括使用某些序列化方法处理复杂类型到纯字符串属性)。
  • 与上述类似,但使用额外的“存储类”在YourClass< - >之间进行转换YourClassStorage< - > TableServices
  • 使用Lokad.Cloud's FatEntitiesLucifure
  • 等框架

我错过了什么吗?在哪种情况下哪种方法最好?

2 个答案:

答案 0 :(得分:5)

ATS支持继承。将保留并检索已实现的具体类中的所有继承属性。但是,确实不支持复杂类型。

至少还有一种方法可以处理对象树和对象关系的持久性: 将相关对象分别存储在不同的PartitionKey / RowKey下。

实现该方法的最简单(强力)方法可能需要您对ATS进行多次调用,以便可以正确地反序列化对象。

如果针对存储执行的事务数量比使用的存储空间和带宽更重要,那么该方法的更优雅的扩展将是为您的实体实现接口并创建实现所有这些接口的“宽”Union实体 - 这就是存储和检索的人。检索到的每个Union对象仅通过特定接口使用。您可以通过这种方式存储集合以及简单相关的实体 - 只需确保您的PartitionKey对于与Union对象相关的每个人都是相同的,并且您有办法识别哪个Union对象表示哪个实体类型。

HTH

答案 1 :(得分:3)

我不确定这是否能解答您的问题,但如果您需要上传复杂类型,则可以将数据序列化为字节数组。

我需要将一个KeyValuePair列表上传到TableStorage,所以我只是使用二进制格式化程序将它序列化为一个字节数组,然后反序列化并在检索它时将其转换回来。

序列化:

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

反序列化并退回:

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;