C# 我应该如何包装MemoryStream以访问写入它的数据(即使在它关闭之后)
我正在尝试使用第三方库将一些数据写入MemoryStream,以便在一些单元测试中比较输出。不幸的是,第三方库在执行MemoryStreamC# 我应该如何包装MemoryStream以访问写入它的数据(即使在它关闭之后),c#,stream,C#,Stream,我正在尝试使用第三方库将一些数据写入MemoryStream,以便在一些单元测试中比较输出。不幸的是,第三方库在执行MemoryStreamSave()方法时关闭了它 因此,我有以下代码: byte[] expected = LoadExpectedResult("Test1"); using (var memoryStream = new MemoryStream()) { ThirdPartyLibrary.Save(memoryStream); var result = m
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是空的。我认为库的编写者希望您只传入文件流。为了避免错误/行为:您可以将memorystream复制到第二个实例,或者在调用ThirdPartyLibrary.Save之前将其写入某个临时文件。您可以尝试:
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()
是虚拟的,所以我重写了它
使用流后,设置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;
}
在调用第三方库之前,您不能执行ToArray()吗?这似乎是第三方库中的一个错误。您可以将某些内容保存到流中,但关闭或处理它实际上不应该是“保存函数”业务。不幸的是,在使用
.save()
方法之前,内存流中没有要写入的数据。在.Save()
方法中,它同时执行写入和数据调用。@JamesRobinson该方法是否接受MemoryStream或任何流类型?它将接受任何流Hi Josef我不知道这会起作用,因为在执行Save方法之前MemoryStream是空的。我明白了。因此,也许您可以测试/断言结果,第三方Library.Save将内存流保存到哪里?