2017-02-25 72 views
1

我有一個實現可串行化接口的類。我試圖反序列化一個對象,該對象被另一個應用程序序列化並存儲。通過其他應用程序存儲的目的是通過類似下面一個類創建 -反序列化沒有serialversionuid的類

// does not have serialversionuid defined. 
public Class Pet implements Serializable { 
    private count;  
    private date; 

    // getters & setters 
} 

我在我的應用程序定義的同級。我也沒有定義serialversionuid。當我嘗試反序列化這個對象,我看到類似這樣的錯誤 - 在解java.io.InvalidClassException發生

IO錯誤: 局部類不兼容:流classdesc的serialVersionUID = -3565652537049376317,本地類的serialVersionUID = -4242367052120288379

我無法控制序列化和存儲數據的類。有沒有辦法讓我改變我的類,以便它可以反序列化對象?

+1

我相信這些類可能會有所不同,您是否有權查看正在使用的類是否具有相同的結構? –

+0

謝謝@EduardoDennis。你是對的。還有兩種方法。 –

回答

3

作爲每第4.6節中this說明書中,如果一個序列化的類不指定serialVersionUID,JVM選擇一個在其自己的基於類的細節。然而,它選擇的算法(在上面的鏈接中描述)對類的細節非常敏感。此外,它也可能依賴於編譯器實現,因爲該算法直接處理反映類定義的字節流。

在你的情況,因爲你能解組過程中無效的類版本錯誤,這意味着以下兩件事情之一:

  1. 你的班,雖然你覺得是非常接近由其他使用該類應用程序,仍然略有不同。再次檢查算法。它對課程細節高度敏感。
  2. 由另一個應用程序序列化的對象是由不同編譯器生成的類定義創建的。

爲了讓您能夠反序列化該對象,您必須檢查以上兩種可能性並採取措施消除差異。

+0

謝謝@VHS。我看到我的班級有兩個額外的方法。 –

1

這不是問題。 serialVersionUID不匹配,因爲類是不同的。

+0

謝謝@Eduardo Dennis –

+0

不客氣! –