我正在尝试使用ThirdParty库将一些数据写入MemoryStream,以便我可以将输出作为某些单元测试的一部分进行比较。不幸的是,第三方库在执行它Save()
方法时关闭了MemoryStream。
因此我有以下代码:
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。
答案 0 :(得分:2)
您可以尝试:
public class MyMemoryStream : MemoryStream
{
public bool CanDispose { get; set; }
public override void Close()
{
if (!CanDispose)
{
return;
}
base.Close();
}
}
在Stream类中,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;
}
答案 1 :(得分:0)
规避错误/行为:您可以将内存流复制到第二个实例,或者在调用ThirdPartyLibrary.Save之前将其写入某个临时文件。