我需要将Stream对象传递给API,该API将一些数据序列化到流中。我事先并不知道数据量,而且我对该代码没有任何控制权。但是,我想将流大小限制为一定数量。我可以让MemoryStream在其Length达到指定限制时抛出异常吗?像这样:
var stream = new MemoryStream(...); // I want to specify MaxLength=10 somehow...
for (byte i = 0; i < 9; i++)
stream.WriteByte(i); // ok
stream.WriteByte(10); // this should throw
实现此行为的一种方法是覆盖SetLength,Seek,Write和WriteByte方法(其他任何东西?)。
有没有更简单或更好的方法来做到这一点?我错过了任何现有的构造函数或属性吗?
答案 0 :(得分:3)
var ms = new MemoryStream(new byte[10]);
for (byte i = 0; i <= 9; i++)
ms.WriteByte(i); // ok
ms.WriteByte(10);
抛出NotSupportedException
,“内存流不可扩展。”
答案 1 :(得分:2)
如果你的内存限制非常高,所以你不能(或者不想)预先分配数组,你可以简单地将MemoryStream包装在自定义的基于Stream的类中,该类将在写入时进行长度检查。
请注意,如果您希望将大量数据写入MemoryStream(80Kb +),您可能需要验证MemoryStream的内存使用模式和性能是否适合您的应用程序。
答案 2 :(得分:0)
您提供的解决方案是最简单的。 您可以创建自己的流,该流继承自MemoryStream,并具有一个构造函数,该构造函数将所需的长度作为参数。然后你只需要在Write方法中实现一些额外的逻辑,然后调用base.Write / WriteByte()。