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;
    }
}



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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • windows,cmd中进行盘符的切换「建议收藏」

    windows,cmd中进行盘符的切换「建议收藏」需求描述:  在工作中,有的时候需要在cmd中进行盘符的切换,以前总有些时候 通过cd来切,就是切换不过去,每次都要进行百度查询,所以,这次就记录下,  留着以后再用。操作过程:1.通过win+r->cmd的方式进入到cmd命令行中2.通过盘符加冒号的方式,切换到不同的磁盘根目录下,举例:切换到d盘下,执行d:然后按回车备注:此时,就切换到了D盘的根…

  • ubuntu卸载OpenCV[通俗易懂]

    ubuntu卸载OpenCV[通俗易懂]此文主要是个人在学习SLAM过程中的一些记录,请理性参考!!!如果是源码安装OpenCV的话,进入到OpenCV的安装目录,进入到build文件内,终端输入以下命令:sudomakeuninstallcd..sudorm-rbuildsudorm-r/usr/local/include/opencv2/usr/local/include/opencv/usr/include/opencv/usr/include/opencv2/usr/local/share/ope

  • echart旭日图_基于Echarts4.0实现旭日图[通俗易懂]

    echart旭日图_基于Echarts4.0实现旭日图[通俗易懂]昨天Echarts4.0正式发布,随着4.0而来的是一系列的更新,挑几个主要的简单说明:1.展示方面通过增量渲染技术(4.0+)ECharts能够展现千万级的数据量2.针对移动端优化,移动端小屏上适于用手指在坐标系中进行缩放、平移。可选的SVG渲染模块让图表在移动端更加节省内存。3.增加多种渲染方案,可实现跨平台使用,现有三种方案,可渲染Canvas、SVG(4.0+)、VML的形式渲染图…

  • Android Studio StrictMode

    Android Studio StrictMode最近接手一个新项目,研究下代码,并学习其中一些好的地方。比如今天发现运行app以后会有log显示 StrictMode相关信息,通过查看代码,我发现在某Activity中使用了StrictMode的一些功能,老实说,StrictMode我在手机的开发者选项中有见到过,enable以后用过几分钟……尝鲜,但是代码里面从来没用过这个功能,从来没用过    他主要是检测线程&虚拟

  • ListView 使用方法(Asp.Net)

    ListView 使用方法(Asp.Net)

    2021年12月30日
  • idea快捷键汇总mac_mac版本IDEA快捷键「建议收藏」

    idea快捷键汇总mac_mac版本IDEA快捷键「建议收藏」本文中的快捷键均为系统默认配置。一、mac系统键盘和符号对应关系1.Control(或Ctrl)⌃2.CapsLock⇪3.Command(或Cmd)⌘4.Option(或Alt)⌥5.Shift⇧二、mac系统自有快捷键1.command系列1).command+space切换输入法2).command+M最小化当前窗口3).command+Q关闭当前程序(…

发表回复

您的电子邮箱地址不会被公开。

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