如果一个类的成员变量是引用类型,该成员变量所在类要实现序列化,则该成员变量必须也是可以序列化的。假定以下场景:

Student student = new Student("wz");
Teacher t1 = new Teacher(student,"Chinese");
Teacher t2 = new Teacher(student,"Math");

对象t1中有一个引用成员变量student,那么在序列化对象t1时,系统也会序列化student对象,那么在序列化对象t2,系统还需要序列化一个Student吗?当然不会,否则进行反序列化回来的时候,t1和t2所指向的student对象就不是同一个对象了。java在序列化一个对象时,会先检查该对象是否已经被序列化了,如果没有,则进行序列化并输出,如果已经序列化过了,则返回一个该对象在磁盘中的序列化编号即可。

java的序列化机制也存在着隐患,如果在第一次序列化一个对象之后,该对象的内容发生了改变,第二次序列化该对象只是输出一个序列化编号,不会重新将对象的内容转换为字节流输出。