2012-01-18 17 views
1

私は次のコードStreamWriterを使用して文字列にテキストを書き込んで、何も書き込まれないのはなぜですか?

public void SerializeToStream(Stream stream) 
    { 
     var xml = // Linq to xml code here 

     // Write to the stream 
     var writer = new StreamWriter(stream); 
     writer.Write(xml.ToString()); 
    } 

マイxmlオブジェクトは、正しいデータを持っている、と私はxml.ToString()がすべてを正しく示していることを確認しましたが、writer.Write(xml.ToString())後、私の着信ストリームと呼ばれている(それはFileStreamまたはMemoryStreamだかどうかに関係なく、まだ持っているを持っていますその中には何も(ゼロの長さ)。例外がスローされません。ですが、なぜでしょう?

注意点としてXmlWriterクラスは、私がすることはできません余分なもの(<xml>宣言タグ)を追加しますので、私はxml.WriteTo()を使用することはできません私のXML(会社ポリ私は制御権を持っていない別のシステムとの統合のためのcy)。

+2

あなたは紅潮しています、または自動フラッシュがtrueに設定されていますか? – Luis

+0

これはおそらく、彼がアプリケーションを実行したり起動したディレクトリへの書き込みをデフォルト設定しているはずです。 – MethodMan

+1

@MystereMan:メソッドシグネチャは、すべてのStreamWriterが必要とするストリームを提供します... –

答えて

7

あなたは決してフラッシングしたり、ライターを閉じることはありません。 (私は通常、ライターを閉じることをお勧めしたいが、それはまた、あなたが望むものではないかもしれないストリームを閉じます。)単純に追加します。

writer.Flush(); 

をメソッドの最後に。

XML宣言は、必要に応じてXDocumentから削除できます。それは簡単にする必要があります

XDocument doc = new XDocument 
    (new XDeclaration("1.0", "utf-8", "yes"), 
    new XElement("Root", "content")); 
doc.Save(Console.Out); // Includes <? xml ... ?> 
doc.Declaration = null; 
doc.Save(Console.Out); // No declaration... 

:たとえば

public void SerializeToStream(Stream stream) 
{ 
    var xml = // Linq to xml code here 
    xml.Declaration = null; 
    xml.Save(stream); 
} 
+0

' xml.Declaration = null'を取得できませんでした'XDocument'を保存したり書き込んだりするときに書かれているように見えましたが、作者を洗い流すことは、私の元の質問のために働いていました。 – KallDrexx

+0

@KallDrexx:LINQ to XMLコードについて何も表示していないので、コメントするのは難しいです...問題を示す短くて完全なプログラムを2番目の質問として投稿できるのであれば、好き。 –

+0

開かれたhttp:// stackoverflow。com/questions/8926784/why-is-my-x-document-saving-the-declaration-do-do-do-want-it-toは動作していない例を示します。 – KallDrexx

2

私はあなたのStreamWriterを閉じていないからだと賭けるだろう。フラッシングも同様に機能するだろう。

これを使用ブロックで囲むことで、両方の面倒を見ることができます。

... 
    using (var writer = new StreamWriter(stream)) 
    { 
     writer.Write(xml.ToString()); 
    } 
... 

(@Tigranから)注意:using:これは、パラメータのようなストリームを受け付ける関数に良い選択ではないかもしれストリームオブジェクトに影響します。

+3

'using':' stream'オブジェクトにも影響します。これはパラメータのように 'stream'を受け入れる関数では良い選択ではありません。 – Tigran

+0

ストリームを閉じたくないので、このメソッドの実行後にストリームにアクセスできなくなります – KallDrexx

1

一般的に、IDisposableインターフェイスを実装するクラスを使用している場合はいつでも、それをusingブロックに囲む必要があります。これにより、オブジェクトがスコープから外れてリソースが解放される前に.Close()メソッドが呼び出されます。また、最後に.Flush()がなければ、内容が必ず書き出されるとは限りません。

http://msdn.microsoft.com/en-us/library/yh598w02.aspx

using (var writer = new StreamWriter(stream)) 
{ 
    writer.Write(xml.ToString()); 
    writer.Flush(); 
    // writer.Close() can be called here, but is automatically called at the end of the using block 
} 
関連する問題