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



