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 是从内存流中获取数据的两种正确方法之一(另一种是 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 回答