序列化工具(即hessian)如何使用相同的serialVersionUID
反序列化一個不同版本的類?在大多數情況下,它可以跳過那些未知(未在類加載器中找到)字段並保持兼容。但是最後一次,我嘗試追加一個新的字段Map<String, Object>
,將一些未知對象放入地圖中,然後投擲了一個ClassNotFoundException
。序列化工具在反序列化過程中如何跳過未知字段?
- 爲什麼不能像其他人一樣跳過地圖?
- 這是一個與工具的實現或序列化機制相關的問題嗎?
序列化工具(即hessian)如何使用相同的serialVersionUID
反序列化一個不同版本的類?在大多數情況下,它可以跳過那些未知(未在類加載器中找到)字段並保持兼容。但是最後一次,我嘗試追加一個新的字段Map<String, Object>
,將一些未知對象放入地圖中,然後投擲了一個ClassNotFoundException
。序列化工具在反序列化過程中如何跳過未知字段?
這取決於工具本身。 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打算在地圖中支持未知類型。
我再試一次,發現hessian將未知類型轉換爲'Hashmap'而不會拋出異常。但對於'Class'實例,'Class'是一個衆所周知的類型,所以它開始轉換並拋出'ClassNotFoundException',因爲'T'是未知的。 –
Anderson