2017-05-07 76 views
1

enter image description here我是相当新的Java和我有一个类ProductsSerializable。我不知道我做什么,但我的程序停止工作,并给了我这个错误:serialversionUID不匹配

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

}

+0

请发布您的产品分类。 –

+0

感谢您对此的看法,我从来没有得到过这个错误 – Spectre6

回答

1

把这一行在你的班级,一切都应该是好!

private static final long serialVersionUID = -558553967080513790L; 

那是因为你在Product类实现Serializable接口,如果你没有在具体的类中定义serialVersionUID,有没有保证,不同的机器上使用相同的ID也不同版本的类自动生成的serialVersionUIDs也会的不一样。 实际上默认的serialVersionUID计算对类的详细信息非常敏感,可能因不同的JVM实现而异,并且在反序列化过程中会导致意外的InvalidClassExceptions。

编辑阅读本 - Serializable接口的文档:

如果一个序列化类没有显式声明 的serialVersionUID,则序列化运行时将计算基于该类的一个 默认的serialVersionUID值如Java(TM)对象序列化 规范中所描述的该类的各个方面 。然而,强烈建议所有 序列化的类显式声明的serialVersionUID值,因为 默认serialVersionUID的计算是类 细节,可能会因编译器实现变化高度敏感,并能 期间 反序列化从而导致意外InvalidClassExceptions。因此,为了保证在不同的java编译器实现中具有一致的serialVersionUID 值,可序列化的类必须声明显式的serialVersionUID值。它也是 强烈建议显式serialVersionUID声明尽可能使用 专用修饰符,因为这些声明仅适用于 立即声明的类 - serialVersionUID字段不是 作为继承成员有用。数组类不能声明明确的 serialVersionUID,因此它们始终具有默认的计算值,但 对于 数组类无需匹配serialVersionUID值的要求。

祝你好运!

+0

评论是不是扩展讨论;这个对话已经[转移到聊天](http://chat.stackoverflow.com/rooms/143599/discussion-on-answer-by-mohammad-reza-khatami-serialversionuid-does-not-match)。 –