8

通过 TableServiceEntity 将数据存储在 Azure 表服务中,您仅限于具有公共 get/set 的常用基本类型(int、string、datetime 等)。

处理集合、复杂类型、继承等的序列化没有你所期望的通常的魔法。

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

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

4

2 回答 2

5

ATS 支持继承。实现的具体类中的所有继承属性都将被持久化和检索。但是,确实不支持复杂类型。

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

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

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

高温高压

于 2012-07-04T18:45:13.597 回答
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;
于 2012-07-05T06:50:07.743 回答