2015-04-23 40 views
1

序列化工具(即hessian)如何使用相同的serialVersionUID反序列化一個不同版本的類?在大多數情況下,它可以跳過那些未知(未在類加載器中找到)字段並保持兼容。但是最後一次,我嘗試追加一個新的字段Map<String, Object>,將一些未知對象放入地圖中,然後投擲了一個ClassNotFoundException序列化工具在反序列化過程中如何跳過未知字段?

  • 爲什麼不能像其他人一樣跳過地圖?
  • 這是一個與工具的實現或序列化機制相關的問題嗎?
+0

我再試一次,發現hessian將未知類型轉換爲'Hashmap'而不會拋出異常。但對於'Class '實例,'Class'是一個衆所周知的類型,所以它開始轉換並拋出'ClassNotFoundException',因爲'T'是未知的。 – Anderson

回答

1

這取決於工具本身。 serialVersionUID旨在供Java內置序列化程序(ObjectOutputStream)使用,該程序可以通過閱讀Hessian源文件來得到最佳的結果,而不會被Hessian使用。

對於黑森州具體而言,我可以找到其中提到這種變化的最好來源是this email

至少在黑森州,最好考慮版本作爲改變的一組 類型,可以被處理。

具體來說,Hessian可以管理以下種類的更改:1) 如果您添加或刪除一個字段,那麼不理解 字段的一方會忽略它。 2)一些字段類型的變化是可能的,如果 Hessian可以轉換(例如int變長)3)在映射(bean)類型上有一些靈活性 ,這取決於Hessian有多少信息 (這是偏好具體類型的原因)

所以,如果發送者發送了一個非類型映射{「field1」,10}而目標 被稱爲MyValue {int field1; },那麼Hessian可以映射 字段。

但它不能管理像:1)字段名稱更改(將刪除數據 )。 2)類名更改,其中目標爲 未定義,如Object field1。如果您發送MyValue2作爲新的 field1,當以前的版本是MyValue1時,Hessian不能讓 自動轉換。 (但是,與上面的#3一樣,「MyValue2字段1」 將給予足夠的信息來翻譯。)3)類 分裂,例如,創建一個子類並將其中的某些字段推送到其中。
4)映射到列表或列表以映射更改。

基本上,我不認爲Hessian打算在地圖中支持未知類型。

+0

非常感謝!但答案沒有提到爲什麼它不能跳過'Map'字段,因爲它匹配情況1)? – Anderson

+0

地圖中的項目不是Java中的字段。案例一特別談論「類型」的實例。 Hessian中的「類型」是Java中的類。因此,案例1只適用於未知領域。 Java中的HashMap是Hessian術語中的「無類型映射」。 – Pace

相關問題