在 C# 中反序列化时出现 InvalidOperationException

问题描述 投票:0回答:1
c# xml-serialization xml-deserialization invalidoperationexception
1个回答
3
投票

我认为问题在于你的模型结构不佳。换句话说,序列化程序不知道如何读取您的 .xml。

您的 xml 错误。当你有 List< T > 时,会有一个:

    <ArrayOfT></ArrayOfT>

在 .XML 中。这是你需要做的!

  1. 首先,尝试使用 System.Xml.Serialization 中的 xml 属性(即 [XmlArray()])

  2. 最好使用 FileStream 而不是仅仅指出 URI

     using(var filestream = new FileStream(//your uri, FIleMode.Open)
    {
    }
    
  3. 使用属性而不是变量。因为稍后您可能想要绑定。

我如何设法解决该问题的代码示例:

public ServiceMap Deserialize()
    {
        ServiceMap serviceMap = new ServiceMap();

        try
        {
            using (var fileStream = new FileStream(Settings.ServiceMapPath, FileMode.Open))
            {
                XmlReaderSettings settings = new XmlReaderSettings();
                settings.IgnoreComments = true;

                using (XmlReader reader = XmlReader.Create(fileStream, settings))
                {
                    serviceMap = _serializer.Deserialize(reader) as ServiceMap;
                }
            }
        }
        catch (FileNotFoundException)
        {
            MessageBox.Show("File 'ServiceMap.xml' could not be found!");
        }

        return serviceMap;
    }

我的 ServiceMap 类:

    [XmlRoot("ServiceMap")]
public class ServiceMap
{
    [XmlArray("Nodes")]
    [XmlArrayItem("Node")]
    public List<Node> Nodes = new List<Node>();

    [XmlArray("Groups")]
    [XmlArrayItem("Group")]
    public List<Group> Groups = new List<Group>();

    [XmlArray("Categories")]
    [XmlArrayItem("Category")]
    public List<Category> Categories = new List<Category>();
}

编辑:我的XML:

<?xml version="1.0" encoding="utf-8"?>
<ServiceMap xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://   www.w3.org/2001/XMLSchema">
  <Nodes>
    <Node Name="Predrag">
  <Children>
    <Child>dijete1</Child>
    <Child>dijete2</Child>
    <Child>dijete3</Child>
    <Child>dijete4</Child>
  </Children>
  <Parents>
    <Parent>roditelj1</Parent>
    <Parent>roditelj2</Parent>
    <Parent>roditelj3</Parent>
  </Parents>
  <Group Name="Grupa" />
  <Category Name="Kategorija" />
</Node>
<Node Name="Tami">
  <Children>
    <Child>dijete1</Child>
    <Child>dijete2</Child>
  </Children>
  <Parents>
    <Parent>roditelj1</Parent>
  </Parents>
  <Group Name="Grupa2" />
  <Category Name="Kategorija2" />
</Node>

© www.soinside.com 2019 - 2024. All rights reserved.