XML反序列化列表<>

时间:2012-12-25 17:34:11

标签: c# .net xml-serialization xml-deserialization

我已设法使用XML序列化序列化Word类型的对象列表:

public static void WriteXML(string fileName)
{     
    System.Xml.Serialization.XmlSerializer writer =
        new System.Xml.Serialization.XmlSerializer(typeof(Word));
    System.IO.StreamWriter file = new System.IO.StreamWriter(
        fileName);
    foreach (var word in Words)
    {
        writer.Serialize(file, word);
    }
    file.Close();
}

我在反序列化此列表时遇到问题。我正在使用此代码段:http://msdn.microsoft.com/en-us/library/vstudio/ms172872.aspx

我将代码更改为:

public static void ReadXML(string fileName)
{
    System.Xml.Serialization.XmlSerializer reader =
        new System.Xml.Serialization.XmlSerializer(typeof(Word));
    System.IO.StreamReader file = new System.IO.StreamReader(
        fileName);
    foreach (????)
    {
        Word word=new Word();
        word = (Word) reader.Deserialize(file);
        Words.Add(word); //Words is a List<Word>
    }
}

当然,foreach()循环在这里没有正确使用。我根本不知道如何做到这一点。

2 个答案:

答案 0 :(得分:1)

如何将单个Word对象序列化为同一个文件?这是每次迭代时覆盖文件的一种方式。只需序列化Database对象而不是单独的Word对象:

System.Xml.Serialization.XmlSerializer writer =
    new System.Xml.Serialization.XmlSerializer(typeof(Database));
System.IO.StreamWriter file = new System.IO.StreamWriter(fileName);
writer.Serialize(file, yourDatabaseObject);

注意:此外,请确保Database标有Serializable属性。

答案 1 :(得分:1)

首先,您不应逐个序列化每个单词。这将导致包含许多xmls的单个文件,这当然是无效的。

您想序列化WordsList<Word>)。因此,序列化程序的创建应为new XmlSerializer(typeof(List<Word>)),序列化为writer.Serialize(file, Words);

所以你的代码可以是这样的:

List<Word> Words = ........

WriteXML("a.xml", Words);
var newWords = ReadXML<List<Word>>("a.xml");

public static void WriteXML(string fileName,object obj)
{
    using (var f = File.Create(fileName))
    {
        XmlSerializer ser = new XmlSerializer(obj.GetType());
        ser.Serialize(f, obj);
    }
}

public static T ReadXML<T>(string fileName)
{
    using (var f = File.Open(fileName,FileMode.Open,FileAccess.Read))
    {
        XmlSerializer ser = new XmlSerializer(typeof(T));
        return (T)ser.Deserialize(f);
    }
}

PS:仅Serializable需要BinaryFormatter属性。 XmlSerializer不需要它。

您可以找到XmlSerializer使用here

的属性的详细信息