StreamWriter覆盖以前的记录?

时间:2012-04-28 23:22:29

标签: c# linq collections xml-serialization streamwriter

您好我想知道如何使用我的流编写器保存以前的记录,如果我使用下面的代码,它在创建学生记录时工作正常但是当我创建第二个学生记录时,之前的记录消失了吗?我怎样才能记录所有记录?

    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()]装饰了学生班,所以我不知道最近会发生什么?

3 个答案:

答案 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)。