我已设法使用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()循环在这里没有正确使用。我根本不知道如何做到这一点。
答案 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的单个文件,这当然是无效的。
您想序列化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使用here
的属性的详细信息