-1

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

    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()]所以我不确定发生了什么?

4

3 回答 3

2

使用StreamWriter 的构造函数的这个重载来追加新数据而不是覆盖。

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;
        }
    }
于 2012-04-28T23:27:11.747 回答
1

您正在做的是打开一个文件,丢弃现有内容,将单个student类型的对象序列Student化为 XML,将 XML 写入文件并关闭它。

您要做的几乎完全相同,只是您必须序列化学生列表而不是单个学生。为此,请尝试这样做:

s.Serialize(w, students);

而不是这个:

s.Serialize(w, student);

并且不要忘记更改typeof(Student)为用于维护列表的任何类的 typeof(这将是一种students对象类型)。

于 2012-04-28T23:26:57.840 回答
0

它不会像你期望的那样工作。StreamWriter将新Student记录插入根元素中不会有任何魔力。您需要从文件中反序列化列表,添加新条目并将其序列化回来。或者,您可以将学生列表保存在内存中,向其中添加新记录,然后对整个集合进行序列化。

这些都不是存储增量更新的特别好方法。您应该考虑改用 SQL Server(或 express)。

于 2012-04-29T00:51:11.743 回答