Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SerialVersionId不匹配_Java_Serialization_Serialversionuid - Fatal编程技术网

Java SerialVersionId不匹配

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

我对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());
}
}
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值 数组类


祝你好运

请发布您的产品类别。感谢您查看此内容,我以前从未收到此错误,评论不用于扩展讨论;这段对话已经结束。