2014-02-14 51 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