2012-09-06 84 views
2

我採用序列MemoryStream對象到byte[]MemoryStream的byte []緩衝區的大小是否可變?

byte[] serialized = new byte[1000]; 
using (MemoryStream stream = new MemoryStream(serialized)) 
    using (TextWriter textWriter = new StreamWriter(stream)) 
     serializer.Serialize(textWriter, stuffToSerialize); 

有什麼辦法,我可以設置'serialized'根據stuffToSerialize的規模發展壯大?

回答

7

無參數構造函數new MemoryStream()使用一個。

然後連載了進去,然後當你需要byte[]呼叫ToArray()它創建任何緩衝區的長度實際使用的副本(內部緩衝區通常會在任何時候一些成長的空間,而這通常不理想,ToArray()給你你真正關心的)。

下面的代碼的結束,這將有同樣的效果作爲你的代碼,是你能預測正確的大小:

byte[] serialized; 
using (MemoryStream stream = new MemoryStream()) 
{ 
    using (TextWriter textWriter = new StreamWriter(stream)) 
    { 
    serializer.Serialize(textWriter, stuffToSerialize); 
    } 
    // Note: you can even call stream.Close here is you are paranoid enough 
    // - ToArray/GetBuffer work on disposed MemoryStream objects. 
    serialized = stream.ToArray(); 
} 
+0

我不使用它作爲另一個變量的緩衝區 - 我將序列化的對象存儲在其中。 – ispiro

+0

這也可以處理。回答編輯。 –

+0

謝謝。我正在嘗試'textWriter.ToArray()'。 – ispiro

3

如果您使用的是需要提供的現有byte[]緩衝構造,那麼不會,因爲一次分配的數組具有固定的大小。

缺省構造函數以及不接受參數byte[]的任何其他構造函數將根據需要用較大的參數替換現有的緩衝區。請注意,如果您使用GetBuffer(),這可能會使事情變得複雜:如果在調用GetBuffer()後將流附加到流,則支持流的實際byte[]可能會被替換。還請注意,在調用GetBuffer()時,流數據可能不會從返回數組的索引0開始!

要取出內容,請使用ToArray()將它們作爲字節數組,或WriteTo(Stream)MemoryStream的內容倒入另一個流中。

+0

但是,如何從「textWriter」中獲取字節? – ispiro

+0

@ispiro [ToArray](http://msdn.microsoft.com/en-us/library/system.io.memorystream.toarray.aspx)方法爲您提供一個字節數組,或者[WriteTo](http:///msdn.microsoft.com/en-us/library/system.io.memorystream.writeto.aspx)方法將內容倒入另一個流中。 –

+0

謝謝。我正在嘗試'textWriter.ToArray()'。 – ispiro