2013-06-06 66 views
2

爲什麼在反序列化過程中從對象的類中移除變量不會拋出異常?序列化中的「不兼容」變化意味着什麼? 我也改變了從非靜態類到靜態類的領域,它根據Java Specifications爲什麼在反序列化過程中從對象的類中移除變量不會拋出異常?

是不兼容的。

+0

您嘗試序列化具有實例成員和嘗試與具有靜態成員的類定義反序列化對象? –

+0

是的。這就是我所做的。 –

+0

在反序列化過程中,我也刪除了一個沒有拋出異常的字段。 注意:我已經在我的班級中明確提到了一個串行版本UID。 –

回答

3

爲什麼在反序列化過程中從對象的類中移除變量不會引發Exception?

因爲它不應該。見Object Versioning Specification, #5.6.1

「刪除字段 - 如果某個字段在一個類中刪除,寫入的數據流將不包含它的值當流由先前的課堂上閱讀,字段的值將被設置到默認值,因爲流中沒有可用的值,但是這個默認值可能會損害早期版本履行合同的能力。「

「更改非靜態字段,靜態或者非瞬態場瞬態 - 當默認序列化依賴,這種變化就相當於從類中刪除一個字段此版本的類。將不會將該數據寫入流中,因此它不會被早期版本的類讀取,因爲在刪除字段時,早期版本的字段將被初始化爲默認值,這會導致類以意想不到的方式失敗。「

什麼都沒有引發異常。

+0

該位僅描述了相反的情況。 – LtWorf

+0

「如果某個字段在類中被刪除,則寫入的流將不包含其值。」怎麼樣???如果我爲某個對象的實例分配了一個值然後對其進行序列化,那麼保存的對象應該具有該值。 之後,如果我從原始類中刪除該實例,則在反序列化過程中,JVM應該嘗試查找原始字段(它找不到),並因此拋出一些異常。 注意:當我更改實例的類型時,它會引發InvalidClassException。 –

+0

如果流中的值不對應於相同類型的非靜態非瞬態字段,則不會將其存儲在任何地方。規範中的任何地方都沒有措辭表明會拋出異常。 – EJP

1
  • 我在RPC調用中遇到了這樣的疑問,我好像找到了答案。
  • 我在服務器端中添加了兩個字段並更改了類中的一個字段類型,然後客戶端調用返回舊版本類的方法。首先,我得到了無與倫比的字段類型的例外,所以我解決了這個問題,但是離開了添加的字段,它運行良好,它讓我困惑。
  • 然後我來到這裏,我haved閱讀specification
    • 5.6.1兼容的改變 - 刪除字段
    • 5.6.2兼容的改變 - 添加字段
    • 他們談論同樣的事情 - 序列化字節碼不包含反序列化對象的字段,而我們的編碼是序列化字節碼包含一些文件,但反序列化對象不包含。
  • 據我瞭解
    • 如果考慮設計的,這樣的反序列化功能尤其在RPC調用非常有用的,系列化的功能應該包含它。
    • 深入研究原理,反序列化實例化客戶端類(舊版本)的對象並設置其字段的值(probabaly使用反射從序列化的字節代碼獲取字段值),冗餘字段序列化的字節碼默默無聲地訪問。
相關問題