目录
- 1 前提
- 2 Serializable接口起什么作用呢?
- 3 序列化版本号有什么用呢?
- 4 java语言中是采用什么机制来区分类的?
- 5 这种自动生成序列化版本号有什么缺陷?
- 6 结论
- 7 怎样使某个属性不序列化
1 前提
参与序列化和反序列化的对象,必须实现 Serializable 接口。
3、注意:通过源代码发现,Serializable接口只是一个 标志接口:
public interface Serializable {
}
这个接口当中什么代码都没有。
2 Serializable接口起什么作用呢?
- 起到 标识 的作用,标志的作用,java虚拟机看到这个类实现了这个接口,可能会对这个类进行特殊待遇。
- Serializable这个标志接口是给java虚拟机参考的,java虚拟机看到这个接口之后,会为该类自动生成一个序列化版本号。
3 序列化版本号有什么用呢?
区分两个类是否相同。
4 java语言中是采用什么机制来区分类的?
第一:首先通过 类名 进行比对,如果类名不一样,
肯定不是同一个类。
第二:如果类名一样,再怎么进行类的区别?
靠 序列化版本号 进行区分。
eg.
小明编写了一个类:com.baidu.java.bean.Student implements Serializable
小红编写了一个类:com.baidu.java.bean.Student implements Serializable
不同的人编写了同一个类,但“这两个类确实不是同一个类”。这个时候序列化版本就起上作用了。
对于java虚拟机来说,java虚拟机是可以区分开这两个类的,因为这两个类都实现了Serializable接口,都有默认的序列化版本号,他们的序列化版本号不一样。所以区分开了。(这是自动生成序列化版本号的好处)
5 这种自动生成序列化版本号有什么缺陷?
Java虚拟机看到Serializable接口之后,
会自动生成一个序列化版本号。
这种自动生成的序列化版本号缺点是:
一旦代码确定之后,不能进行后续的修改,因为只要修改
,必然会重新编译,此时会生成全新的序列化版本号,
这个时候java虚拟机会认为这是一个全新的类。
(这样就不好了!)
6 结论
凡是一个类实现了Serializable接口,建议给该类提供一个固定不变的序列化版本号。
这样,以后这个类即使代码修改了,但是版本号不变,java虚拟机会认为是同一个类。
7 怎样使某个属性不序列化
使用 transient 关键字
transient关键字表示游离的,不参与序列化。
public user implements Serializable{
private int no;
private transient String name; // name不参与序列化操作!
}