首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >serialversionUID不匹配

serialversionUID不匹配
EN

Stack Overflow用户
提问于 2017-05-07 06:40:11
回答 1查看 6.2K关注 0票数 3

我对java相当陌生,我有一个类Products,即Serializable。我不知道我做了什么,但是我的程序停止工作,给了我这个错误:

代码语言:javascript
复制
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,但这没有起作用。

乘积类

代码语言:javascript
复制
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());
}
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-07 07:08:15

把这一行放到你的课上,一切都会好起来的!

代码语言:javascript
复制
private static final long serialVersionUID = -558553967080513790L;

这是因为您在Serializable类中实现了Product接口,如果不在特定的类中定义serialVersionUID,就不能保证不同的机器在不同版本的类中也使用相同的id --自动生成的序列化versions也会有所不同。实际上,默认的serialVersionUID计算对类细节高度敏感,并且可能因不同的JVM实现而有所不同,并在反序列化过程中导致意外的InvalidClassExceptions。

编辑的阅读了这个--可序列化接口的文档:

如果可序列化类没有显式声明serialVersionUID,则序列化运行时将根据类的各个方面计算该类的默认serialVersionUID值,如对象描述的那样。但是,强烈建议所有可序列化的类显式声明serialVersionUID值,因为默认的serialVersionUID计算对类细节高度敏感,这些细节可能因编译器实现而有所不同,因此在反序列化过程中可能导致意外的InvalidClassExceptions。因此,为了在不同的java编译器实现之间保证一致的serialVersionUID值,可序列化类必须声明一个显式的serialVersionUID值。此外,还强烈建议显式serialVersionUID声明在可能的情况下使用私有修饰符,因为此类声明仅适用于立即声明类-序列化declarations字段作为继承成员使用。数组类不能声明显式的serialVersionUID,因此它们总是具有默认的计算值,但是对于数组类,不需要匹配serialVersionUID值。

祝好运!

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43828566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档