XML文件序列化和反序列化的相关内容
问题缘由:
XML反序列化出错,XML 文档(2, 2)中有错误,不应有 <configuration xmlns=''>
解决方法:
其实这个是很简单的,因为一般来说都是XML文档书写错误的问题!
只要把你想反序列化的对象,再序列化为XML文档。之后再对比之前出错的XML文档对比,就知道错误在哪了!
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 private void SerializeObject(string Xmlname) 2 { 3 XmlSerializer ser = new XmlSerializer(typeof(对象类型)); 4 5 TextWriter writer = new StreamWriter(Xmlname); 6 ser.Serialize(writer, 对象);//要序列化的对象 7 writer.Close(); 8 }
调用以上方法,可以把一个对象序列化XML文档(Xmlname:包含路径和Xml文件名)
以上摘自:http://www.cnblogs.com/louyu/archive/2011/01/06/1929038.html
顺手更新了下,见代码:
1 /// <summary> 2 /// 序列化成XML文件 3 /// </summary> 4 /// <typeparam name="T"></typeparam> 5 /// <param name="path">XML文件位置</param> 6 private static void SerializeXml<T>(string path) where T : new() 7 { 8 T t = new T(); 9 var ser = new XmlSerializer(typeof(T)); 10 TextWriter writer = new StreamWriter(path); 11 ser.Serialize(writer, t);//要序列化的对象 12 writer.Close(); 13 }
问题深入:
根据上面的方法序列化实体对象,得到的为一个简答的XML文件。但是如果我的XML文件相对略复杂,有多个配置组。 如果只是简单的反序列化,则也会报上面的错误。
经过研究,发现了XML序列化和反序列化的一些规则。一个比较好的资料:http://www.cnblogs.com/johnsmith/archive/2012/12/03/2799795.html,在代码的备注里解释的比较详细。
我的解决方法:
反序列化的方法:
/// <summary> /// 反序列化 /// </summary> /// <param name="type">对象类型</param> /// <param name="filename">文件路径</param> /// <returns></returns> public static object XmlDeserialize(Type type, string filename) { FileStream fs = null; try { fs = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); XmlSerializer serializer = new XmlSerializer(type); return serializer.Deserialize(fs); } catch (Exception ex) { throw ex; } finally { if (fs != null) { fs.Close(); } } } } //调用: var obj = (List<类>)XmlDeserialize(typeof(List<类>), path);
XML文件:
<?xml version="1.0" ?> <ArrayOf类 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <类> <URI>127.0.0.1:61616</URI> <TopicName>testTopic</TopicName> <ClientId>testClient</ClientId> <MessageType>IBytesMessage</MessageType> <UserName>admin</UserName> <Password>admin</Password> </类>
<类>
........
</类>
</ArrayOf类>
<!-这里面的类就是指的要反序列化的类的名字,要保持一致。这是多个实体类,所以上层必须要用”ArrayOf类“来说明,必须要保持一致!->
类的定义:
/// <summary> /// 实体类 /// </summary> [XmlRootAttribute("xml", IsNullable = false)]//必须有这个声明,从xml开始为root public class 类名字 {
…… ……
}
以上是我的解决方法。
在文章http://www.cnblogs.com/johnsmith/archive/2012/12/03/2799795.html有更详细的解释。