2013-03-26 67 views
11

如果我想序列化一個對象,我必須使用[Serializable]屬性,並且所有成員變量都將寫入該文件。我不知道如何進行版本控制,例如如果我添加一個新的成員變量(重命名一個變量或只是刪除一個變量),然後我打開(反序列化)該文件如何確定對象/文件版本,以便我可以正確設置新成員或進行某種遷移?我怎樣才能確定變量是否在加載過程中被初始化(被解串器忽略)。C#中的序列化和對象版本控制

我知道有版本容忍的方法,我可以用[OptionalField(VersionAdded = 1)]屬性標記變量。如果我打開一箇舊文件,框架將忽略這個可選的(新變量),它將只是零/空。但是,我又如何確定變量是通過加載進行初始化還是被忽略。

我可以將類/對象版本號寫入流中。使用ISerializable的方法並在constructor(SerializationInfo oInfo, StreamingContext context)方法中讀取此版本號。這將準確告訴我流中的類版本是什麼。

但是我期望C#中的流式框架已經實現了這種類型的版本控制。我嘗試從SerializationInfo獲取Assembly版本,但它始終設置爲當前版本,而不是保存對象時使用的版本。

什麼是首選方法?我發現了很多在網絡上的文章,但我無法找到這裏面解決的版本一個很好的解決方案......

任何幫助表示讚賞 謝謝, 深淵,如果有些什麼

回答

2

原諒我寫得太明顯了,

首先請!你必須停止思考你在序列化一個對象...... 這只是不正確的,因爲你的對象的一部分方法沒有被持久化。 你是堅持信息 - 所以..只有數據。

.NET序列化還會序列化包含程序集名稱及其版本的對象的類型名稱,所以當您反序列化時 - 它將持久化程序集信息與將用信息表現的類型進行比較 - 如果它們不是同樣它會返回一個異常。

除了版本控制問題 - 並非所有的東西都可以很容易地進行序列化。嘗試序列化一個System.Drawing.Color類型,您將開始理解.NET序列化的過分簡化機制的問題。

除非你打算序列化一些非常簡單的東西,它沒有計劃進化,我不會使用.NET提供的序列化機制。

重新回到你的問題,你可以在這裏閱讀關於版本控制的無知能力: http://msdn.microsoft.com/en-us/library/ms229752(v=vs.80).aspx它是爲BinaryFormatter提供的。

您還應該檢查XML序列化,它具有一些很好的功能,但最大的好處是您可以獲得一個人類可讀的XML,因此即使您的類型版本過於複雜,您的數據也不會丟失。

但最後,我建議您使用數據庫與實體框架來堅持您的數據或編寫自己的平面文件管理器..而EF對於大多數解決方案來說非常有用,有時您可能想要更輕鬆的東西來堅持簡單的事情。 (我的意思是,我不能再看到一個解決方案,其中.NET序列化可能是相關的。)

我希望這有助於,祝你好運。

+1

+1用於暗示使用不同於.NET序列化的方法。 – Theraot 2013-03-27 05:14:39