首页 > 代码库 > Azure编程笔记(1):序列化复杂类型的TableEntity字段
Azure编程笔记(1):序列化复杂类型的TableEntity字段
内容提要
在使用MicrosoftAzure的CloudTable存储数据时,我们先要把数据定义成TableEntity的子类。假设TableEntity中包括复杂类型(比方容器类型如List等、或者自己定义类型)的字段,这些字段须要自己做序列化才干保存到CloudTable中去。
问题描写叙述
我们模拟社交站点定义一个类型Account,它包括一个账户的基本信息假设邮箱、姓名、生日等等,同一时候它还包括一个账户的好友列表:
public class Account : TableEntity { public const string AccountsPartitionKey = "AccountsPartition"; private const string FriendsKeyName = "Friends"; public string NickName { get; set; } public List<string> Friends { get; set; } public Account() { } public Account(string email, string nickName) { this.PartitionKey = AccountsPartitionKey; this.RowKey = email; this.NickName = nickName; this.Friends = new List<string>(); } }
为了简化问题,在存储时全部账号的PartitionKey都一样,RowKey是账号的Email邮箱。接下来我们用例如以下代码加入?两个用户,并把他们互相加为好友:
static void TestAddAccount() { string connectionString = Constant.connectionString; var storageAccount = Utilities.GetStorageAccount(connectionString); var accountsTable = new AccountsTableWrapper(storageAccount); string email1 = "harryhe@hotmail.com"; string nickName1 = "Harry He"; accountsTable.AddAccount(email1, nickName1); string email2 = "peterwang@hotmail.com"; string nickName2 = "Peter Wang"; accountsTable.AddAccount(email2, nickName2); accountsTable.AddFriend(email1, email2); }
当我们用工具AzureStorage Explorer查看CloudTable中的数据,我们发现表格中没有好友列表相应列,例如以下图所看到的:
看起来用来表示好友列表的字段List<string>Friends没有存储到CloudTable中去。
问题根源
眼下TableEntity在缺省情况下仅仅支持简单类型,如数值(int、float等)、布尔值、字符串、DateTime等。对于自己定义的复杂类型、数据容器类型(如样例中的List)、枚举类型等,仅仅有在序列化之后才干正确地存储到CloudTable中去。
解决这个问题
我们能够重载TableEntity的两个函数ReadEntity和WriteEntity,把字段Friends序列化成XML格式的字符串,这样该字段就能保存到CloudTable中去了。
public override void ReadEntity(IDictionary<string, EntityProperty> properties, OperationContext operationContext) { base.ReadEntity(properties, operationContext); foreach (var item in properties) { if (item.Key == FriendsKeyName) { var serializer = new SerializeWrapper<List<string>>(); string serializedFriends = item.Value.StringValue; this.Friends = serializer.Deserialize(serializedFriends); } } } public override IDictionary<string, EntityProperty> WriteEntity(OperationContext operationContext) { var results = base.WriteEntity(operationContext); var serializer1 = new SerializeWrapper<List<string>>(); string serializedFriends = serializer1.Serialize(this.Friends); results.Add(FriendsKeyName, new EntityProperty(serializedFriends)); return results; }
假设我们再次加入?两个互为好友的账号,通过AzureStorage Explorer能够看出CloudTable里的数据例如以下图所看到的:
附录
实现序列化的类型SerializeWrapper例如以下所看到的:
public class SerializeWrapper<T> { private XmlSerializer xmlSerializer; public SerializeWrapper() { xmlSerializer = new XmlSerializer(typeof(T)); } public string Serialize(T item) { string output; using (var sw = new StringWriter()) { xmlSerializer.Serialize(sw, item); output = sw.ToString(); } return output; } public T Deserialize(string message) { T item; using (var sr = new StringReader(message)) { item = (T)xmlSerializer.Deserialize(sr); } return item; } }