将XML反序列化为对象列表

本文关键字:对象 列表 反序列化 XML | 更新日期: 2024-06-14 04:44:52

我有一个用ToDo对象填充并保存到XML的列表。这非常有效。我在将XML反序列化回"待办事项列表"对象时遇到问题。我知道类似的问题已经很少了,但没有一个对我有帮助,所以,我正在写作。

ToDo对象类:

public class ToDo
{
    public string ToDoString;
    public DateTime Date;
}

要序列化和反序列化的主要程序类和方法:

 static class Program
{
    static List<ToDo> ToDoList = new List<ToDo>();
    public static void Serialize(string toDoString)
    {
        // Create and Initialise the object
        ToDo newToDo = new ToDo();
        newToDo.ToDoString = toDoString;
        newToDo.Date = DateTime.Now;
        // Add the object to the List
        ToDoList.Add(newToDo);
        // Serialize List and save to XML
        XmlSerializer mySerializer = new XmlSerializer(ToDoList.GetType());
        // To write to a file, create a StreamWriter object.
        StreamWriter myWriter = new StreamWriter("myXML.xml");
        mySerializer.Serialize(myWriter, ToDoList);
        myWriter.Close();
    }
    public static void Deserialize()
    {
        // This code was originally wrote to deserialize single object. Now I need to deserialize List of objects and this code doesn't work.
        XmlSerializer myDeserializer = new XmlSerializer(ToDoList.GetType());
        FileStream myFileStream = new FileStream("myXML.xml", FileMode.Open);
        deserializeToDo = (ToDo) // Problems start here
        myDeserializer.Deserialize(myFileStream);
        myFileStream.Close();
    }
}

那么,我如何将XML反序列化为待办事项列表对象呢?

非常感谢您的帮助。

将XML反序列化为对象列表

以下适用于我的

var loadedData = (List<ToDo>)myDeserializer.Deserialize(myFileStream);

我刚刚在Deserialize 中更改了这一行

XmlSerializer myDeserializer = new XmlSerializer(typeof(List<ToDo>));
FileStream myFileStream = new FileStream("myXML.xml", FileMode.Open);
var loadedData = (List<ToDo>)myDeserializer.Deserialize(myFileStream);
myFileStream.Close();

给你的一个提示

public static void Deserialize()
{
    var myDeserializer = new XmlSerializer(typeof(List<ToDo>));
    List<ToDo> ToDoList;
    using (var myFileStream = new FileStream("myXML.xml", FileMode.Open))
    {
        ToDoList = (List<ToDo>)myDeserializer.Deserialize(myFileStream);
    }
}

using块将为您关闭一个流。

您应该使用以下语句对其进行反序列化:

var deserializedToDoList = (List<ToDo>)myDeserializer.Deserialize(myFileStream);

这就可以了。

删除带有注释的代码行//问题从这里开始。

捕获myDeserializer.Deserialize(myFileStream)的输出,如下所示:

public static void Deserialize()
{
    XmlSerializer myDeserializer = new XmlSerializer(ToDoList.GetType());
    FileStream myFileStream = new FileStream("myXML.xml", FileMode.Open);
    var listOfTodos = (List<ToDo>)myDeserializer.Deserialize(myFileStream);
    myFileStream.Close();
}