代码之家  ›  专栏  ›  技术社区  ›  LittleProgrammer

反序列化XMl错误

  •  1
  • LittleProgrammer  · 技术社区  · 10 年前

    列表的序列化不会遇到问题。创建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();
             }
            }
    
    3 回复  |  直到 10 年前
        1
  •  4
  •   YK1    10 年前

    反序列化时忘记指定根属性:

    XmlSerializer deserializer = new XmlSerializer(typeof(List<Tool>) , new XmlRootAttribute("Tools"));
    
        2
  •  1
  •   Community THelper    7 年前

    您可以将List包装在一个简单的容器中,然后对其进行反序列化。

    [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 .

        3
  •  0
  •   progpow    10 年前

    http://msdn.microsoft.com/ru-ru/library/system.xml.serialization.xmlserializer(v=vs.110).aspx

    ArrayList和泛型列表的序列化 XmlSerializer无法序列化或反序列化以下内容: 的阵列 ArrayList 的阵列 List<T>

    我认为您可以使用LINQ to XML来解决这个问题。