我对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
我四处搜寻并找到了声明它的方法,但是现在这对我没有帮助。我什至可以打开一个新项目,只是从非工作项目中复制每个类中的文本,然后将其粘贴到新项目中,但是我仍然遇到相同的错误。我在我所有的项目中都遇到了这个错误(它们使用相同的
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());
}
}
最佳答案
将这一行放在您的班上,一切都应该没问题!
private static final long serialVersionUID = -558553967080513790L;
那是因为您在
Serializable
类中实现了Product
接口,并且如果您没有在特定的类中定义serialVersionUID
,则无法保证不同的机器在该类的不同版本中也使用相同的ID,则自动生成的serialVersionUID也将有所不同。实际上是缺省的serialVersionUID计算对类详细信息高度敏感,并且可能因不同的JVM实现而异,并且在反序列化过程中会导致意外的InvalidClassExceptions。
编辑的阅读此内容-可序列化界面的文档:
如果可序列化的类未明确声明
serialVersionUID,则序列化运行时将计算
该类基于各个方面的默认serialVersionUID值
类的名称,如Java(TM)对象序列化中所述
规范。但是,强烈建议所有
可序列化的类显式声明了serialVersionUID值,因为
默认的serialVersionUID计算对类高度敏感
细节可能会根据编译器的实现而有所不同,并且可以
从而导致在发生意外的InvalidClassExceptions
反序列化。因此,要保证serialVersionUID一致
跨不同Java编译器实现的价值,可序列化
类必须声明一个显式的serialVersionUID值。也是
强烈建议显式serialVersionUID声明使用
在可能的情况下使用private修饰符,因为此类声明仅适用于
立即声明的类--serialVersionUID字段不是
作为继承成员很有用。数组类无法声明显式
serialVersionUID,因此它们始终具有默认的计算值,但是
无需匹配serialVersionUID值的要求
数组类。
祝好运!
关于java - serialversionUID不匹配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43828566/