我应该如何包装 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;
}
我正在尝试使用第三方库将一些数据写入 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;
}