java类中serialversionuid 作用 是什么?举个例子说明.
的有关信息介绍如下:类中影响Serialization进程的特征,两边的操作使用的类版本不同,但它们的 serialVersionUID 必须是一样的。它是用来识别两边的类是否兼容的,两边不同时不应该继续还原状态,而是应该停止下来,因为有人把事情搞错了。如果你的类没有实现 java.io.Serializable 或 java.io.Externalizable,这个字段则没有意义。
如果你没听说过 Java Serialization (序列化,有人书翻译成串行化),那去找些 serialization 介绍看看,下面说的第2段类结构变化时是中级水平的,理解 Java 的一些细节才能理解,多数情况下人们只提到第一种情况(类的结构没有变化时),也只需要第一种情况。
当Serialization两端(比如Socket两端)使用一个类的不同版本时,我们必须提供 serialVersionUID,它可以用JDK自带的 serialver 命令行来计算:
private static final long serialVersionUID = xxxx ;
如果类中出现了下面两个方法,那么将会被用到,否则使用默认的实现:
private void readObject(ObjectInputStream) throws IOException,ClassNotFoundException;
private void writeObject(ObjectOutputStream)throws IOException;
记住这里出现的方法和字段都是 private.
新版本中仅增加了字段或方法而没有改变旧版本中已有的东西时,我们只要保证两个版本中的 serialVersionUID 是一样的就行了.
具体样例可以看 JDK 源码中的像 ArrayList 这些类的代码的 readObject 和 writeObject 方法。
类的结构有些变化时,新版本对旧版本中某些东西进行了删减时, Field 的变化我们需要在readObject和writeObject方法中进行处理
ObjectOutputStream.PutField 类可达到这个目的
只是保证两个版本中的 serialVersionUID 一致是行不通的
类中必需两个常量:
private static final long serialVersionUID;
private static final ObjectStreamField[] serialPersistentFields
下面样例是当客户端和服务端使用的类的版本不同并且类的结构也改变了,比如: