2012-01-25 31 views
0

我有一個表示用於建立對數據存儲的查詢搜索條件的一類。該類是可序列化的,允許將類實例保存到磁盤並重新加載,提供保存搜索以重新使用它們的業務級功能。二進制序列 - 改變序列化類的位置用序列文件

這裏的問題;我最近改變了可以序列化的類的位置。我沒有改變這個類的結構,我只是將它從一個項目(不再以原來的名稱存在)轉移到另一個項目中。在這樣做的時候,我意識到我只是打破了基於該類的文件的反序列​​化,因爲它存在於之前的位置。

如果可能的話,我需要能夠「轉換」這些文件。雖然這些文件是二進制格式的,但大部分文件都是純文本格式,包括現在無效的命名空間。然而,只是改變我看到的文件的文本就會破壞它,所以顯然我錯過了一些東西。

有沒有辦法更新該文件爲某種間歇過程中,或在新的類位置點串行的,所以文件可以反序列化?

回答

1

您可以創建具有每個命名空間中的序列化類的兩個副本的小程序。然後,您可以使用舊命名空間中的類從文件中讀取數據,併爲每個實例在複製所有字段的新命名空間中創建類的實例。然後您可以將新類序列化迴文件。

+0

這就是我想我必須要做的。我希望它不會來,但哦。如果我最終走這條路線,我想我會採取Marc的建議,並轉向基於文本的序列化方法,如DataContract。正如他所說,只要對象的形式(如序列化程序所看到的)與序列化文件相匹配,對象的位置並不重要。 – KeithS

+0

我最終這樣做,但序列化文件到XML;那些文件可以在新位置被相同的對象反序列化。 – KeithS

0

您可以通過使用TypeForwardedToAttribute解決這個問題,這樣,當系統會在組件,它未能找到類型,但它找到的屬性,在新的裝配再次樣子。請參閱MSDN的使用情況,但這適用於BinaryFormatter。

不過,我強烈建議轉向基於合同串,比如protobuf網。這不關心你重新定位,重命名等類型或成員。 BinaryFormatter是...多刺。

+0

不幸的是,正如我所提到的,舊的庫甚至不存在於解決方案中,所以我不能在舊的位置放置「轉發地址」。我希望有一種方法可以直接配置串行器,因此它可以在沒有查看舊地方的情況下進行轉發。我正在考慮轉換到XML序列化,所以如果這再次改變,我更有可能通過任何必要的更改直接更新文件。 – KeithS

+0

@KeithS要做到這一點,你可能可以使用自定義的活頁夾,但是......硬的東西。如果你可以使用舊的dll進行反序列化,那將更容易。 –