-1

こんにちは、ストリーム ライターで以前のレコードを保持する方法を知りたいのですが、以下のコードを使用すると、生徒のレコードが作成されたときに正常に動作しますが、2 番目の生徒のレコードを作成すると、以前のレコードは消えてしまいますか? どうすればすべての記録を保持できますか?

    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 では機能しません。2 回目の書き込みで 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型の単一のオブジェクトをStudentXML にシリアル化し、XML をファイルに書き込んで閉じることです。

あなたがしなければならないことは、単一の生徒ではなく生徒のリストをシリアライズする必要があることを除いて、ほとんど同じです。そのためには、次のことを試してください。

s.Serialize(w, students);

これの代わりに:

s.Serialize(w, student);

typeof(Student)そして、リストを維持するために使用しているクラスの typeofに変更することを忘れないでください(それはstudentsオブジェクトのタイプになります)。

于 2012-04-28T23:26:57.840 に答える
0

期待どおりに機能しません。ルート要素内にStreamWriter新しいレコードを挿入するための魔法はありません。Studentリストをファイルから逆シリアル化し、新しいエントリを追加して、シリアル化して戻す必要があります。または、学生のリストをメモリに保持し、それに新しいレコードを追加してから、セット全体をシリアル化することもできます。

どちらも、増分更新を保存するための特に優れた方法ではありません。代わりにSQLServer(またはExpress)の使用を検討する必要があります。

于 2012-04-29T00:51:11.743 に答える