将xml反序列化为IList c#

本文关键字:IList 反序列化 xml | 更新日期: 2023-09-27 18:27:52

我试图将一些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);

运行上面的代码时,我得到一个无效的操作异常。我做错了什么?

谢谢,James Ford

将xml反序列化为IList c#

试试看:

// 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();

问题是您使用的是IList<Animal>。您需要使用List<Animal>,以便它知道要使用的特定类型。

编辑:在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; }
}

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

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

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

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

public List<Animal> AnimalList { get; set; }