• Azure编程笔记(1):序列化复杂类型的TableEntity字段


    内容提要

    在使用MicrosoftAzureCloudTable存储数据时,我们先要把数据定义成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在缺省情况下仅仅支持简单类型,如数值(intfloat等)、布尔值、字符串、DateTime等。对于自己定义的复杂类型、数据容器类型(如样例中的List)、枚举类型等,仅仅有在序列化之后才干正确地存储到CloudTable中去。

    解决这个问题

    我们能够重载TableEntity的两个函数ReadEntityWriteEntity,把字段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;
        }
    }
    


    

  • 相关阅读:
    python numpy 介绍
    python+图像分割seg
    C++ 添加库
    input标签的disabled和readonly的区别
    linux中mysql忘记密码解决办法
    memcached服务安装与卸载
    app与服务端通信时如何进行消息校验
    缓存同步问题
    数据中添加对字段的说明
    服务器报警
  • 原文地址:https://www.cnblogs.com/yxwkf/p/3825418.html
Copyright © 2020-2023  润新知