MemoryStream的byte[]缓冲区是否可以具有可变大小



我正在使用MemoryStream:将对象序列化为byte[]

byte[] serialized = new byte[1000];
using (MemoryStream stream = new MemoryStream(serialized))
    using (TextWriter textWriter = new StreamWriter(stream))
        serializer.Serialize(textWriter, stuffToSerialize);

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

无参数构造函数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();
}

如果您使用的构造函数接受所提供的现有byte[]缓冲区,则不使用,因为数组一旦分配就有固定的大小。

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

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

最新更新