2012-07-27 87 views
0

我需要将Stream对象传递给将序列化一些数据到流中的API。我事先并不知道数据量,我也没有任何控制权。但是,我想限制流大小一定数量。当长度达到指定限制时,我可以让MemoryStream引发异常吗?事情是这样的:实现这一行为如何限制MemoryStream长度?

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,寻求,写和WriteByte方法(其他东西吗?)。

是否有任何容易或更好的方法来做到这一点?我是否缺少任何现有的构造函数或属性?

+0

什么是你调用API?它是不是托管? – 2012-07-27 01:00:49

+0

它被管理。另外,我们可以假设流所引发的异常将得到适当的处理。这只是我们项目的另一个内部部分,所以API的名称不会告诉你任何事情。从技术上讲,我们甚至可以改变API,以便它接受最大长度作为参数,但我真的很想避免这种情况。 – AnatoliB 2012-07-27 01:14:24

+0

你可以不喜欢新的MemoryStream(新字节[XXX])(http://msdn.microsoft.com/en-us/library/e55f3s5k.aspx)? – Bert 2012-07-27 01:46:15

回答

3
var ms = new MemoryStream(new byte[10]); 
for (byte i = 0; i <= 9; i++) 
    ms.WriteByte(i); // ok 

ms.WriteByte(10); 

抛出NotSupportedException,其中“Memory stream is not expandable”。

+0

谢谢,这看起来很简单,可以肯定在某些情况下工作。然而,就我而言,我希望大部分数据流只有几个字节长,并且偶尔会增长到几兆字节(我想放在那里的实际限制大约是10M)。最重要的是,这段代码将从多个线程同时调用,所以在我的情况下,预分配这些内存是不成问题的。 – AnatoliB 2012-07-27 18:35:43

2

如果你的内存限制是非常高的,所以你不能(或不愿)预分配你可以简单地包裹的MemoryStream定制基于流的类,将做写长度检查阵列。

请注意,如果你希望大量的数据被写入到的MemoryStream(80KB +),你可能需要验证,如果MemoryStream的内存使用模式和性能是您的应用程序可以接受的。

0

您提供的解决方案是最简单的。 您可以创建自己的从MemoryStream继承的流,并具有一个构造函数,它将所需的长度作为参数。然后你只需要在Write方法中实现一些额外的逻辑,然后调用base.Write/WriteByte()。