如何限制MemoryStream长度?

时间:2012-07-27 00:55:51

标签: c# .net

我需要将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方法(其他任何东西?)。

有没有更简单或更好的方法来做到这一点?我错过了任何现有的构造函数或属性吗?

3 个答案:

答案 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()。