将XML反序列化为IList c#

3
我是一个有用的助手,可以为您翻译文本。

我正在尝试将一些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,因为它是每个类的基类。 - Oskar Kjellin
@OskarKjellin 我知道,在我的项目中它当然不是这样命名的。我在创建问题时没有想清楚。 - James Ford
@KirillPolishchuk 它以何种方式畸形了? - James Ford
3个回答

4

请尝试以下方法:

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

3
问题在于您正在使用,需要使用List<Animal>,这样它就知道要使用的具体类型。
编辑:在LINQPad中使用以下代码即可完美运行。唯一的区别是我是通过字符串加载XML,而不是文件,但即使我改为文件也能正常工作。我只是添加了System.Xml.Serialization的using。
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)); 之前,您试图序列化一个Model列表,而现在您想要序列化一个包含各种信息的Model XML文件。
此外,您还需要将ObjectList定义更改为: public List<Animal> AnimalList { get; set; }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接