8

XMLファイルにデータを書き出すための2つの異なるアプローチに気づきました(簡潔にするためにエラー処理は省略されています)。

最初の方法では、XMLドキュメントを作成してから、XMLをファイルに保存するだけです。

using (XmlWriter writer = XmlWriter.Create(fileName))
{
    writer.WriteStartDocument(true);
    writer.WriteStartElement("parentelement");
    writer.WriteEndElement();
    writer.WriteEndDocument();
}

2番目の方法では、MemoryStreamを作成してから、MemoryStreamをファイルに保存します。

XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
MemoryStream ms = new MemoryStream();
using (XmlWriter writer = XmlWriter.Create(ms, settings))
{
    writer.WriteStartDocument(true);
    writer.WriteStartElement("parentelement");
    writer.WriteEndElement();
    writer.WriteEndDocument();
}

using (FileStream fs = File.Open(fileName, FileMode.Create, FileAccess.Write))
{
    ms.WriteTo(fs);
    ms.Dispose();
}

MemoryStreamを使用するためのロジックは、ファイルを保存する前にXMLファイルをビルドできることを確認することだと思います。MemoryStreamメソッドは、アトミック書き込みイベントを提供しますか、および/またはXMLファイルにエントリを追加している間の書き込みの問題から保護しますか?

これが実際に必要なのか、それともプロジェクトに不要なコード行を追加するためのやり過ぎな方法なのか、誰かが説明できますか?

4

6 に答える 6

15

このMemoryStream際バージョンがもったいない。のような作業を実行したいが、実際のファイルは必要ないMemoryStream場合に便利です。Streamファイルに書き込む場合、ファイルに書き込むだけです。これにより、メモリ内のすべてのデータをバッファリングする必要がなくなります。

于 2009-01-28T08:21:21.747 に答える
3

メモリ ストリーム アプローチは単純な操作では無駄が多いのは事実ですが、xml を暗号化ファイル、圧縮ファイルなどとして保存する場合などには非常に便利です。

于 2009-11-01T16:17:38.273 に答える
2

これはやり過ぎであり、無駄です。

2 つの主要なアプローチは、以下に基づいています。

  1. ドキュメントの完全な構造は最後までわかりません。
  2. ドキュメントの一部を「作成」すると、それらがドキュメントのこの部分の最終的な形であることがわかります。

最初の方法では、ドキュメントのメモリ内モデルを作成する必要があります (DOM がモデルとして設計されています)。作業が終了したら、ファイル ストリームに直接書き込むだけで問題ありません。

2 番目の方法では、かなりのメモリと複雑さを節約し、単純にエンド ストリーム (この場合はファイル ストリーム) を直接指すことができるXmlWriterを使用できます。

どの段階でも MemoryStream を使用する必要はありません

于 2009-01-28T08:23:40.400 に答える
1

(何らかの理由で) XmlWriter が成功することを確認したい場合 (つまり、ファイルが切り捨てられる可能性がありますが、ほとんどの場合、前述のようにタグを閉じないことが原因です)、一時ファイル ストリームを使用できます。これに:

public class TempFileStream : FileStream
{

    public TempFileStream(Action<string> onClose)
        : base(Path.GetTempFileName(), FileMode.OpenOrCreate, FileAccess.ReadWrite)
    {
        this.CloseDelegate = onClose;
    }

    protected Action<string> CloseDelegate 
    {
        get;
        set;
    }

    public override void Close()
    {
        base.Close();
        if (File.Exists(this.Name))
        {
            this.CloseDelegate(this.Name);
        }
    }

}

のような使用:

XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;

using (TempFileStream tfs = new TempFileStream(f => File.Move(f, filename))
using (XmlWriter writer = XmlWriter.Create(tfs, settings))
{
    writer.WriteStartDocument(true);
    writer.WriteStartElement("parentelement");
    writer.WriteEndElement();
    writer.WriteEndDocument();
}

これは多くのメモリを消費しません (もちろん、結果の XML が大きい場合にのみ意味があります)。

于 2009-01-28T10:43:32.443 に答える
1

Web アプリや Web サービスでドキュメントを作成する場合は、メモリ ストリームを使用すると便利だと思います。ファイルの場所は、同じ処理を実行している可能性のある別のプロセスと競合し、無効な結果を引き起こす可能性があります。メモリ ストリームでは、処理を分離する必要があります。

于 2010-02-01T22:54:08.003 に答える
0

XmlWriterを使用するためにMemoryStreamを使用する必要はありません。XmlWriterはファイルに直接書き込むことができます。ファイル名を引数として取るXmlWriter.Createメソッドの別のオーバーロードを使用できます。または、MemoryStreamに書き込む代わりに、XmlTextWriterまたはFileStreamに書き込むこともできます。

したがって、2番目のコードスニペットは次のように記述できます。

using( FileStream fs = ... )
{
    XmlWriter writer = XmlWriter.Create (fs);
}

AFAIK、XmlWriterは、整形式でないXmlの作成からユーザーを保護しません。

于 2009-01-28T08:15:49.433 に答える