用缓冲区创建实例后需要MemoryStream吗?

时间:2014-03-16 17:15:30

标签: c# memorystream

我需要在此代码中调用Seek吗?

// Assume bytes = byte[] of some bytes
using (var memoryStream = new MemoryStream(bytes))
{
    memoryStream.Seek(0, SeekOrigin.Begin);
    return new BinaryFormatter().Deserialize(memoryStream);
}

2 个答案:

答案 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,那么这是一个不同的故事。