继承自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 ...
随机推荐
- JVM调优-工具篇
原文地址 16年的时候花了一些时间整理了一些关于jvm的介绍文章,到现在回顾起来还是一些还没有补充全面,其中就包括如何利用工具来监控调优前后的性能变化.工具做为图形化界面来展示更能直观的发现问题,另一 ...
- linux 4 -awk
十一. awk编程: 1. 变量: 在awk中变量无须定义即可使用,变量在赋值时即已经完成了定义.变量的类型可以是数字.字符串.根据使用的不同,未初始化变量的值为0或空白字符串&q ...
- Linux 3 -grep
七. grep家族: 1. grep退出状态: 0: 表示成功: 1: 表示在所提供的文件无法找到匹配的pattern: 2: 表示参数中提供的文件不存在. 见如下示例: /> grep 'ro ...
- 坑爹的shell 空格
shell 空格很敏感,被线上代码坑了,占个位,回头好好整理一下
- ubuntu切换到root
sudo+命令,输入当前用户密码后以root权限执行命令,有时间限制且仅限当前命令. sudo -i,输入当前用户密码后以root权限登录shell,无时间限制.使用exit或logout退出. su ...
- LeetCode:盛最多水的容器【11】
LeetCode:盛最多水的容器[11] 题目描述 给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 ...
- git入门篇-----本地操作
一 ,git的简介 1 ,git的历史 概念性的知识,大家百度一下,就会出现好多优秀的文章供参考,这里我就不多说了. 如果不是当年BitMover公司威胁Linux社区,可能现在我们就没有免费而超级好 ...
- Tomcat的Server.xml虚拟主机和虚拟目录的配置
以前开发JavaEE网站都布置在Tomcat下,布置目录一般为$CATALINA_HOME/webapps/WebName,所以要访问网站,则在http://localhost后必须要加上上下文路径( ...
- js 实现滑块效果
var dd = $(".drag_bott").removeAttr('id').last().attr('id','drag_bott'); var drag = docume ...
- wget 实现web监控脚本
#!/bin/sbin timeout= times= url=https://1.1.1.1 while true;do wget --no-check-certificate --timeout= ...