Spe*_*re6 3 java serialization serialversionuid

我对 java 相当陌生,我有一个类Products是Serializable. 我不知道我做了什么,但我的程序停止工作并给了我这个错误:
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
Run Code Online (Sandbox Code Playgroud)
我四处搜寻并找到了声明它的方法,但这现在对我没有帮助。我什至打开一个新项目,只是从非工作项目中复制每个类中的文本并将其粘贴到新项目中,但我仍然遇到相同的错误。我在我的所有项目中都遇到了这个错误(它们使用同一个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());
}
}
Run Code Online (Sandbox Code Playgroud)
把这条线放在你的班级里,一切都应该没问题!
private static final long serialVersionUID = -558553967080513790L;
Run Code Online (Sandbox Code Playgroud)
这是因为你在类Serializable中实现了接口Product,如果你没有serialVersionUID在特定的类中定义,则不能保证不同的机器在不同版本的类中使用相同的id,自动生成的serialVersionUIDs也会不同。实际上,默认的serialVersionUID计算对类细节高度敏感,并且可能因不同的JVM实现而异,并在反序列化过程中导致意外的InvalidClassExceptions。
编辑阅读此--可序列化接口的文档:
如果可序列化类未显式声明serialVersionUID,则序列化运行时将根据该类的各个方面计算该类的默认serialVersionUID 值,如Java(TM) 对象序列化规范中所述。但是,强烈建议所有可序列化类显式声明serialVersionUID值,因为默认的serialVersionUID计算对类详细信息高度敏感,这些详细信息可能因编译器实现而异,因此可能会在反序列化期间导致意外的InvalidClassExceptions。因此,为了保证在不同的 java 编译器实现之间具有一致的serialVersionUID 值,可序列化类必须声明显式的serialVersionUID 值。还强烈建议显式的serialVersionUID声明尽可能使用private修饰符,因为此类声明仅适用于立即声明的类——serialVersionUID字段作为继承成员没有用处。数组类无法声明显式的serialVersionUID,因此它们始终具有默认的计算值,但数组类不需要匹配serialVersionUID值。
祝你好运!
| 归档时间: |
|
| 查看次数: |
7900 次 |
| 最近记录: |