3

我正在将一个对象序列化为byte[]using MemoryStream

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

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

4

2 回答 2

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();
}
于 2012-09-06T22:08:27.063 回答
4

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

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

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

于 2012-09-06T22:12:38.247 回答