0

TextWriterオブジェクトを使用してクラスをシリアル化する、作業中の新しいプロジェクトがあります。このようなもの:

TextWriter txtStream = new StreamWriter("xmlStreamFile.xml");
xmlSel.Serialize(txtStream, gp); // gp is the class I want to serialize
txtStream.Flush();
txtStream.Close(); 

このコードは、最初に使用したときに機能します(ファイルが作成され、データは正常に書き込まれます)が、2回目に使用しようとすると、「閉じたTextWriterに書き込めません」という例外が発生します。TextWriterを再度開くにはどうすればよいですか、またはこのタイプの例外を取得してtxtStreamオブジェクトを書き換えられるようにするにはどうすればよいですか。ありがとう!

4

3 に答える 3

2

いいえ、TextWriter のようなものを再度開くことはできません。一般的なケースでは、NetworkStream や GZipStream のようなものに書き込む可能性があるためです。これらの場合、ライター (およびストリーム) を閉じると、副作用があります。 (ネットワーク接続の終了、最終的な gzip ブロックの書き込みなど)。いいえ、それはできません。

ファイルに書き込んでいるので、次のいずれかです。

  • 準備が整うまで閉じないでください
  • 必要に応じて(追加のために)ファイルを再度開きます
于 2012-04-08T09:26:27.600 に答える
1

最も簡単な答えは、TextWriter毎回新しいものを再度開くことです。

public static void SerializeAsXml(object gp, string target)
{
    XmlSerializer xmlSel = new XmlSerializer(gp.GetType());
    using (TextWriter txtStream = new StreamWriter(target))
        xmlSel.Serialize(txtStream, gp);
}

このステートメントにより、がusing暗黙的に呼び出されます。FlushClosetxtStream

于 2012-04-08T08:47:59.643 に答える
0

同じファイルに追加する場合は、同じ TextWriter を使用し、完了したら閉じます。

XmlSerializer xmlSel = new XmlSerializer(typeof(Foo));
TextWriter txtStream = new StreamWriter("xmlStreamFile.xml");
for (int i = 1; i <= 3; i++)
{
    Foo foo = new Foo(i * 100);
    xmlSel.Serialize(txtStream, foo);
    Console.WriteLine("Serialize done #" + i);
    txtStream.Flush();
}
txtStream.Close();
txtStream.Dispose();

このサンプルFooは単純な構造体ですが、クラスでも機能します。

編集: WinFormsを使用していると仮定すると、クラス自体のXmlSerializerおよびStreamWriterメンバーを持つことができます:

class Form1 : Form
{
    private XmlSerializer xmlSel = null;
    TextWriter txtStream = null;
    //....
}

次に、ボタン クリック メソッドで、null の場合は一度初期化し、必要なものをシリアル化します。

if (xmlSel == null)
{
    xmlSel = new XmlSerializer(typeof(Foo));
    txtStream = new StreamWriter("xmlStreamFile.xml");
}
xmlSel.Serialize(txtStream, foo);
txtStream.Flush();

最後に、フォームの close イベントで、ライターを閉じて破棄します。

txtStream.Close();
txtStream.Dispose();
于 2012-04-08T09:06:41.407 に答える