2012-04-28 92 views
-1

嗨我想知道如何保留以前的记录与我的流编写器,如果我使用下面的代码,它工作正常时创建学生记录,但是当我创建第二个学生记录时,以前的记录不见了?我如何保存所有记录?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()]所以林不知道怎么回事?

回答

1

使用this重写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; 
     } 
    } 
+0

这不起作用。同样的问题,但不是我的方式你的方式ontop不追加也失去了第二次运行xml文档中的xml格式。 – 2012-04-28 23:41:15

+0

WriteStudent抛出一个异常:类型'WcfServiceLibrary1.Student'在组件'WcfServiceLibrary1,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'未被标记为可序列化。' – 2012-04-29 10:12:31

+0

@JungleBoogie:这意味着你必须修饰学生类与[Serializable](http://msdn.microsoft.com/en-us/library/system.serializableattribute.aspx)属性。 – 2012-04-29 10:33:21

1

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

你必须做的几乎完全一样,除了你必须序列化学生列表而不是一个单一的。为此,尝试这样做:

s.Serialize(w, students); 

,而不是这样的:

s.Serialize(w, student); 

而且不要忘了修改typeof(Student)到任何类,你正在使用,以保持一个列表将typeof(将是一种students对象)。

+0

嗨弗拉德使用的学生(这足够有趣的是我的名单被命名,返回一个错误,生成XML文档时出错...是的,谢谢你的Visual Studio非常翔实! – 2012-04-28 23:39:16

+0

你是正确的,我放弃了现有的内容,但我也想序列化一个学生,因为这是一个休息时间,每次只创建一个学生,所以我想要做的就是“追加”下一个创建的学生集合。 – 2012-04-28 23:54:09

+0

@ JungleBoogie:然后用Nuf的答案:)我的意思是,真的,你还能做什么?解析整个文件,将学生添加到解析列表中,然后再次序列化它... – 2012-04-29 00:06:10

0

它不会按照您期望的方式工作。 StreamWriter将不会做任何魔法,以便在根元素中插入新的Student记录。您需要从文件反序列化列表,添加新条目并将其序列化。或者,您可以将学生列表保留在内存中,向其添加新记录,然后序列化整个组。

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