我应该如何包装 MemoryStream 以访问写入它的数据,即使它关闭后也是如此

How should I wrap a MemoryStream to have access to the data that was written to it even after it is closed

我正在尝试使用第三方库将一些数据写入 MemoryStream,以便我可以将输出作为某些单元测试的一部分进行比较。不幸的是,第三方库在执行过程中关闭了 MemoryStream Save() 方法。

因此我有以下代码:

byte[] expected = LoadExpectedResult("Test1");
using (var memoryStream = new MemoryStream()) {
    ThirdPartyLibrary.Save(memoryStream);
    var result = memoryStream.ToArray();
    ConfirmBinaryBlobsAreSufficentlyEqual(expected, result);
}

不幸的是,memoryStream.ToArray() 函数似乎只返回最后加载到缓冲区中的最后 3398 个字节,因为它已作为保存过程的一部分被处理掉。

有什么我可以包装 MemoryStream 的东西,这样当数据写入它时,它会被读出或写入另一个内存流,这样当它被处理时我仍然可以访问数据。

更新

为了清楚起见,Save() 方法也进行了写出,因此在调用 MemoryStream 之前它是空的。我认为库的编写者希望您只传入 FileStreams。

为了规避 bug/behaviour:您可以将内存流复制到第二个实例,或者在调用 ThirdPartyLibrary.Save.

之前将其写入某个临时文件

您可以试试:

public class MyMemoryStream : MemoryStream
{
    public bool CanDispose { get; set; }

    public override void Close()
    {
        if (!CanDispose)
        {
            return;
        }

        base.Close();
    }
}

在流 class 中,Dispose() 调用 Close(),然后调用 Dispose(bool disposing)Close()virtual,所以我覆盖了它。

使用流后,设置CanDispose = true,然后让其正常处置。

byte[] expected = LoadExpectedResult("Test1");
using (var memoryStream = new MyMemoryStream()) {
    // implicitly memoryStream.CanDispose == false;
    ThirdPartyLibrary.Save(memoryStream);
    var result = memoryStream.ToArray();
    ConfirmBinaryBlobsAreSufficentlyEqual(expected, result);
    memoryStream.CanDispose = true;
}