我有一个带有IDictionary的课程。此对象的大小不固定为任何特定大小。这个想法是拥有我的对象的动态架构。我想将此对象存储在TableStorage中。我怎样才能做到这一点?如何再次使用IDictionary在我的对象内部从商店中检索此信息?
谢谢!
答案 0 :(得分:1)
DynamicTableEntity
将IDictionary<string,EntityProperty>
作为参数。
此代码在LinqPad
:
void Main()
{
var account = "";
var key = "";
var tableName = "";
var storageAccount = GetStorageAccount(account, key);
var cloudTableClient = storageAccount.CreateCloudTableClient();
var table = cloudTableClient.GetTableReference(tableName);
var partitionKey = "pk";
var rowKey = "rk";
//create the entity
var entity = new DynamicTableEntity(partitionKey, rowKey, "*",
new Dictionary<string,EntityProperty>{
{"Prop1", new EntityProperty("stringVal")},
{"Prop2", new EntityProperty(DateTimeOffset.UtcNow)},
});
//save the entity
table.Execute(TableOperation.InsertOrReplace(entity));
//retrieve the entity
table.Execute(TableOperation.Retrieve(partitionKey,rowKey)).Result.Dump();
}
static CloudStorageAccount GetStorageAccount(string accountName, string key, bool useHttps = true)
{
var storageCredentials = new StorageCredentials(accountName, key);
var storageAccount = new CloudStorageAccount(storageCredentials, useHttps: useHttps);
return storageAccount;
}
答案 1 :(得分:0)
默认情况下,字典不可序列化。对象必须是可序列化的才能保存到TableStorage。我建议您使用List或Array类型的对象,或者如果List或Arrays不够好,可以为Dictionary编写自己的序列化器。
答案 2 :(得分:0)
您可以使用TableStorageContext中的Read和Write事件来执行此操作。您需要将IDictionary内容存储在其他Field中或作为BLOB文件。在Read事件中,您可以从给定字段创建IDictionary,也可以直接从BLOB文件中检索。在Write事件中,您将IDictionary存储到字段或作为BLOB文件。
重要提示:Write事件发生在Entity traslation步骤之后,如果您选择字段方式,则可能需要将更改直接写入实体的XML序列化。
这听起来很难,但在许多情况下非常有用