Azure编程笔记(1):序列化复杂类型的TableEntity字段
内容提要
在使用MicrosoftAzure的CloudTable存储数据时,我们先要把数据定义成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中的数据,我们发现表格中没有好友列表相应列,例如以下图所看到的:
看起来用来表示好友列表的字段List<string>Friends没有存储到CloudTable中去。
问题根源
眼下TableEntity在缺省情况下仅仅支持简单类型,如数值(int、float等)、布尔值、字符串、DateTime等。对于自己定义的复杂类型、数据容器类型(如样例中的List)、枚举类型等,仅仅有在序列化之后才干正确地存储到CloudTable中去。
解决这个问题
我们能够重载TableEntity的两个函数ReadEntity和WriteEntity,把字段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里的数据例如以下图所看到的:
附录
实现序列化的类型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;
}
}
Azure编程笔记(1):序列化复杂类型的TableEntity字段的更多相关文章
- Azure编程笔记(3):用Fiddler调试Azure的应用程序
内容提要 Azure的服务是通过RESTfulAPI提供的. 尽管Azure针对非常多编程语言都提供了SDK.但这些SDK也仅仅是RESTfulAPI的一层封装. 在调用SDK或者RESTful ...
- python核心编程--笔记
python核心编程--笔记 的解释器options: 1.1 –d 提供调试输出 1.2 –O 生成优化的字节码(生成.pyo文件) 1.3 –S 不导入site模块以在启动时查找pyt ...
- C# 高效编程笔记2
C# 高效编程笔记2 1.理解GetHashCode()的陷阱 (1)作用:作为基于散列集合定义键的散列值,如:HashSet<T>,Dictionary<K,V>容器等 (2 ...
- C# 高效编程笔记1
C# 高效编程笔记1 1.使用属性而不是可访问的数据成员 (1).NET Framework中的数据绑定类仅支持属性,而不支持共有数据成员 (2)属性相比数据成员更容易修改 2.用运行时常量(read ...
- DSP28377S - ADC学习编程笔记
DSP28377S - ADC学习编程笔记 彭会锋 2016-08-04 20:19:52 1 ADC类型导致的配置区别 F28377S的ADC类型是Type 4类型,我的理解是不同类型的ADC采 ...
- Shell编程笔记
Shell编程笔记与Windows下熟悉的批处理类似,也可以将一些重复性的命令操作写成一个脚本方便处理. 修改别人的脚本,运行后遇到个问题 setenv: command not found 查证 ...
- 响应式编程笔记三:一个简单的HTTP服务器
# 响应式编程笔记三:一个简单的HTTP服务器 本文我们将继续前面的学习,但将更多的注意力放在用例和编写实际能用的代码上面,而非基本的APIs学习. 我们会看到Reactive是一个有用的抽象 - 对 ...
- 数据结构(逻辑结构,物理结构,特点) C#多线程编程的同步也线程安全 C#多线程编程笔记 String 与 StringBuilder (StringBuffer) 数据结构与算法-初体验(极客专栏)
数据结构(逻辑结构,物理结构,特点) 一.数据的逻辑结构:指反映数据元素之间的逻辑关系的数据结构,其中的逻辑关系是指数据元素之间的前后件关系,而与他们在计算机中的存储位置无关.逻辑结构包括: 集合 数 ...
- Linux网络编程笔记(修订版)
我的网络编程笔记, 因为最近又要做Linux下的网络编程,故重新修订, 其中一些内容参考了文末的链接及文章 1. 基本概念 2. 基本接口 2.1. 打开一个socket 2.2. 将 ...
随机推荐
- 生产环境服务CPU高问题分析
问题描述: 现网个别时候会出现CPU突然飙高的现象,飙高后不能恢复正常. 分析过程: CPU飙高后抓dump,最好本机看,其它机器看dump可能需要下载服务运行机器的sos,clr 0:000 ...
- dzzoffice的树型结构用户管理设计
在DzzOffice1.1的开发中,针对用户使用群体重新设计了,机构.部门.用户管理应用. 传统OA,企业相关程序,一般是设置机构-设置部门-设置职位-添加用户这样的步骤.每个步骤分为不同的管理界面. ...
- cmd命令 chcp
chcp是“change code page”的缩写.(关于代码页的相关知识详见:http://www.cnblogs.com/minisculestep/articles/4920992.html)
- html --- canvas --- javascript --- 绘图方法
Canvas元素是HTML5的一部分,允许脚本语言动态渲染位图像. 如有疑问请访问链接:http://javascript.ruanyifeng.com/htmlapi/canvas.html < ...
- 对web日志文件实现按照人员、行为分类
日志格式: method,time,name in,2015-05-06 17:37:46,Jenny1out,2015-05-06 17:37:46,Judith1in,2015-05-06 17: ...
- 谈谈final、finally和finalize
final: final为修饰符, 如果类被声明为final,则不能派生新子类. 如果变量被声明为final,则必须在声明时初始化,在以后的引用只能读取,不可修改. 如果方法被final声明,则只能使 ...
- atoi()函数的实现
atoi()函数的功能:将字符串转换成整型数:atoi()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负号才开始做转换,而再遇到非数字或字符串时('\0')才结束转化,并将结果返回( ...
- 【转】Android Intent Action 大全
String ADD_SHORTCUT_ACTION 动作:在系统中添加一个快捷方式.. “android.intent.action.ADD_SHORTCUT” String ALL_APPS_AC ...
- iOS 检测有没有安装其它应用 和ios9下要注意的地方
UIApplication *app = [UIApplication sharedApplication]; NSURL *url = [NSURL URLWithString:@"Tri ...
- 服务器多块磁盘 ,同时磁盘类型混合(SSD+STAT+SAS)
服务器多块磁盘 ,同时磁盘类型混合(SSD+STAT+SAS)