3

ストリームに書き込むライブラリメソッドを呼び出しています。しかし、私は文字列に書きたいです。これは可能ですか?(私は呼び出しているメソッドのソースコードを制御していないので、それを変更することはできません。)

実験して、私はこのようなことを試みました:

iCalendarSerializer serializer = new iCalendarSerializer();
MemoryStream stream = new MemoryStream();
serializer.Serialize(new iCalendar(), stream, System.Text.Encoding.UTF8);
byte[] buff = new byte[stream.Length];
stream.Read(buff, 0, (int)stream.Length);

しかし、最後の行で、閉じたストリームにアクセスできないというエラーが発生します。どうやら、Serialize()メソッドは、実行が完了するとストリームを閉じます。

他に選択肢はありますか?

4

3 に答える 3

2

どうbyte[] buff = stream.ToArray()ですか?

于 2012-07-12T23:29:59.560 に答える
1

ToArrayは、メモリストリームからデータを取得する2つの正しい方法の1つです(もう1つはGetBufferとLengthです)。ストリームのデータに合わせたサイズのバイト配列が必要なようですが、ToArrayはまさにそれを実行します。

破棄されたストリームでこれらの3つのメソッドを呼び出すことは設計上安全であるためusing(stream)、ストリームにデータを書き込むコードを安全にラップアラウンドできることに注意してください。

あなたの場合、ストリームはシリアル化コード(.Serialize)によって破棄されるように見えます。

iCalendarSerializer serializer = new iCalendarSerializer();
MemoryStream stream = new MemoryStream();
using(stream)
{
  serializer.Serialize(new iCalendar(), stream, System.Text.Encoding.UTF8);
}
byte[] buff = stream.ToArray();
于 2012-07-12T23:30:52.727 に答える
0

あなたの例では、読み取りが行われる前にストリームの位置を変更する必要があります。

stream.Position = 0;
stream.Read(buff, 0, (int)stream.Length);

ストリームを文字列に書き込むには、StreamReader.ReadToEnd()メソッドを使用できます。

var reader = new StreamReader(stream);
var text = reader.ReadToEnd();
于 2012-07-12T23:28:40.217 に答える