2012-07-10 19 views
2

我想序列化一個對象緩存到磁盤,以便它可以在下次加載程序時加載。 正在保存的類的功能之一是它包含對其他對象的引用。 例如: 我有一個圖像類的列表,存儲遠程URL,本地文件路徑,如果它被下載等....我然後綁定可見性下載和源到本地文件路徑。 其他對象具有對此圖像的引用,因此當圖像下載時,它會更新一次,並且所有綁定都將更新指向它的所有項目。如何序列化一個.NET類到磁盤

作爲一個快速解決方案,我實現了一個二進制格式化程序,所有工作都正常。我的所有列表都被序列化到磁盤上,當我重新加載它們時,所有引用都保留下來(IE 1圖像對象被創建,並且使用它的所有內容都有一個引用,而不是反序列化,每次它出現時創建一個Image的新實例)

My問題是我應該用什麼樣的Serialier存儲到磁盤,同時不會破壞我的引用?我讀過BinaryFormatter對於序列化到磁盤並希望它在不同版本中工作是一個糟糕的選擇。儘管到目前爲止我還沒有遇到任何問題,但我不想在一年中遇到問題,並迫使我的所有用戶重新獲得所有緩存的元數據。

我不是100%確定所有不同的序列化程序如何工作,但我認爲如果我要使用XML,可能需要編寫某種類型的轉換程序。如果有幫助,我的所有圖像對象都有一個GUID分配給它們,所以我對每個對象都有獨特的東西。

更新:我剛剛發現了以下問題看起來類似Maintain object references through Serialize/Deserialize 誰能告訴我,如果DataContractSerializer的是在不同版本的applciation Vs的BinaryFormatter的的缺點的長期系列化存儲一個好的選擇嗎?

+0

看看[Redis持久性](http://redis.io/topics/persistence) – oleksii 2012-07-10 10:30:34

+0

@oleksii你意識到這與對象序列化完全無關,對吧? – 2012-07-10 11:32:26

+0

@MarcGravell沒有抱歉,我沒有意識到這一點。我發表了評論,因爲(我相信你比我更瞭解)redis是一個分佈式緩存提供者,它具有將數據保存到驅動器的內置功能。如果這個功能已經在行業解決方案中實現,爲什麼要重新發明輪子?我沒有把它作爲一個答案,因爲我意識到它可能不是簡單的(或期望的)在redis上帶來新的依賴。如果我錯了,請糾正我。 – oleksii 2012-07-10 11:57:41

回答

0

無需任何轉換器之類的東西,只是檢查了這一點:

http://www.switchonthecode.com/tutorials/csharp-tutorial-xml-serialization

+3

該文章指出「有一點要記住,基本的XML序列化不會保持引用。」 「現在我有一個包含兩個完全相同的電影引用的列表,當我序列化和反序列化這個列表時,它將被轉換爲兩個單獨的電影對象實例 - 它們只會有相同的信息。 XMLSerializer也不支持循環引用,如果你需要這種靈活性,你應該考慮二進制序列化。「所以這似乎並不能滿足要求。 – Oli 2012-07-10 10:21:45

+0

啊,錯過了那部分..謝謝! :-) – 2012-07-10 10:23:32

+0

那麼,你的文章已經幫助我尋找什麼,我想我已經找到了答案,所以仍然有用。 – Oli 2012-07-10 10:30:16

-1

MongoDB的可能是有用的。見MongoDB for C# 或其他類型的數據庫:DB4Object

,似乎是有用的SQLite。使用blob作爲二進制存儲圖像。

+0

你知道我從這個Vs sql ce會得到什麼樣的性能 - 我使用的是sql ce,但是對於我的需求來說這很慢,這就是爲什麼我需要找到解決問題的另一種方法。 – Oli 2012-07-10 10:26:01

+0

您可以看到更多解決方案,如[db4object](http://www.db4o.com/s/csharpdb.aspx)。但似乎SQLite在你的問題上有很好的表現。 – Ria 2012-07-10 10:31:33

-1

SqLite可能對它有幫助,它易於使用。

+0

如何?請提供一些更詳細的答案。 – tsells 2012-07-10 15:13:47

相關問題