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

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中的数据,我们发现表格中没有好友列表相应列,例如以下图所看到的:


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

看起来用来表示好友列表的字段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里的数据例如以下图所看到的:

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


附录


实现序列化的类型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;
    }
}



版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/119135.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • linux中ll命令用法_linux命令ll与ls的区别

    linux中ll命令用法_linux命令ll与ls的区别ll并不是linux下一个基本的命令,它实际上是ls-l的一个别名。一些Linux系统默认不支持命令ll,必须用ls-l,这样使用起来不是很方便。如果要使用此命令,可以作如下修改:打开~/.bashrc增加aliasll=‘ls-l’aliasll=’ls-l’(关闭原来的终端才能使命令生效)这样个人用户可以使用ll命令,当切换成超级用户后,使用ll命令时提示找不到命令,那是因为你只是修改了个人用户的配置,所以,切换成root后做相同的操作即可解决问题。启示:我们可以通

    2025年11月22日
    8
  • 网络通信基础知识总结报告_数据通信与计算机网络知识点总结

    网络通信基础知识总结报告_数据通信与计算机网络知识点总结1.常见术语说明 数据载荷 在具有层次化结构的网络通信过程中,上层协议传递给下层协议的数据单元(报文)都可以称之为下一层协议的载荷数据。 报文 报文是网络交换与传输的数据单元,它具有一定的内在格式,并通常都具有头部+数据载荷+尾部的基本结构。在传输过程中,报文的格式和内容可能会发生改变。 头部 …

    2022年9月21日
    3
  • 解决pycharm汉化后无法打开设置

    解决pycharm汉化后无法打开设置转自:https://www.52pojie.cn/thread-728816-1-1.html由于操作相对复杂,再次小白整理了一下,下载压缩包内有使用方法,一目了然链接:https://pan.baidu.com/s/1o0jcRlPy4AuNAtfsk2wvHw提取码:4l7j…

    2022年5月16日
    42
  • performClick();[通俗易懂]

    performClick();[通俗易懂]btn.performClick(); 该方法表明——Activity运行的时候运行该button的点击事件的内容,相当于系统帮你点击了这个按钮,然后运行对应的事件

    2022年6月29日
    23
  • html练习(5)

    html练习(5)

    2022年1月21日
    60
  • Thinkpad x201i 拆机清理风扇「建议收藏」

    Thinkpad x201i 拆机清理风扇「建议收藏」Thinkpadx201i拆机清理风扇教程笔记本散热风扇使用时间长了就累积很多灰尘,堵塞出风口,从而大幅降低散热效果。因此有必要对其清理。要彻底清理风扇灰尘,需要拆机方可。首先要把笔记本的电池取下。电池取下后,我们就可以开始拆卸内存了,首先要把内存外壳拆下。拆下内存盖后,我们只要把两边的卡扣松动,轻轻一拔即可把内存取下。这款笔记本的硬盘仓很隐蔽,不过在D面还是有明显的图标提示,拧下螺丝和卡扣,即可看到硬盘。硬盘盖拆下来之后,只需用力的拔出黑带即可把硬盘取下。…

    2022年6月27日
    96

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号