2012-07-27 158 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()。