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、Seek、Write 和 WriteByte 方法(还有其他方法吗?)。

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

4

3 回答 3

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

ms.WriteByte(10);

抛出NotSupportedException“内存流不可扩展”。

于 2012-07-27T01:58:13.830 回答
2

如果您的内存限制非常高,因此您不能(或不想)预先分配数组,您可以简单地将 MemoryStream 包装在自定义的基于 Stream 的类中,该类将在写入时进行长度检查。

请注意,如果您希望将大量数据写入 MemoryStream (80Kb+),您可能需要验证 MemoryStream 的内存使用模式和性能是否适合您的应用程序。

于 2012-07-27T02:16:51.287 回答
0

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

于 2012-07-27T13:40:11.093 回答