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年8月4日
    7
  • Android Developer_Android api

    Android Developer_Android apiAndroidNforDevelopers重要的开发者功能多窗口支持通知JIT/AOT编译快速的应用安装路径外出瞌睡模式后台优化DataSaver快速设置图块API号码屏蔽来电过滤区域设置和语言Android中的ICU4JAPIOpenGLES3.2APIAndroidTV录制AndroidforWork辅助工具直接启动密钥认

    2025年9月19日
    6
  • 网站下载工具有哪些_网页怎么更改不了下载软件

    网站下载工具有哪些_网页怎么更改不了下载软件收藏几款好用的网页下载工具(网页下载器)引言webzipTeleportUltraTeleportUltra小飞兔下载MihovPictureDownloaderWinHTTrackHTTrack仿站小工具引言有的人利用网页下载工具下载网站到本地进行慢慢的欣赏,有的人利用下载工具创建垃圾站。不管你是出于什么样的目的,下面这些工具软件你可以会需要。webzip一款国外的网页下载器,把一个网站下载并压缩到一个单独的ZIP文件中,可以帮您将某个站台全部或部份之资料以ZIP格式压缩起来,可供你日后

    2022年4月19日
    38
  • js除法四舍五入保留小数点后两位写法

    js除法四舍五入保留小数点后两位写法原文连接&lt;!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN"&gt;  &lt;html&gt;  &lt;head&gt; &lt;title&gt;floatDecimal.html&lt;/title&gt; &lt;metahttp-equiv="keywords"co

    2022年6月21日
    81
  • js刷新当前页面的5种方式

    js刷新当前页面的5种方式强制刷新当前页面1、reload –强迫浏览器刷新当前页面location.reload([bForceGet])//重新加载当前文档bForceGet,可选参数,默认为false,

    2022年6月30日
    46
  • 如何自己开发漏洞扫描工具视频_系统漏洞扫描工具有哪些

    如何自己开发漏洞扫描工具视频_系统漏洞扫描工具有哪些扫描器的设计思想是:灵活,易扩展,易修改,灵活的意思就是可单独执行专项漏洞的扫描,也可以批量执行集成的所有漏洞探测模块;易扩展的意思就是,新的漏洞检测模块可清晰简单的集成进扫描器;易修改,对各个漏洞扫描模块可根据特殊情况修改探测逻辑。扫描器的使用扫描器下载地址:https://gitee.com/samllpig/SafeTool-51testing工具的详细安装教程:http://quan.51testing.com/pcQuan/lecture/117先打开我们的扫描器看下界面:..

    2025年11月6日
    3

发表回复

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

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