【问题标题】:serialversionUID does not matchserialversionUID 不匹配
【发布时间】:2017-10-05 07:54:54
【问题描述】:

我对 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());
}
}

【问题讨论】:

  • 请发布您的产品类别。
  • 感谢您查看此内容,我之前从未遇到过此错误

标签: java serialization serialversionuid


【解决方案1】:

把这条线放在你的课堂上,一切都会好起来的!

private static final long serialVersionUID = -558553967080513790L;

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

已编辑阅读此 -- 可序列化接口的文档:

如果一个可序列化的类没有显式声明一个 serialVersionUID,那么序列化运行时会计算一个 基于各个方面的该类的默认 serialVersionUID 值 类的,如 Java(TM) 对象序列化中所述 规格。但是,强烈建议所有 可序列化的类显式声明 serialVersionUID 值,因为 默认的 serialVersionUID 计算对类高度敏感 细节可能因编译器实现而异,并且可以 因此导致意外的 InvalidClassExceptions 在 反序列化。因此,要保证一致的serialVersionUID 跨不同 java 编译器实现的值,一个可序列化的 类必须声明一个显式的 serialVersionUID 值。也是 强烈建议显式 serialVersionUID 声明使用 可能的情况下使用私有修饰符,因为此类声明仅适用于 立即声明类--serialVersionUID 字段不是 作为继承成员有用。数组类不能显式声明 serialVersionUID,所以它们总是有默认的计算值,但是 匹配 serialVersionUID 值的要求被放弃 数组类。

祝你好运!

【讨论】:

猜你喜欢
  • 2021-11-12
  • 2012-01-28
  • 2017-03-17
  • 2017-06-01
  • 1970-01-01
  • 2014-07-04
  • 2012-03-10
  • 2014-05-03
  • 1970-01-01
相关资源
最近更新 更多