2017-05-07 68 views
1

enter image description here我是相當新的Java和我有一個類ProductsSerializable。我不知道我做什麼,但我的程序停止工作,並給了我這個錯誤:serialversionUID不匹配

Exception in thread "main" java.io.InvalidClassException: cockeb.Product;  local class incompatible: stream classdesc serialVersionUID = 1288455942608122525, local class serialVersionUID = -558553967080513790 
at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:616) 
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1829) 
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1713) 
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1986) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1535) 
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:422) 
at java.util.ArrayList.readObject(ArrayList.java:791) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:498) 
at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1058) 
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2122) 
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2013) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1535) 
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:422 

我搜索周圍,找到方法來聲明它,但這並不能幫助我現在。我甚至開了一個新項目,只是複製非工作項目中每個類的文本並粘貼到新項目中,但我仍然遇到同樣的錯誤。我在我所有的項目中都遇到了這個錯誤(他們使用相同的Serializable類)我需要知道我做了什麼,以便它不會再發生,以及我可以如何解決這個問題。我已經嘗試聲明serialversionUID,但那沒有奏效。

產品類別

package cockeb; 

import java.io.Serializable; 
import java.math.BigDecimal; 

public class Product implements Comparable<Product>, Serializable { 

private String upc; 
private String shortDetails; 
private String longDetails; 
private BigDecimal price; 
private Integer stock; 

public String getUpc() { 
    return upc; 
} 

public void setUpc(String upc) { 
    this.upc = upc; 
} 

public String getShortDetails() { 
    return shortDetails; 
} 

public void setShortDetails(String shortDetails) { 
    this.shortDetails = shortDetails; 
} 

public String getLongDetails() { 
    return longDetails; 
} 

public void setLongDetails(String longDetails) { 
    this.longDetails = longDetails; 
} 

public BigDecimal getPrice() { 
    return price; 
} 

public void setPrice(BigDecimal price) { 
    this.price = price; 
} 

public Integer getStock() { 
    return stock; 
} 

public void setStock(Integer stock) { 
    this.stock = stock; 
} 

@Override 
public int compareTo(Product t) { 
    return this.getUpc().compareTo(t.getUpc()); 
} 

}

+0

請發佈您的產品分類。 –

+0

感謝您對此的看法,我從來沒有得到過這個錯誤 – Spectre6

回答

1

把這一行在你的班級,一切都應該是好!

private static final long serialVersionUID = -558553967080513790L; 

那是因爲你在Product類實現Serializable接口,如果你沒有在具體的類中定義serialVersionUID,有沒有保證,不同的機器上使用相同的ID也不同版本的類自動生成的serialVersionUIDs也會的不一樣。 實際上默認的serialVersionUID計算對類的詳細信息非常敏感,可能因不同的JVM實現而異,並且在反序列化過程中會導致意外的InvalidClassExceptions。

編輯閱讀本 - Serializable接口的文檔:

如果一個序列化類沒有顯式聲明 的serialVersionUID,則序列化運行時將計算基於該類的一個 默認的serialVersionUID值如Java(TM)對象序列化 規範中所描述的該類的各個方面 。然而,強烈建議所有 序列化的類顯式聲明的serialVersionUID值,因爲 默認serialVersionUID的計算是類 細節,可能會因編譯器實現變化高度敏感,並能 期間 反序列化從而導致意外InvalidClassExceptions。因此,爲了保證在不同的java編譯器實現中具有一致的serialVersionUID 值,可序列化的類必須聲明顯式的serialVersionUID值。它也是 強烈建議顯式serialVersionUID聲明儘可能使用 專用修飾符,因爲這些聲明僅適用於 立即聲明的類 - serialVersionUID字段不是 作爲繼承成員有用。數組類不能聲明明確的 serialVersionUID,因此它們始終具有默認的計算值,但 對於 數組類無需匹配serialVersionUID值的要求。

祝你好運!

+0

評論是不是擴展討論;這個對話已經[轉移到聊天](http://chat.stackoverflow.com/rooms/143599/discussion-on-answer-by-mohammad-reza-khatami-serialversionuid-does-not-match)。 –