使用IXmlSerializable的问题
最近又开始使用XML了,但今天遇到一个折腾我一下午加一个晚上的时间,终于从网络上找到相关的资料解决了。
有一个成员是用来存放正则表达式的,由于里面包含其它字符,所以想用CDATA来保存方便查看,所以想到另建一个类再通过继承IXmlSerializable 接口来实现CDATA节点。参照了官方MSDN文档,写了类似以下的代码:
using System;
using System.Xml;
using System.Xml.Schema;
using System.Xml.Serialization;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.IO;
using System.Diagnostics; namespace BeiBei.Core.Tests
{
[XmlRoot("Worker")]
public class Worker
{
[XmlElement]
public string JobTitle { get; set; } [XmlAttribute("active")]
public bool Active { get; set; } [XmlElement]
public string NextPageEncodingName { get; set; } [XmlElement]
public Person Person { get; set; } [XmlElement]
public Person Person2 { get; set; } } public class Person : IXmlSerializable
{
// Private state
private string personName; // Constructors
public Person(string name)
{
personName = name;
} public Person()
{
personName = null;
} // Xml Serialization Infrastructure
public void WriteXml(XmlWriter writer)
{
writer.WriteString(personName);
} public void ReadXml(XmlReader reader)
{
personName = reader.ReadString();
} public XmlSchema GetSchema()
{
return (null);
public override string ToString()
{
return (personName);
} } [TestClass]
public class IXmlSerializableTests
{
[TestMethod]
public void S_Person_Test()
{
var p = new Person("Shawn"); XmlSerializer serializer = new XmlSerializer(typeof(Person)); string path = "D:\\Test.Person.xml";
string path2 = "D:\\Test.Person.2.xml"; using (var writer = XmlWriter.Create(path))
{
serializer.Serialize(writer, p);
} using (var reader = XmlReader.Create(path))
{
var p2 = serializer.Deserialize(reader) as Person; using (var writer2 = XmlWriter.Create(path2))
{
serializer.Serialize(writer2, p2);
}
} var xml1 = File.ReadAllText(path);
var xml2 = File.ReadAllText(path2);
Assert.AreEqual(xml1, xml2);
Debug.WriteLine(xml2);
} [TestMethod]
public void S_Worker_Test()
{
var p = new Person("Shawn");
var pp = new Person("John"); var w = new Worker()
{
JobTitle = "Boss",
Person = p,
Person2 = pp,
NextPageEncodingName = "gb2312",
}; XmlSerializer serializer = new XmlSerializer(typeof(Worker)); string path = "D:\\Test.Worker.xml";
string path2 = "D:\\Test.Worker.2.xml"; using (var writer = XmlWriter.Create(path))
{
serializer.Serialize(writer, w);
} using (var reader = XmlReader.Create(path))
{
var w2 = serializer.Deserialize(reader) as Worker; using (var writer2 = XmlWriter.Create(path2))
{
serializer.Serialize(writer2, w2);
}
} var xml1 = File.ReadAllText(path);
var xml2 = File.ReadAllText(path2); Debug.WriteLine(xml2);
Assert.AreEqual(xml1, xml2);
}
}
}
结果Serialize出来的文件是正常的,但Deserialize后文件中,第一个Person之后的其它属性都没有了。
尝试了很多次,当个PERSON对象序列化/反序列化都是没有问题的,但当对象包括PERSON,且PERSON属性后还定义了其它的属性,尝试添加<XmlElement>之类的特性都没用。结论就是:第一个PERSON属性之后的其它属性一率都没能正常Deserialize。怪自己对这块不了解,更怪MSDN没有写好例子!
后来在这里找到答案:
http://www.codeproject.com/Articles/43237/How-to-Implement-IXmlSerializable-Correctly
其实跟属性顺序没有关系,而是我们没有把ReadXml的实现正确地实现了。再改成如下就正常了:
public void ReadXml(XmlReader reader)
{
reader.MoveToContent();
var isEmptyElement = reader.IsEmptyElement;
reader.ReadStartElement(); if (!isEmptyElement)
{
personName = reader.ReadString();
reader.ReadEndElement();
}
}
终于搞定了,终于可以继续后面的任务!刚过了十二点!
使用IXmlSerializable的问题的更多相关文章
- [.net 面向对象程序设计进阶] (11) 序列化(Serialization)(三) 通过接口 IXmlSerializable 实现XML序列化 及 通用XML类
[.net 面向对象程序设计进阶] (11) 序列化(Serialization)(三) 通过接口 IXmlSerializable 实现XML序列化 及 通用XML类 本节导读:本节主要介绍通过序列 ...
- C# 序列化与反序列化之xml通过实现IXmlSerializable进行序列化的解决方案
新建控制台console项目,添加XmlPersonIXmlSerializable类,和AddressIXmlSerializable类(实现IXmlSerializable)以及AddressIX ...
- c#序列化基类(包含派生类继承DynamicObject和 IXmlSerializable)对象
直接上代码 using System.Diagnostics; using System.Text; using System.Xml; using System.Xml.Schema; using ...
- 解析大型.NET ERP系统数据访问 对象关系映射框架LLBL Gen Pro
LLBL Gen Pro是一个为.NET开发人员设计的的对象关系映射(ORM)框架,与NHibernate,Entity Framework等框架一样,通过实体与数据表的映射,实现关系数据库持久化. ...
- .Net 序列化(去除默认命名空间,添加编码)
1.序列化注意事项 (1).Net 序列化是基于对象的.所以只有实例字段呗序列化.静态字段不在序列化之中. (2)枚举永远是可序列化的. 2.XML序列化时去除默认命名空间xmlns:xsd和xmln ...
- NavisWorks Api 简单使用与Gantt
相信很多朋友在做BIM项目的时候.都有客户会提出项目计划,形象进度 等需求. 那么当前最主要的问题就是计划与BIM模型的关联问题.那么我在项目中是用户用Project软件编辑计划然后手动跟三维模型关联 ...
- C#对象序列化与反序列化zz
C#对象序列化与反序列化(转载自:http://www.cnblogs.com/LiZhiW/p/3622365.html) 1. 对象序列化的介绍........................ ...
- [.net 面向对象程序设计进阶] (1) 开篇
[.net 面向对象程序设计进阶] (1) 开篇 上一系列文章<.net 面向对象编程基础>写完后,很多小伙伴们希望我有时间再写一点进阶的文章,于是有了这个系列文章.这一系列的文章中, 对 ...
- 在.net中读写config文件的各种方法
阅读目录 开始 config文件 - 自定义配置节点 config文件 - Property config文件 - Element config文件 - CDATA config文件 - Collec ...
随机推荐
- Web 在线文件管理器学习笔记与总结(4)查看文件内容
② 查看文件内容 a.通过 file_get_contents($filename) 得到文件内容 b.通过 highlight_string($string) 或者 highlight_file($ ...
- Web 软件测试 Checklist 应用系列,第 1 部分: 数据输入
Web 软件测试 Checklist 应用系列,第 1 部分: 数据输入 本文为系列文章"Web 软件测试 Checklist 应用系列"中的第一篇.该系列文章旨在阐述 Check ...
- 字符串复制char *strcpy(char* dest, const char *src);
⒈strcpy的实现代码 char * strcpy(char * strDest,const char * strSrc) { if ((NULL==strDest) || (NULL==strSr ...
- [转]20个高级Java面试题汇总
http://saebbs.com/forum.php?mod=viewthread&tid=37567&page=1&extra= 这是一个高级Java面试系列题中的第一部分 ...
- 【转载】MySQL性能优化的最佳20+条经验
今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情.当我们去设计数据库表结构,对操作数据 ...
- Apache(Web)服务器性能调整
Apache多路处理模块---MPM apache通过不同的MPM运行在多进程和多线程混合模式下,增强配置扩充性能.MPM无法模块化,只能在编译配置时选择,被静态编译到服务器中.目前apache版本中 ...
- LVS的DR模式配置
一.基本规划负载均衡调度器 192.168.1.104 默认网关 192.168.1.1 ip别名 192.168.1.233realserver1 192.168 ...
- php--某个字符在字符串中的位置比较
<?php $haystack = 'helloe'; $needle = 'e'; $pos = stripos($haystack, $needle); echo "\n" ...
- P1032 字串变换
最近在练习bfs,看到了02年提高组的这个题,顿时来了兴致,联想到前一阵子的八数码问题,具体就是使用一个字符串来存储状态,把他存储到一个图中,然后开始bfs,如果10步之内无法完成就剪枝,同时使用哈希 ...
- 关于Java的File.separator
在Windows下的路径分隔符和Linux下的路径分隔符是不一样的,当直接使用绝对路径时,跨平台会暴出“No such file or diretory”的异常. 比如说要在temp目录下建立一个te ...