2013-03-07 87 views
2

.NET框架中充滿了方法調用將返回一個Stream的示例,您可以根據需要隨時閱讀和實現該Stream。但是這是如何在封面下工作的?什麼支持流?如何實現返回Stream的方法?

假設我正在編寫一個解析器,它需要一些輸入並將一些數據解析爲預定義的格式。例如,如果我創建了一個MemoryStream,然後使用StreamWriter將我的內容寫入它,然後使該方法返回該流,則會遇到問題,因爲編寫器將在完成時關閉底層流,並且調用方將無法按預期閱讀。

這是如何管理的?是否存儲在對象中的流的內容直到需要(例如byte[]),然後當請求流的方法被調用時,它會在當時創建它,或者什麼?

+2

你指的是什麼魔法鏈接幫助? 'Stream GetAStream(){return new MemoryStream();}'工作。 – 2013-03-07 19:17:09

回答

5

流是字節序列的抽象,如文件,輸入/輸出設備,進程間通信管道或TCP/IP套接字。 Stream類及其派生類提供了這些不同類型的輸入和輸出的通用視圖,將程序員與操作系統和底層設備的特定細節隔離開來。 [MSDN所述]

,所以我想你使用.NET不同的格式,通過使用流使用序列,進行序列化需要定義需求

序列化是在轉換一個目的是字節的持久性存儲裝置的過程。反序列化過程將字節轉換爲對象,而不會丟失任何數據。序列化用於將值存儲在文件或數據庫中,通過網絡發送對象並將其轉換回原始對象格式。 .NET框架提供了一組用於簡化序列化過程的框架類庫(FCL)。在兩個不同應用程序之間發送數據非常有用。

.NET Framework支持二進制序列化和XML序列化格式。 XML序列化僅序列化公共字段。但是,二進制序列化將序列化所有私人和公共領域。序列化可以按照基本或自定義進行。基本序列化發生在一個類應用了SerializableAttribute屬性的時候。基本序列化不支持版本控制。自定義序列化類必須標記爲SerializableAttribute並實現ISerializable接口。用戶可以實現Binary和XML序列化格式的自定義序列化。 GetObjectData需要被自定義應用程序覆蓋。示例應用程序針對二進制和XML序列化使用自定義序列化。 .NET Framework支持與開發工具關聯的設計器序列化。 定製序列化

定製序列化是控制序列化和反序列化過程的過程。自定義序列化可以通過在序列化期間和之後運行自定義方法或通過實現ISerializable接口來實現。自定義序列化用於對序列化對象進行版本控制。如果序列化對象已更改對象狀態(在更高版本中添加了新文件),則使用自定義序列化獲取值而不丟失數據。由於缺少屬性,序列化對象的版本可能會失敗。

如果用戶想要在序列化期間和之後使用自定義方法,用戶應該使用OnDeserializedAttribute,OnDeserializingAttribute,OnSerializedAttribute和OnSerializingAttribute屬性應用自定義序列化支持,以便在序列化和反序列化期間自定義數據。 OptionalFieldAttribute屬性用於忽略用於反序列化的舊版本數據。格式化程序在反序列化過程中不會給出任何錯誤。它允許在序列化/反序列化之前和之後更新對象。

我想下面你
http://www.codeproject.com/Articles/422474/Serialization-using-different-formats-in-NET

2

該流可以由許多不同的東西支持。這就是來自Stream抽象基類的流的全部概念。

該流可以通過操作系統級文件流,內存,HTTP連接或其他任何可以滿足Stream合同的支持。

MemoryStream的情況下,後備存儲只是一塊內存。

StreamWriter的情況下,調用Dispose()將關閉基礎流。只要您仍想使用流,請確保您不要處置作者。另外,如果你想要寫之後重新訪問MemoryStream,確保並設置位置開始,如:

memStream.Seek(0, SeekOrigin.Begin); 
+0

IStream是一個COM接口類型。你不能分配一個MemoryStream給它......或者一個FileStream。 – 2013-03-07 19:28:40

+0

@MthetheWWatson:Do'h。更新了我的答案。 – 2013-03-07 22:27:37

1

的StreamWriter有一個重載的構造函數,你可以用它來指示寫不關閉流。

另外,Stream應該有一個.WriteBytes方法,它可以讓你完全避免一個StreamWriter。

相關問題