继承自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 ...
随机推荐
- linux c编程:信号(一)
信号是软件中断,很多比较重要的应用程序都需要处理信号.并且信号提供了一种处理异步事件的方法.如终端用户键入中断键,会通过信号机制停止一个程序,或及早终止管道中的下一个程序 很多条件都可以产生信号,比如 ...
- ABAP操作EXCEL (号称超级版)
[转自http://www.cnblogs.com/VerySky/articles/2170014.html] *------------------------------------------ ...
- Java之线程池(一)
在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统 ...
- 一对多 添加表单 cocoon
gem 'cocoon' - javascript "cocoon.js" https://note.youdao.com/web/#/file/XCiivnE/note/WEB4 ...
- ubuntu android studio 编译及运行错误Error retrieving parent for item: No resource found that matches the given name
安装好android studio并且安装其它需要的SDK或组件后,根据向导生成新的项目, 编译或运行时可能会出现下面的错误: Error:Error retrieving parent for it ...
- Python 3 并发编程多进程之进程与线程
Python 3 进程与线程 进程即正在执行的一个过程.进程是对正在运行程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的 ...
- BestCoder 1st Anniversary 1004 Bipartite Graph 【二分图 + bfs + 良好的逻辑思维 】
题目地址:http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=610&pid=1004 问题描述 Soda有一个$ ...
- mysql 启动服务错误
在博客上看到下面这个文档解决了问题.推荐可以看下. http://blog.csdn.net/yaowuliu/article/details/51133279
- php深入浅出session
1. session概念 0 2. http协议与状态保持 0 3. 理解cookie 0 4. php中session的生成机制 2 5. php中session的过期回收机制 3 6. php中s ...
- DBGrideh 实现自动排序
一.点击标题自动排序 1.在optioneh中设置:AutosortMarking:=True2.设置DbGridEh的属性:(不一定总要设置,与使用的数据连接有关)sortlocal:=True;3 ...