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);
有没有什么方法可以根据stuffToSerialize
的大小设置'serialized'
来增长?
无参数构造函数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[]
缓冲区的构造函数,则为no,因为一旦分配的数组具有固定大小。
默认构造函数以及不接受byte[]
参数的任何其他构造函数将根据需要用较大的构造函数替换现有缓冲区。 请注意,如果使用GetBuffer()
,这可能会使事情变得复杂:如果在调用GetBuffer()之后附加了流,则可以替换支持流的实际byte[]
。 另请注意,在调用GetBuffer()
,流数据可能不会从返回数组的索引0开始!
要获取内容,请使用ToArray()
将它们作为字节数组,或使用WriteTo(Stream)
将MemoryStream
的内容倒入另一个流中。