使用Azure表存储的另一种方法?

vto*_*ola 4 serialization azure wcf-data-services azure-table-storage deserialization

我想将这样的实体用于表存储:

public class MyEntity
{
    public String Text { get; private set; }
    public Int32 SomeValue { get; private set; }

    public MyEntity(String text, Int32 someValue)
    {
        Text = text;
        SomeValue = someValue;
    }
}
Run Code Online (Sandbox Code Playgroud)

但这是不可能的,因为ATS需要

  1. 无参数构造函数
  2. 所有属性都是公共的,并且是读/写的。
  3. 从TableServiceEntity继承;

前两个是我不想做的两件事。我为什么要让任何人都可以更改一些只读数据?或以不一致的方式创建此类对象(那么.ctor的含义是什么?),或者甚至更糟的是,更改PartitionKey或RowKey。为什么我们仍然受到这些反序列化要求的约束?

我不喜欢以这种方式开发软件,如何使用可以序列化和反序列化对象的方式使用表存储库?我认为只要对象从TableServiceEntity继承就不会有问题。

到目前为止,我必须保存一个对象,但是我不知道如何检索它:

            Message m = new Message("message XXXXXXXXXXXXX");

            CloudTableClient tableClient = account.CreateCloudTableClient();
            tableClient.CreateTableIfNotExist("Messages");
            TableServiceContext tcontext = new TableServiceContext(account.TableEndpoint.AbsoluteUri, account.Credentials);

            var list = tableClient.ListTables().ToArray();

            tcontext.AddObject("Messages", m);
            tcontext.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

有什么方法可以避免那些反序列化需求或获取原始对象?

干杯。

kni*_*hor 5

如果要使用Storage Client Library,则可以,对于要存储的对象可以做什么和不能做什么都有一些限制。第一点是正确的。我将第2点展开,说“您要存储的所有属性都必须是公共的,并且必须可读/写”(对于整数属性,您可以摆脱只读属性的束缚,并且不会尝试保存它们),但是您不会实际上不必继承TableServiceEntity

TableServiceEntity只是一个非常轻便的类,它具有PartitionKey,RowKey,Timestamp属性,并带有该DataServiceKey属性的装饰(请看Reflector)。您可以对自己创建的并且不继承自TableServiceEntity的类进行所有这些操作(请注意,这些属性的大小写很重要)。

如果仍然不能充分控制如何构建类,则可以始终忽略Storage Client Library,而直接使用REST API。这将使您能够以自己喜欢的方式对XML进行序列化和反序列化。您将失去使用该库所带来的所有好处,例如在LINQ中创建查询的能力。