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)
上一篇 2021年11月15日 下午7:00
下一篇 2021年11月15日 下午7:00


相关推荐

  • MyEclipse激活成功教程 CI-2018.9.0版本

    MyEclipse激活成功教程 CI-2018.9.0版本介绍myeclipse是eclipse进化版,有很强大的功能,但是,它是收费的。这也是阻碍大多数人使用它的原因。作为学生,想使用该工具进行学习,但苦于资金有限,只能进行激活成功教程后再学习。本人找了很多的激活成功教程教程,最初感觉很简单,就打算直接开搞;但是,按照教程一步一步来,结果发现,自己就是不能成功。为此,我还安装了很多不同的版本,但由于没有找到根本原因,全都以失败告终。后来,仔细研究后才知道原因…

    2026年4月14日
    2
  • 格兰杰因果关系检验命令_超声波传感器应用实例及原理

    格兰杰因果关系检验命令_超声波传感器应用实例及原理诺贝尔经济学奖获得者,计量经济学大师克莱夫·格兰杰(CliveGranger)从预测的角度给出了因果关系的一种描述性定义,这就是我们现在所熟知的Granger因果关系。格兰杰因果关系检验是计量经济方法中常用的一种检验方法

    2025年8月14日
    6
  • Python调用文心一言API:实现高效自然语言交互的完整指南

    Python调用文心一言API:实现高效自然语言交互的完整指南

    2026年3月12日
    2
  • LaTex支持中文的三种方式

    LaTex支持中文的三种方式文章目录 CJKutf8CTEX 的 UTF8 选项 我使用 xelatex 编译我们知道 Latex 一般用 CJK 和 CTEX 宏包支持中文编辑 CJK 和 CTEX 的默认编码是 GBK 而 windows 下的默然编码就是 GBK 因此 CJK 和 CTEX 不需要特殊配置就可以直接支持中文 Latex 编译 只需要用 GBK 编码保存文件即可 但是如果把文件的字符编码换成现在更加普遍的 ut

    2026年3月19日
    2
  • H3C 路由器 QoS 的CBQ配置

    H3C 路由器 QoS 的CBQ配置br CBQ 的配置 br 需求 br 路由器执行染色并执行 cbqbr 对内网发过来的数据包染色 br 数据包分类 br 为方便运行维护管理 供 QoS 使用的访问控制列表号码统一规范为下述命令中的号码 br acln3181 nbsp nbsp nbsp nbsp nbsp nbsp 视频业务 br br acln3182 nbsp nbsp nbsp nbsp nbsp nbsp 关键业务 1br br acln3183 nbsp nbsp nbsp nbsp nbsp nbsp 关键业务 2br br acln3184 nbsp nbsp nbsp nbsp nbsp

    2025年9月19日
    6
  • 论述人工智能,大数据,云计算之间的关系_物联网大数据人工智能的关系

    论述人工智能,大数据,云计算之间的关系_物联网大数据人工智能的关系1、云计算信息产业三大革命个人计算机革命、互联网革命和云计算革命。互联网革命:1990年,将终端计算设备连接起来,实现了信息的发布、检索和共享,极大提高了沟通和协作的效率。云计算革命:2006年,云计算的计算能力变成了一种公共服务,云计算通过集中供应、按需供应的模式,打破了时空限制,真正实现了信息化。三次革命让信息普及程度和社会生产效率得到了极大提升。云计算的应用,颠覆了信息产业从产品销售到服务输出的原有商业模式,极大加速了信息产业规模化、专业化、精细化、自主化的发展进程。云计算的概

    2026年4月15日
    7

发表回复

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

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