2015-05-14 33 views
4

我們有一個解決方案,我們將一個相當大/複雜的C#對象作爲二進制數據存儲在我們的數據庫中。我擔心的是,當對這個類進行更改時,我們會冒代碼更改後保存到數據庫的數據在反序列化時失敗的風險。爲了使二進制反序列化失敗,一個類/對象必須改變多少

下面是我們正在使用的序列化對象的代碼:

public static byte[] SerializeObject(object toBeSerialized) 
    { 
     var stream = new MemoryStream(); 
     var serializer = new BinaryFormatter(); 
     serializer.Serialize(stream, toBeSerialized); 
     stream.Position = 0; 
     return stream.ToArray(); 
    } 

這裏是我們的Deserialize方法:

public static T DeserializeObject<T>(byte[] toBeDeserialized) 
    { 
     using (var input = new MemoryStream(toBeDeserialized)) 
     { 
      var formatter = new BinaryFormatter(); 
      input.Seek(0, SeekOrigin.Begin); 
      return (T) formatter.Deserialize(input); 
     } 
    } 

我的問題是,什麼也改變/多少有爲了使舊對象的反序列化失敗而改變?

+1

將數據存儲爲斑點不是一個好主意。遠比版本更差,不可能查詢數據。你不妨將它們保存到二進制文件中。你想通過使用BLOB而不是表字段來解決什麼問題?爲什麼不創建適當的模式?爲什麼不使用稀疏列,xml字段或甚至用戶定義的類型(如Oracle中的類或SQL中的CLR類型)? –

+0

@PanagiotisKanavos - 我們很清楚,將數據存儲爲blob並不是理想的解決方案,但是考慮到這一特定需求的時間表,這是將用戶返回到應用程序的確切狀態的唯一方法,一次重大改革。我們不存儲訂單或任何我們需要以這種方式查詢的內容,這只是爲了讓用戶保存他們離開的地方。 – Ben

回答

3

總是要系列化版本寬容,在this文章,你可以找到一些建議,如何做到這一點

您也可以找到某些情況下,低於

  • 那個破序列化/反序列化

    當您刪除序列化字段時

  • 當您應用th如果該屬性未應用於先前版本中的字段,則NonSerializedAttribute屬性爲字段。

  • 當您更改序列化字段的名稱或類型時。

  • 添加新的序列化字段時,沒有OptionalFieldAttribute屬性。

  • 從字段(在先前版本中不可序列化)中刪除NonSerializedAttribute屬性時,沒有OptionalFieldAttribute屬性。

2

當嘗試反序列化數據時,對類的數據結構(屬性和字段)的任何更改都會導致您遇到問題。

我確實知道更改方法的定義不會導致問題,添加或刪除方法同樣很好。

編輯:我已經在我開發的類似系統上做了一點測試,我發現你可以添加新的屬性和字段,仍然反序列化舊對象。在我看來,唯一的問題是如果您刪除,重命名或更改現有字段和屬性的類型。

Related Question