关于java class 版本的兼容问题
A
总的来说:
因为序列化自动生成的UID要求严格,一个很小的改动就认为是不同的class,自己设置这个用来强制系统认为这两个不完全相同的类是同一个,就是 两个版本兼容
serialVersionUID 域是不同版本间兼容的标记,SerialVersionUID不同,发生了什么?
不兼容版本的异常被抛出
B
解决问题:版本兼容性
采用显式声明 serialVersionUID 并且保证需要兼容的class 拥有相同的 serialVersionUID 。
格式:private static final long serialVersionUID = -5288121327143580980L;
C
隐式 serialVersionUID 的特性:
同一个类的不兼容版本有不同的 serialVersionUID
如果您不提供一个值,将回自动产生一个
生成的值是基于类的"形状"
●类的名字。
●域的名字。
●方法的名字。
●已实现的接口。
改动上述任意一项内容(无论是增加或删除),都会引起编码值变化,从而引起类似的异常警报
D :)
具体的情况下的兼容:
o 如果值匹配,反序列化过程将为存在的域尽量提供值
o 只有同时存在于两个版本的域才会被恢复
当前版本所没有的域被忽略
当前版本新出现的域被置空
E :)
下面用一个例子说明问题:
1、 带能参数的构造函数初始化对象
2、 Writeobj()将当前对象写入test.txt 文件中
3、 Readobj()将test.txt文件中的对象读出来
4、 Printout()将对象及其值打印出来
-
-
package ser;
-
-
import java.io.FileInputStream;
-
import java.io.FileNotFoundException;
-
import java.io.FileOutputStream;
-
import java.io.IOException;
-
import java.io.ObjectInputStream;
-
import java.io.ObjectOutputStream;
-
import java.io.Serializable;
-
-
-
private static final long serialVersionUID = -5288121327143580980L;
-
-
//default
-
private int a ;
-
-
public char b ;
-
-
// protected long c ;
-