我需要在此代码中调用Seek
吗?
// Assume bytes = byte[] of some bytes
using (var memoryStream = new MemoryStream(bytes))
{
memoryStream.Seek(0, SeekOrigin.Begin);
return new BinaryFormatter().Deserialize(memoryStream);
}
答案 0 :(得分:2)
不,我们不需要刚刚创建的Seek
。
您需要Seek
或设置Position之前您是否已向流中写过内容。
即。常见问题是"如何使用一些序列化数据返回MemoryStream
" - 你需要将数据写入流而不是Seek
到流的开头,这样Read
将从头开始而不是写的最后一个位置(因此总是说没有什么可读的)。示例问题 - Can't create MemoryStream。
答案 1 :(得分:1)
不,你不必。为了证明这一点,您可以查看constructor code:
public MemoryStream(byte[] buffer, bool writable)
{
if (buffer == null) throw new ArgumentNullException("buffer", Environment.GetResourceString("ArgumentNull_Buffer"));
Contract.EndContractBlock();
_buffer = buffer;
_length = _capacity = buffer.Length;
_writable = writable;
_exposable = false;
_origin = 0;
_isOpen = true;
}
Seek
将_position
(在您的示例中为0)更改为未在构造函数中指定,因此在构造对象Position
时将具有默认long
价值0
。
但是如果你在流上执行进一步的操作可以在读取之前更改其Position
,那么这是一个不同的故事。