MemoryStream的byte []缓冲区可以变化吗?

时间:2012-09-06 22:06:04

标签: c# serialization memorystream base-class-library

我正在使用byte[]

将对象序列化为MemoryStream
byte[] serialized = new byte[1000];
using (MemoryStream stream = new MemoryStream(serialized))
    using (TextWriter textWriter = new StreamWriter(stream))
        serializer.Serialize(textWriter, stuffToSerialize);

有什么方法可以根据'serialized'的大小设置stuffToSerialize增长?

2 个答案:

答案 0 :(得分:8)

无参数构造函数new MemoryStream()使用一个。

然后序列化它,然后当你需要byte[]调用ToArray()时,它会创建一个实际使用的缓冲区长度的副本(内部缓冲区通常会有任何增长的空间)点,这通常是不可取的,ToArray()为您提供您真正关心的内容。)

在以下代码的末尾,如果能够预测正确的大小,它将与您的代码具有相同的效果:

byte[] serialized;
using (MemoryStream stream = new MemoryStream())
{
  using (TextWriter textWriter = new StreamWriter(stream))
  {
    serializer.Serialize(textWriter, stuffToSerialize);
  }
  // Note: you can even call stream.Close here is you are paranoid enough
  // - ToArray/GetBuffer work on disposed MemoryStream objects.
  serialized = stream.ToArray();
}

答案 1 :(得分:3)

如果使用提供现有byte[]缓冲区的构造函数,则为no,因为分配的数组具有固定大小。

默认构造函数以及不接受byte[]参数的任何其他构造函数将根据需要用较大的构造函数替换现有缓冲区。请注意,如果使用GetBuffer(),这可能会使事情变得复杂:如果在调用GetBuffer()之后附加了流,则可以替换支持流的实际byte[]。另请注意,调用GetBuffer()时,流数据可能不会从返回数组的索引0开始!

要取回内容,请使用ToArray()将其作为字节数组,或WriteTo(Stream)MemoryStream的内容转储到另一个流中。