問題緣由:
xml反序列化出錯,XML 文檔(2, 2)中有錯誤,不應有 <configuration xmlns=''>
解決方法:
其實這個是很簡單的,因為一般來說都是XML文檔書寫錯誤的問題!
只要把你想反序列化的對象,再序列化為XML文檔。之后再對比之前出錯的XML文檔對比,就知道錯誤在哪了!
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.49028c.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.49028c.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.49028c.com/johnsmith/archive/2012/12/03/2799795.html有更詳細的解釋。
新聞熱點
疑難解答