0

一部のデータをストリームにシリアル化する API に Stream オブジェクトを渡す必要があります。データの量は事前にわかりませんし、そのコードを制御することもできません。ただし、ストリームサイズを特定の数に制限したいと考えています。その長さが指定された制限に達したときに、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

この動作を実現する 1 つの方法は、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

メモリ制限が非常に高く、配列を事前に割り当てることができない (または割り当てたくない) 場合は、書き込み時に長さチェックを行うカスタム Stream ベースのクラスで MemoryStream をラップするだけです。

大量のデータが MemoryStream (80Kb 以上) に書き込まれることが予想される場合は、MemoryStream のメモリ使用パターンとパフォーマンスがアプリケーションで許容できるかどうかを確認する必要があることに注意してください。

于 2012-07-27T02:16:51.287 に答える
0

あなたが提供した解決策は最も簡単です。MemoryStream から継承し、必要な長さをパラメーターとして受け取るコンストラクターを持つ独自のストリームを作成できます。次に、いくつかの追加ロジックを Write メソッドに実装し、その後 base.Write/WriteByte() を呼び出すだけで済みます。

于 2012-07-27T13:40:11.093 に答える