您好我想知道如何使用我的流编写器保存以前的记录,如果我使用下面的代码,它在创建学生记录时工作正常但是当我创建第二个学生记录时,之前的记录消失了吗?我怎样才能记录所有记录?
public void AddStudent(Student student)
{
students.Add(student);
XmlSerializer s = new XmlSerializer(typeof(Student));
TextWriter w = new StreamWriter("c:\\list.xml");
s.Serialize(w, student);
w.Close();
}
编辑更新:
从下面的部分答案中我不断收到此错误Type WcfServiceLibrary1.Student' in Assembly 'WcfServiceLibrary1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null is not marked as serializable
我用[Serializable()]
装饰了学生班,所以我不知道最近会发生什么?
答案 0 :(得分:2)
使用StreamWriter构造函数的this重载来附加新数据而不是覆盖。
TextWriter w = new StreamWriter("c:\\list.xml", true);
的更新强>:
我看,它只适用于BinaryFormatter而不适用于XmlSerializer,因为第二次写入使XML无效。除非出于某种原因需要XML格式,否则使用二进制格式会更容易。这应该有效:
static void WriteStudent(Student S)
{
BinaryFormatter f = new BinaryFormatter();
using (Stream w = new FileStream("c:\\list.dat", FileMode.Append))
{
f.Serialize(w, S);
}
}
static List<Student> ReadStudents()
{
BinaryFormatter f = new BinaryFormatter();
using (Stream w = new FileStream("c:\\list.dat", FileMode.Open))
{
List<Student> students = new List<Student>();
while (w.Position < w.Length)
{
students.Add((Student)f.Deserialize(w));
}
return students;
}
}
答案 1 :(得分:1)
您正在做的是打开文件,丢弃现有内容,将student
类型的Student
对象序列化为XML,将XML写入文件并关闭它。
您需要做的几乎完全相同,除了您必须序列化学生列表而不是单个学生列表。为此,请尝试这样做:
s.Serialize(w, students);
而不是:
s.Serialize(w, student);
并且不要忘记将typeof(Student)
更改为用于维护列表的任何类的类型(这将是students
对象的类型。)
答案 2 :(得分:0)
它不会像你期望的那样工作。 StreamWriter
不会在根元素中插入新的Student
记录。您需要从文件反序列化列表,添加新条目并将其序列化。或者,您可以将学生列表保留在内存中,向其中添加新记录,然后序列化整个集合。
这些都不是存储增量更新的特别好方法。您应该考虑使用SQL Server(或express)。