C# Azure TableServiceEntity-存储复杂类

C# Azure TableServiceEntity-存储复杂类,c#,azure,azure-table-storage,C#,Azure,Azure Table Storage,通过TableServiceEntity在Azure表服务中存储数据您仅限于具有公共get/set的常用基本类型(int、string、datetime等) 在处理集合、复杂类型、继承等的序列化中,没有你所期望的那种常见的魔力 处理这一问题的不同方法可能是 挂接到事件以手动设置属性(包括使用某种序列化方法处理复杂类型以设置纯字符串属性) 与上面类似,但使用一个额外的“存储类”在类和存储表服务之间进行转换 使用诸如或之类的框架 我错过什么了吗?哪种方法在哪种情况下可能最好?ATS支持继承。将持

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

在处理集合、复杂类型、继承等的序列化中,没有你所期望的那种常见的魔力

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

  • 挂接到事件以手动设置属性(包括使用某种序列化方法处理复杂类型以设置纯字符串属性)
  • 与上面类似,但使用一个额外的“存储类”在类和存储表服务之间进行转换
  • 使用诸如或之类的框架

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

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

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

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

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


HTH

我不确定这是否回答了您的问题,但是如果您需要上传复杂类型,您可以将数据序列化到字节数组中

我需要将KeyValuePair的列表上载到表存储,所以我只需使用二进制格式化程序将其序列化为字节数组,然后在检索时反序列化并将其强制转换回

序列化:

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;
MemoryStream ms=新的MemoryStream(byteArray);
BinaryFormatter bf=新的BinaryFormatter();
var obj=bf.反序列化(ms);
//将对象强制转换回KeyValuePair列表
var keyValuePairList=(List)obj;

谢谢Shahin-我在“挂接WritingEntity和ReadingEntity事件”中介绍了这一点,但我想您也可以只对只读byte[]属性执行此操作,而不使用读/写属性