【问题标题】:Deserialize xml to IList c#将xml反序列化为IList c#
【发布时间】:2012-03-14 18:30:20
【问题描述】:

我正在尝试将一些 xml 反序列化为 IList,但我遇到了问题。这是我到目前为止所做的:

XML:

<?xml version="1.0" encoding="utf-8"?>

<Animals>
    <Animal>
        <Name>Cow</Name>
        <Color>Brown</Color>
    </Animal>
</Animals>

模型:

[XmlRoot("Animals")]
public class Model
{
    [XmlElement("Animal")]
    public IList<Animal> AnimalList { get; set; }
}

public class Animal
{
    [XmlElement("Name")]
    public string Name{ get; set; }
    [XmlElement("Color")]
    public string Color{ get; set; }
}

反序列化:

FileStream fs = new FileStream("file.xml", FileMode.Open);
XmlReader xml = XmlReader.Create(fs);

XmlSerializer ser = new XmlSerializer(typeof(List<Model>));

var list = (List<Model>)ser.Deserialize(xml);

运行上述代码时出现无效操作异常。我做错了什么?

谢谢, 詹姆斯·福特

【问题讨论】:

  • 你不应该将你的类命名为Object,这是每个类的基类。
  • @OskarKjellin 我知道,在我的项目 ofc 中没有这样命名。当我创建这个问题时,我并没有想清楚。
  • @KirillPolishchuk 它的格式错误是什么?

标签: c# xml deserialization ilist


【解决方案1】:

试试看:

// Create a new XmlSerializer instance with the type of the test class
XmlSerializer SerializerObj = new XmlSerializer(typeof(List<Model>));

// Create a new file stream for reading the XML file
FileStream ReadFileStream = new FileStream(@"C:\file.xml", FileMode.Open, FileAccess.Read, FileShare.Read);

// Load the object saved above by using the Deserialize function
List<Model> LoadedObj = (List<Model>)SerializerObj.Deserialize(ReadFileStream);

// Cleanup
ReadFileStream.Close();

【讨论】:

    【解决方案2】:

    问题是您使用的是IList&lt;Animal&gt;。您需要使用 List&lt;Animal&gt; 以便它知道要使用的具体类型。

    编辑:在 LINQPad 中使用以下代码可以完美运行。唯一的区别是我通过字符串而不是文件加载 XML,但即使我更改为文件,它也可以正常工作。我刚刚添加了 System.Xml.Serialization 的使用。

    void Main()
    {
        string xml = @"<?xml version=""1.0"" encoding=""utf-8""?>
        <Animals>
            <Animal>
                <Name>Cow</Name>
                <Color>Brown</Color>
            </Animal>
        </Animals>";
    
        XmlReader reader = XmlReader.Create(new StringReader(xml));
    
        XmlSerializer ser = new XmlSerializer(typeof(Model));
    
        var list = (Model)ser.Deserialize(reader);
        list.Dump();
    }
    
    // Define other methods and classes here
    [XmlRoot("Animals")]
    public class Model
    {
        [XmlElement("Animal")]
        public List<Animal> AnimalList { get; set; }
    }
    
    public class Animal
    {
        [XmlElement("Name")]
        public string Name{ get; set; }
        [XmlElement("Color")]
        public string Color{ get; set; }
    }
    

    【讨论】:

      【解决方案3】:

      我认为您需要将您的 XmlSerializer 更改为:

      XmlSerializer ser = new XmlSerializer(typeof(Model));

      在尝试序列化模型列表之前,您希望将 XML 文件序列化为模型,其中包含内容列表。

      另外,您需要将 ObjectList 定义更改为

      public List&lt;Animal&gt; AnimalList { get; set; }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-11-30
        • 1970-01-01
        • 1970-01-01
        • 2018-07-17
        • 1970-01-01
        • 2018-10-11
        相关资源
        最近更新 更多