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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 月球美容计划之图的储存结构汇总

    月球美容计划之图的储存结构汇总

    2022年2月1日
    35
  • 老Java程序员花一天时间写了个飞机大战,很舒服![通俗易懂]

    引言:前两天我发现CSDN上有两篇飞机大战的文章异常火爆,各种指标都很高(阅读、点赞、评论、收藏等),但都是python写的,竟然不是我大Java,说实话作为老java选手,我心里是有那么一些失落的,难道我大java打飞机不行?就算大java打飞机不行,那我用单身30年的打飞机手速,我肯定行(反正我的代码我做主,就是玩!),于是我决定一展伸手,用java写了一个飞机大战。我就问你们我打飞机行不行,我媳妇都说行,你们呢?欢迎我亲爱的大Java选手们点赞+评论+收藏!给我冲、冲、冲。。。/**游戏窗

    2022年4月8日
    133
  • pycharm2021专业版激活码【注册码】

    pycharm2021专业版激活码【注册码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月18日
    50
  • java的方法分为两大类型,java题库

    1.Java程序主要分为两种类型:应用程序和。2.Java程序用{}将多条语句组合在一起,语句之间必须用;隔开。3.在类声明中提供类标志的关键字是class。4.一个Java源程序编译后会生成一个扩展名为.class的字节码文件。5.应用程序编译后生成字节码文件,由Java.exe直接解释执行…

    2022年4月9日
    38
  • pytest的使用_新代子程序重复调用

    pytest的使用_新代子程序重复调用Pytest执行用例规则Pytest在命令行中支持多种方式来运行和选择测试用例1.对某个目录下所有的用例pytest2.对模块中进行测试pytesttest_mod.py3.对文件夹进行

    2022年7月29日
    1
  • Spring batch教程 之 配置Step「建议收藏」

    Spring batch教程 之 配置Step「建议收藏」正如在BatchDomainLanguage中叙述的,Step是一个独立封装域对象,包含了所有定义和控制实际处理信息批任务的序列。这是一个比较抽象的描述,因为任意一个Step的内容都是开发者自己编写的Job。一个Step的简单或复杂取决于开发者的意愿。一个简单的Step也许是从本地文件读取数据存入数据库,写很少或基本无需写代码。一个复杂的Step也许有复杂的业务规则(取决于所实现的方式),并作

    2022年5月28日
    32

发表回复

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

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