我创建了客户端和服务器,然后在客户端添加了一个类用于序列化目的,然后只需转到硬盘驱动器中客户端的文件夹并将其复制粘贴到服务器对应的位置即可classname.class
and classname.java
分别。
它在我自己的笔记本电脑上运行良好,但是当我想在其他系统上继续工作时,当我打开项目文件夹并在客户端尝试连接到服务器后,出现以下错误:
Exception in thread "main" java.io.InvalidClassException: projectname.clasname; local class incompatible: stream classdesc serialVersionUID = -6009442170907349114, local class serialVersionUID = 6529685098267757690
at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:562)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1582)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1495)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1731)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350)
到底是怎么回事?是因为我用旧版本的IDE运行程序吗?
EDIT
import java.io.Serializable;
import java.net.URL;
public class KeyAdr implements Serializable {
private static final long serialVersionUID = 6529685098267757690L;
public URL adr;
public String key;
}
如果一个类没有明确定义private static final long serialVersionUID
代码中会自动生成,不保证不同机器会生成相同的id;看起来事情确实就是这样。
此外,如果类有任何不同(使用类的不同版本),则自动生成的serialVersionUID
s 也会有所不同。
来自Serializable
接口的docs http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html:
如果可序列化类没有显式声明serialVersionUID
,那么序列化运行时将计算一个默认值serialVersionUID
该类的值基于该类的各个方面,如 Java(TM) 对象序列化规范中所述。然而,它是强力推荐所有可序列化的类都显式声明serialVersionUID
值,因为默认值serialVersionUID
计算对类细节高度敏感,这些细节可能因编译器实现而异,因此可能会导致意外的结果InvalidClassExceptions
反序列化期间。因此,为保证一致serialVersionUID
跨不同 java 编译器实现的值,可序列化类必须声明显式serialVersionUID
价值。还强烈建议明确serialVersionUID
声明使用private
尽可能使用修饰符,因为此类声明仅适用于立即声明的类 -serialVersionUID
字段作为继承成员没有用。数组类不能显式声明serialVersionUID
,所以它们总是有默认的计算值,但是需要匹配serialVersionUID
对于数组类,values 被放弃。
你应该定义一个serialVersionUID
在类定义中,例如:
class MyClass implements Serializable {
private static final long serialVersionUID = 6529685098267757690L;
...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)