【问题标题】:MemoryStream Seek, Needed After Instance Creation With Buffer?MemoryStream Seek,在使用缓冲区创建实例后需要?
【发布时间】:2014-03-16 17:15:30
【问题描述】:

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

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

【问题讨论】:

  • 您是否尝试删除它并查看会发生什么?似乎是您可以自己回答的问题。
  • 它似乎可以工作,但我想知道是否存在使用上述代码明确需要Seek 的极端情况。
  • 因为你已经创建了一个新的MemoryStream 对象,它的位置已经是流的开始。仅当您需要稍后再次备份时才需要 Seek

标签: c# memorystream


【解决方案1】:

不,不需要在刚刚创建的流上Seek

您需要Seek 或设置Position 是您之前向流中写入的内容。

即常见问题是“如何使用一些序列化数据返回MemoryStream” - 您需要将数据写入流,然后将Seek 写入流的开头,因此Read 将从开头而不是最后一个位置开始写(因此总是说没有什么可读的了)。示例问题 - Can't create MemoryStream

【讨论】:

    【解决方案2】:

    不,您不必这样做。为了证明这一点,您可以查看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 将具有默认的 long0

    不过,如果您在读取流之前对流执行进一步的操作,可能会更改其 Position,那就另当别论了。

    【讨论】:

    • 两个答案都是正确的,但这个答案对我的问题来说是最有用的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-18
    • 2022-08-23
    • 2013-11-06
    • 2023-03-16
    • 2014-04-04
    相关资源
    最近更新 更多