0

我已经设法使用 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() 循环。我只是不知道该怎么做。

4

2 回答 2

1

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

您要序列化Words(即List<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 使用的属性的详细信息

于 2012-12-25T21:49:47.637 回答
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属性。

于 2012-12-25T17:40:29.210 回答