Java SerialVersionId不匹配
我对java相当陌生,我有一个类Java SerialVersionId不匹配,java,serialization,serialversionuid,Java,Serialization,Serialversionuid,我对java相当陌生,我有一个类Products,它是Serializable。我不知道我做了什么,但我的程序停止工作,并给了我以下错误: Exception in thread "main" java.io.InvalidClassException: cockeb.Product; local class incompatible: stream classdesc serialVersionUID = 1288455942608122525, local class serialVersi
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());
}
}
packageb;
导入java.io.Serializable;
导入java.math.BigDecimal;
公共类产品实现了可比较的、可序列化的{
专用字符串upc;
私人字符串的详细信息;
私人字符串详细信息;
私人价格;
私人整数股;
公共字符串getUpc(){
返回upc;
}
公共无效设置C(字符串upc){
this.upc=upc;
}
公共字符串getShortDetails(){
返回详细信息;
}
公共void设置短细节(字符串短细节){
this.shortDetails=shortDetails;
}
公共字符串getLongDetails(){
返回详细信息;
}
公共void setLongDetails(字符串longDetails){
this.longDetails=longDetails;
}
公共价格(){
退货价格;
}
公共无效设置价格(BigDecimal价格){
这个价格=价格;
}
公共整数getStock(){
退货;
}
公共无效集合库存(整数库存){
这个。股票=股票;
}
@凌驾
公共整数比较(产品t){
返回这个.getUpc().compareTo(t.getUpc());
}
}
把这一行放到你的课堂上,一切都会好起来的
private static final long serialVersionUID = -558553967080513790L;
这是因为您在Product
类中实现了Serializable
接口,如果您不在特定类中定义serialVersionUID
,则无法保证不同的机器在不同版本的类中使用相同的id,自动生成的serialVersionUID也将不同。
实际上,默认的serialVersionUID计算对类详细信息非常敏感,可能因不同的JVM实现而异,并在反序列化过程中导致意外的InvalidClassException。
编辑阅读此--可序列化界面的文档:
如果可序列化类未显式声明
serialVersionUID,则序列化运行时将计算
基于各个方面的该类的默认SerialVersionId值
类的,如Java(TM)对象序列化中所述
规范。但是,强烈建议:
可序列化类显式声明serialVersionUID值,因为
默认的serialVersionUID计算对类高度敏感
详细信息可能因编译器实现而异,可以
因此,在运行期间会导致意外的InvalidClassException
反序列化。因此,要保证一致的serialVersionUID
跨不同java编译器实现的值,可序列化
类必须声明显式的SerialVersionId值。也是
强烈建议显式serialVersionUID声明使用
私有修饰符,因为此类声明仅适用于
立即声明的类--SerialVersionId字段不可用
作为继承成员使用。数组类不能声明显式
serialVersionUID,因此它们始终具有默认的计算值,但
对于以下情况,不需要匹配serialVersionUID值
数组类
祝你好运 请发布您的产品类别。感谢您查看此内容,我以前从未收到此错误,评论不用于扩展讨论;这段对话已经结束。