2011-11-16 88 views
36

在序列化期間,我們可以使用內存流或文件流。內存流和文件流的區別

這兩者之間的基本區別是什麼?記憶流是什麼意思?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Runtime.Serialization.Formatters.Binary; 

namespace Serilization 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      MemoryStream aStream = new MemoryStream(); 
      BinaryFormatter aBinaryFormat = new BinaryFormatter(); 
      aBinaryFormat.Serialize(aStream, person); 
      aStream.Close(); 
     } 
    } 
} 

回答

52

流是字節的表示。這兩個類都是根據定義抽象的Stream類派生的。

顧名思義,FileStream讀取和寫入文件,而MemoryStream讀取和寫入內存。所以它涉及流的存儲位置。

現在,它取決於你打算如何使用這兩個。例如:讓我們假設你想從數據庫中讀取二進制數據,你將進入MemoryStream。但是,如果您想要讀取系統中的文件,則需要使用FileStream。

MemoryStream的一個快速優勢是不需要在應用程序中創建臨時緩衝區和文件。

+5

由於對象已經在內存中,爲什麼我們要分配一個內存流進行serilization? – Raghav55

+0

由於內存流將對象作爲一系列字節進行操作,而不是其邏輯程序「含義」。 – Tudor

+0

@tudor:因爲我是.net的新手,你能解釋一下嗎? – Raghav55

6

最簡單的形式是,MemoryStream將數據寫入內存,而FileStream將數據寫入文件。

通常情況下,如果我需要一個流,我使用MemoryStream,但我不想要任何東西打到磁盤,並且在將文件寫入磁盤時使用FileStream。

5

文件流從文件讀取時,可以使用存儲器流讀取映射到計算機內部存儲器(RAM)中的數據。你基本上是從內存讀取/寫入字節流。

+0

這是一個更好的序列化大數據時?如果serilize數據很大並且可用內存很小。在這種情況下,當我們使用內存流時會發生什麼? – Raghav55

+1

如果您的數據超出可用內存,它將最終開始尋呼到磁盤。這很糟糕,因爲整個系統的性能會降低。在這種情況下,最好只是流式傳輸到一個文件。 – Tudor

2

內存流通過內存緩衝區處理數據。文件流處理磁盤上的文件。

2

在這個問題上有一段痛苦的經歷,這是我發現的。如果需要性能,則應將文件流的內容複製到內存流中。我必須處理144個文件的內容,每個文件528KB,並將結果呈現給用戶。它花了250秒aprox。 (!!!!)。當我只是將每個文件流的內容複製到一個內存流(CopyTo方法)而沒有任何改變時,時間降到了大約32秒。請注意,每次將一個流複製到另一個流時,該流都會附加到目標流的末尾,因此您可能需要在複製之前將其「倒回」。希望能幫助到你。

+7

痛苦的經歷?!?當然,操縱RAM中的文件將比操縱磁盤上的文件更快。你期望什麼? ;-) – tomfanning

0

在我看來,序列化對象在內存中幾乎沒有用處。當你想把它保存在磁盤上時,你需要序列化一個對象。通常,序列化是從保存的串行化對象(在磁盤上)到對象(在內存中)進行反序列化時,從對象(在內存中)到磁盤完成的。

所以,大多數時候,你想要序列化到磁盤,因此你使用文件流進行序列化。