Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Serialization 使用Azure表存储的替代方法?_Serialization_Azure_Wcf Data Services_Deserialization_Azure Table Storage - Fatal编程技术网

Serialization 使用Azure表存储的替代方法?

Serialization 使用Azure表存储的替代方法?,serialization,azure,wcf-data-services,deserialization,azure-table-storage,Serialization,Azure,Wcf Data Services,Deserialization,Azure Table Storage,我想使用如下实体作为表存储: 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; } }

我想使用如下实体作为表存储:

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;
    }
}
但这是不可能的,因为ATS需要

  • 无参数构造函数
  • 所有公共物业及 读/写
  • 继承表服务实体 前两个是我不想做的两件事。为什么我希望任何人都可以更改一些应为只读的数据?或者以一种不一致的方式创建此类对象(那么.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();
    
    有没有办法避免这些反序列化要求或获取原始对象


    干杯。

    如果您想使用存储客户端库,那么是的,您可以对要存储的对象执行哪些操作,哪些操作不能执行,这是有限制的。第1点是正确的。我将第2点扩展为“所有要存储的属性都必须是公共的和读/写的”(对于整数属性,您可以不使用只读属性,它不会试图保存它们),但您实际上不必从
    表服务实体继承

    TableServiceEntity
    只是一个非常轻的类,它具有PartitionKey、RowKey、Timestamp属性,并用
    DataServiceKey
    属性修饰(使用Reflector查看)。您可以对自己创建的类执行所有这些操作,而不是从TableServiceEntity继承(请注意,这些属性的大小写很重要)


    如果这仍然不能让您对如何构建类有足够的控制,您可以忽略存储客户机库,直接使用。这将使您能够以任何喜欢的方式对XML进行序列化和反序列化。您将失去使用该库带来的所有好处,例如在LINQ中创建查询的能力。

    只是不要使用继承


    如果您想使用自己的POCO,请根据需要创建类,并创建一个单独的tableEntity包装器/容器类,该类包含pK和rK,并以序列化字节数组的形式承载您的类。

    围绕ADO.NET包装器的表存储限制确实有些痛苦。您还可以采用中实现的方法。这将为实体的序列化提供更大的灵活性。

    您可以使用组合来实现所需的功能。 根据需要创建用于存储的表实体,并将POCO创建为那些提供希望应用程序代码的其余部分看到的API的包装器。
    您甚至可以混合使用一些接口以获得更好的代码。

    在运行时使用System.Reflection.Emit生成POCO包装怎么样?

    我也在考虑,使用一个实体来工作,另一个实体来存储。这确实有一个缺点,即您只能使用应用程序查看数据,无法运行(特别是效率低下,但有时有用)对除PartitionKey和RowKey之外的任何对象的查询