serialversionUID不匹配。

3

enter image description here

我对Java还比较陌生,我有一个类Products,它是可序列化的。我不知道自己做了什么,但我的程序停止工作并给出了这个错误:

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

请发布您的Product类。 - Mohammadreza Khatami
谢谢您查看这个内容,我以前从未遇到过这个错误。 - Spectre6
1个回答

7
把这行代码放在你的类中,一切都会正常运作!
private static final long serialVersionUID = -558553967080513790L;

那是因为在Product类中实现了Serializable接口,如果您没有在特定类中定义serialVersionUID,则不能保证不同的机器使用相同的id,而且在不同版本的类中,自动生成的serialVersionUID也将不同。实际上,默认的serialVersionUID计算非常敏感于类细节,并且可能因JVM实现的不同而产生意外的InvalidClassExceptions,在反序列化过程中。
编辑阅读Serializable接口的文档:
如果可序列化的类没有明确声明serialVersionUID,则序列化运行时将根据类的各个方面计算该类的默认serialVersionUID值,如Java(TM)对象序列化规范中所述。但是,强烈建议所有可序列化的类都显式声明serialVersionUID值,因为默认的serialVersionUID计算对编译器实现可能有所不同的类细节非常敏感,因此可能导致意外的InvalidClassExceptions在反序列化期间。因此,为了保证在不同的java编译器实现之间具有一致的serialVersionUID值,可序列化的类必须声明一个显式的serialVersionUID值。还强烈建议显式的serialVersionUID声明在可能的情况下使用private修饰符,因为这样的声明仅适用于立即声明的类-- serialVersionUID字段不作为继承成员有用。数组类不能声明显式的serialVersionUID,因此它们始终具有默认计算值,但是对于数组类,匹配serialVersionUID值的要求被豁免了。
祝你好运!

评论不适合进行长时间的讨论;此对话已被移至聊天室 - Bhargav Rao

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接