2014-02-14 110 views
1

列表的序列化不會遇到問題。在XML文件的創建:反序列化XMl錯誤

 XmlDocument toolConfig = new XmlDocument(); 
     XmlNode myRoot; 
     myRoot = toolConfig.CreateElement("Tool"); 
     toolConfig.AppendChild(myRoot);   
     toolConfig.Save(@userConfigurePath + "\\config.xml"); 

序列化之後的XML文件看起來像這樣:

 <?xml version="1.0" encoding="utf-8"?> 
    <Tools xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Tool> 
     <Name>test</Name> 
     <Path>C:\Program Files\FreePDF_XP\freepdf.exe</Path> 
    </Tool> 
    <Tool> 
     <Name>test2</Name> 
     <Path>C:\Program Files\FreePDF_XP\fpconfig.exe</Path> 
    </Tool> 
    <Tool> 
     <Name>test3</Name> 
     <Path>C:\Program Files\FreePDF_XP\redrun.exe</Path> 
    </Tool> 
</Tools> 

反序列化代碼:

private void ToolHandling_Loaded(object sender, RoutedEventArgs e) 
    { 

     XmlSerializer deserializer = new XmlSerializer(typeof(List<Tool>)); 

     using (var reader = new StreamReader(@Start.userConfigurePath + 
     "\\config.xml")) 
     { 
      toolList = (List<Tool>)deserializer.Deserialize(reader); 
      reader.Close(); 
     } 

我得到的XML文檔錯誤2,2: System.InvalidOperationException:XML文檔中存在錯誤(2,2)。因此我使用了該文檔的驗證工具,並且沒有發生錯誤。錯誤的來源在哪裏?

編輯:全碼組成的XML:

private List<Tool> toolList = new List<Tool>(); 
private void ToolHandling_Closed(object sender, EventArgs e) 
    { 
     XmlSerializer serializer = new XmlSerializer(toolList.GetType(), new 
     XmlRootAttribute("Tools")); 
     using (var writer = new StreamWriter(@Start.userConfigurePath + 
     "\\config.xml")) 
     { 
      serializer.Serialize(writer, toolList); 
      writer.Close(); 
     } 
     } 
+0

你可以顯示完整的代碼來撰寫你的XML嗎? – progpow

+0

添加在主帖=) – LittleProgrammer

回答

3

你忘了指定在反序列root屬性:

XmlSerializer deserializer = new XmlSerializer(typeof(List<Tool>) , new XmlRootAttribute("Tools")); 
+0

現在好了。我犯了一個語法錯誤 – LittleProgrammer

1

你可以包裹在列出一個簡單的容器,然後反序列化這一點。

[XmlRoot("Tools")] 
public class ToolList 
{ 
    public ToolList() { Items = new List<Tool>(); } 
    [XmlElement("Tool")] 
    public List<Tool> Items; 
} 

private void ToolHandling_Loaded(object sender, RoutedEventArgs e) 
{ 

    XmlSerializer deserializer = new XmlSerializer(typeof(ToolList)); 

    using (var reader = new StreamReader(@Start.userConfigurePath + 
    "\\config.xml")) 
    { 
    toolList = (ToolList)deserializer.Deserialize(reader); 
    reader.Close(); 
    } 
} 

根據source

+0

是的,謝謝這對我來說也是可能的! – LittleProgrammer

+0

...但你接受YK1更簡單的答案是正確的! :) [ref](http://msdn.microsoft.com/en-us/library/f1wczcys(v = vs.110).aspx)。 – richaux