继承自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 ...
随机推荐
- Android 部分机型在三星S3上面出现了,sqlite莫名其名的锁住的问题
今天在使用安卓三星S3开发时.发现数据库老是锁住,其它机型并未出现锁住的问题,查看数据库所在的目录发现,和db文件同名的多出了一个文件以-journal结尾的莫名其妙的文件,怀疑是这个导致的所以在程序 ...
- Flex自定义组件开发
一般情况下需要组件重写都是由于以下2个原因:1.在FLEX已有组件无法满足业务需求,或是需要更改其可视化外观等特性时,直接进行继承扩展.2.为了模块化设计或进一步重用,需要对FLEX组件进行组合.而F ...
- Datanode启动问题 FATAL org.apache.hadoop.hdfs.server.datanode.DataNode: Initialization failed for Block pool <registering>
-- ::, INFO org.apache.hadoop.hdfs.server.datanode.DataNode: supergroup = supergroup -- ::, INFO org ...
- 【leetcode刷题笔记】Edit Distance
Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2 ...
- 【leetcode刷题笔记】Reverse Integer
Reverse digits of an integer. Example1: x = 123, return 321Example2: x = -123, return -321 解题:设定一个变量 ...
- crontab 定时器
cronntab 定时器 crontab -e 编辑定时器 crontab -l 查看定时器 //每十分钟执行一次 */10 * * * * curl http://xxxxx //每天 凌晨 中午1 ...
- vim打开多个文件方式及操作
格式如下: #vim file*.txt 或者 #vim file file2 file3 查看当前编程的是那个文件,在冒号命令行下 :args 命令,类似:file [file2],以中括号里面为当 ...
- scp的用法
scp是有Security的文件copy,基于ssh登录.命令基本格式:scp [OPTIONS] file_source file_target OPTIONS:-v 和大多数 linux 命令中的 ...
- java的远程访问接口的实例
被别人远程调用和自己远程调用别人接口的理解: 被别人调用接口:其实没有什么神秘的,就是我们写一个正常的方法提供一个访问路径. 调用别人的接口:本质时一个Request请求,实际要使用到javax.ne ...
- HTML-CSS浮动元素详解
浮动定位是指 1.1将元素排除在普通流之外,即元素将脱离标准文档流 1.2元素将不在页面占用空间 1.3将浮动元素放置在包含框的左边或者右边 1.4浮动元素依旧位于包含框之内 2. 浮动的框可以向左或 ...