簡體   English   中英

如何將數據從.NET保存到磁盤?

[英]How do you persist data to disk from .NET?

我有各種豐富的數據結構(主要是樹),我希望將其保存到磁盤,這意味着我不僅要將它們寫入磁盤,而且還要保證數據已經完全寫入並且能夠在斷電后繼續存在。

其他人似乎設計了將平面數據庫表中的豐富數據結構編碼為從父節點到子節點的查找表的方法。 這有助於針對數據運行SQL查詢,但我不需要:我只想保存並加載我的樹。

顯而易見的解決方案是將所有內容作為blob存儲在數據庫中:單個條目可能包含長字符串。 這是濫用數據庫還是推薦的做法? 另一種解決方案可能是使用XML數據庫? 我應該考慮使用數據庫的替代方案嗎?

最后,我是用F#做的,所以從.NET繼承數據的交鑰匙解決方案是理想的......

編輯:請注意格式化(例如序列化)是無關緊要的,因為我可以使用F#輕松轉換格式。 這是關於確認寫入已經完成到非易失性存儲(即磁盤盤片)並且寫入數據的任何部分仍然保留在易失性存儲(例如RAM高速緩存)中,以便我可以繼續保持這種知識的安全性(例如,通過從磁盤中刪除舊版本的數據)。

.NET的FileStream類的一些構造函數采用FileOptions類型的參數。 FileOptions的一個值是WriteThrough ,它“表示系統應該通過任何中間緩存寫入並直接轉到磁盤”。

這應該確保在您的寫入操作(到新文件)返回時,數據被提交到磁盤,您可以安全地刪除舊文件。

這可以通過序列化完成。

.NET Framework包含許多用於將數據序列化到磁盤的內置選項,包括使用二進制或基於XML的格式。 MSDN文檔中提供了詳細的方法文章

為此,您將需要一個允許您參與Transaction (通常情況下,您將使用TransactionScope

如果包含一個數據庫,大多數數據庫都將參與Transaction 磁盤操作也可以由Transaction管理,但您必須執行一些特定的工作才能在.NET中使用它

另請注意,這僅適用於Windows Vista及更高版本。

如果您使用數據庫路由,則可以將樹的序列化內容存儲在blob(或文本中,具體取決於序列化機制)。

注意,您還可以使用SQL Server中的FILESTREAM功能(我相信2008及以上版本)將文件存儲在文件系統中, 獲得SQL Server中事務的好處。

我之前沒有使用過來自F#的db4o ,但它只是以事務方式將CLR對象圖持久化到磁盤上。 如果它適用於記錄和受歧視的工會,它可能適合您。

編輯:我剛剛測試了db4o 8.0(.NET 4版本),它似乎可以很好地處理記錄類型和區分聯合層次結構。

嘗試使用XMLSerializer(System.Xml.Serialization)。

http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.aspx

它可以根據屬性自動保存復雜的數據結構,如果您願意,可以使用屬性來控制輸出:

http://msdn.microsoft.com/en-us/library/83y7df3e.aspx

稍微OT,因為OP不想要XML,但看到其他人提到XML格式化程序......如果你想要文本持久性,SoapFormatter處理默認XML格式化程序沒有的情況(周期/對象圖) - 它的XML不是像XMLFormatter一樣可讀,但它比二進制更可讀:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM