继承自DynamicObject的对象的Xml序列化
默认情况下,对继承自DynamicObject的对象进行序列化操作是不会报错的,但是并没有实际序列化出任何东西来
为了让它进行序列化,我们改造一下实现类,实现IXmlSerializable接口

#region 字段
///<summary> /// 集合字典,存放实际的对象 ///</summary> private Dictionary<string, object> dictionary =new Dictionary<string, object>();
#endregion
#region 公有方法
publicoverridebool TryGetMember(GetMemberBinder binder, outobject result) { string name = binder.Name.ToLower(); bool exist = dictionary.TryGetValue(name, out result); if (!exist) { // 不存在,默认空 result =null; } returntrue; }
publicoverridebool TrySetMember(SetMemberBinder binder, object value) { if (value ==null) { // 删除这个属性 Remove(binder.Name.ToLower()); } else { dictionary[binder.Name.ToLower()] = value; } returntrue; }
#endregion #region IXmlSerializable 通过实现该接口,对DynamicObject进行XML序列化
public System.Xml.Schema.XmlSchema GetSchema() { returnnull; }
publicvoid ReadXml(System.Xml.XmlReader reader) { XmlSerializer keySerializer =new XmlSerializer(typeof(string)); XmlSerializer typeSerializer =new XmlSerializer(typeof(string)); if (reader.IsEmptyElement ||!reader.Read()) { return; }
while (reader.NodeType != XmlNodeType.EndElement) { reader.ReadStartElement("item");
reader.ReadStartElement("key"); string key = (string)keySerializer.Deserialize(reader); reader.ReadEndElement();
reader.ReadStartElement("type"); string type = (string)typeSerializer.Deserialize(reader); reader.ReadEndElement();
Type realType = Type.GetType(type);
reader.ReadStartElement("value"); XmlSerializer valueSerializer =new XmlSerializer(realType); object value = valueSerializer.Deserialize(reader); reader.ReadEndElement();
reader.ReadEndElement();
dictionary.Add(key, value); reader.MoveToContent(); } reader.ReadEndElement();
}
publicvoid WriteXml(System.Xml.XmlWriter writer) { XmlSerializer keySerializer =new XmlSerializer(typeof(string)); XmlSerializer typeSerializer =new XmlSerializer(typeof(string)); foreach (string key in dictionary.Keys) { writer.WriteStartElement("item");
writer.WriteStartElement("key"); keySerializer.Serialize(writer, key); writer.WriteEndElement();
writer.WriteStartElement("type"); typeSerializer.Serialize(writer, dictionary[key].GetType().FullName); writer.WriteEndElement();
writer.WriteStartElement("value"); XmlSerializer valueSerializer =new XmlSerializer(dictionary[key].GetType()); valueSerializer.Serialize(writer, dictionary[key]); writer.WriteEndElement();
writer.WriteEndElement(); } }
#endregion }

这样这个对象就可以xml序列化了,但是当它作为一个属性创建时,申明是dynamic的
public dynamic ExtendedProperties =new SkelectoneDynamicObject();
Xml序列化需要的是确定的类型,会报错
Test method Goline.Test.GoblineCreatureTest.TestSave threw exception: System.InvalidOperationException: There was an error generating the XML document. ---> System.InvalidOperationException: The type Skelectone.SkelectoneDynamicObject may not be used in this context. To use Skelectone.SkelectoneDynamicObject as a parameter, return type, or member of a class or struct, the parameter, return type, or member must be declared as type Skelectone.SkelectoneDynamicObject (it cannot be object). Objects of type Skelectone.SkelectoneDynamicObject may not be used in un-typed collections, such as ArrayLists.
为此,我们构造一个用来序列化的对象

///<summary> /// 可序列化的动态属性 /// 仅供系统内部使用,请不要使用该属性 ///</summary> public SkelectoneDynamicObject SerializableExtendedProperties { get { return ExtendedProperties; } set { ExtendedProperties = value; } }

这样就实现了DynamicObject的Xml序列化,Binary序列化也可以类似实现ISerializable接口,这里就不给出实现了
转自:http://www.cnblogs.com/ueqtxu/archive/2010/07/20/1781559.html
继承自DynamicObject的对象的Xml序列化的更多相关文章
- XmlSerializer 对象的Xml序列化和反序列化
http://www.cnblogs.com/yukaizhao/archive/2011/07/22/xml-serialization.html 这篇随笔对应的.Net命名空间是System.Xm ...
- XmlSerializer 对象的Xml序列化和反序列化,XMLROOT别名设置
这篇随笔对应的.Net命名空间是System.Xml.Serialization:文中的示例代码需要引用这个命名空间. 为什么要做序列化和反序列化? .Net程序执行时,对象都驻留在内存中:内存中 ...
- C#操作Xml:XmlSerializer 对象的Xml序列化和反序列化
这篇随笔对应的.Net命名空间是System.Xml.Serialization:文中的示例代码需要引用这个命名空间. 为什么要做序列化和反序列化? .Net程序执行时,对象都驻留在内存中:内存中的对 ...
- Java对象的XML序列化(转)
转自:http://westlifesz.javaeye.com/blog/48618 java.io.Serializable引发的问题——什么是序列化?在什么情况下将类序列化? 序列化就是一种用 ...
- C#中XML与对象之间的序列化、反序列化
直接上代码: using System; using System.IO; using System.Text; using System.Xml; using System.Xml.Serializ ...
- 将对象xml序列化和反序列化
//将一个对象按XML序列化的方式写入到一个文件,使用的默认的UTF8编码格式 //o为要序列化的对象 //path保存文件的路径 public static object _lockObj=new ...
- .NET中XML序列化和反序列化常用类和用来控制XML序列化的属性总结(XmlSerializer,XmlTypeAttribute,XmlElementAttribute,XmlAttributeAttribute,XmlArrayAttribute...)
序列化和反序列化是指什么? 序列化(seriallization): 将对象转化为便于传输的数据格式, 常见的序列化格式:二进制格式,字节数组,json字符串,xml字符串.反序列化(deserial ...
- XML序列化和反序列化
上篇总结了下JSON的序列化和反序列化,博园中大牛给了很多牛叉的评论,学习了不少. 不过在上篇中忘了把json序列化和反序列化的另外一种方式写上去了,这里做个简单的补充: Json篇:http://w ...
- XML序列化与反序列化
public static class XmlHelper { private static void XmlSerializeInternal(Stream stream, object o, En ...
随机推荐
- Eclipse +Tomcat配置-【菜鸟学JAVA】
说起来也惭愧,以前用(Unieap)工具搞了一年多的JAVA+Oracle,现在居然在Eclipse中配置tomcat都搞了半天时间,原来一直是做.NET的. 今天开始不再用集成的环境,话不多说,开始 ...
- sql获取数组指定元素
需求:获取字符数组1,2,3的第2个元素 方法:通过自定义函数来实现 /* 获取字符串数组某个元素 */ from sysobjects where id = object_id('Get_StrAr ...
- Python基础(1)_python介绍、简单运算符
Python执行一个程序分为三个阶段 阶段一:先启动python解释器 阶段二:python解释器把硬盘中的文件读入到内存中 阶段三:python解释器解释执行刚刚读入内存的代码 二.编程语言的分类: ...
- nova 为何要做互信
1.计算节点为什么要做nova 的互信? nova 做resize 或者冷迁移需要两台计算节点做互信. 原因:resize(冷迁移)实际上是运行scp 文件到另一台主机上,如下的命令 Command: ...
- Cache-Control常用类型
可缓存性 no-cache 强制所有缓存了此响应的缓存用户,在使用已存储的缓存数据前,发送条件请求到原始服务器,若未过期,则使用缓存数据,否则重新获取 no-store 不存储有关客户端请求或服务器响 ...
- Python 注释和中文乱码
Python 注释分为三种: 1.单行注释:# 2.多行注释:前后3个单引号,或者三个双引号: 如:''' 多行注释 ''', """或者 多行注释 '"&qu ...
- 字典树 HDU 1075 What Are You Talking About
http://acm.hdu.edu.cn/showproblem.php?pid=1075 ;}
- HTML5坦克大战1
在JavaScript中,不要在变量为定义之前去使用,这样很难察觉并且无法运行. 颜色不对. 当我的坦克移动时,敌人坦克消失. tankGame3.html <!DOCTYPE html> ...
- JavaScript常用函数以及语法
$("#dwid").val(checkedVal.join(',')); .字符串(String) trim() //去掉空格 1.声明 var myString ...
- C#中string.Empty、""和null 之间的区别
1.C#中string.Empty.""和null 之间的区别 (http://blog.csdn.net/henulwj/article/details/7830615)