Person
对象,这也就是反序列化的意义。注意:如果一个类A为可序列化的,那他的子类也是可序列化的
metadata
java.lang.Object
java.io.Serializable
接口,以告诉Java虚拟机这是一个可序列化的类。同时在Java的序列化机制中还要检查版本的一致性,所以在序列化后的结果中,我们往往还会加入一个serialVersionUID
参数,这是一个long
类型的参数。在进行反序列化的过程中,首先比较的就是这个参数的值是否与本地反序列化实体类的这个参数的值是否相等,如果相等则可以进行反序列化,否则抛出InvalidClassException
异常,不能进行反序列化。serialVersionUID
的生成有2种方式:java.io.Serializable
接口的实体类没有显式定义一个名为serialVersionUID
、类型为long
的变量时,Java序列化机制会根据编译的.class文件自动生成一个serialVersionUID
。注意:如果我们打开java.io.Serializable
这个接口的代码,会发现这个接口是空的,因为它仅起到一个标识的作用。
UltraEdit
)或者记事本打开这个文件,我们可以看到,前面是Java为我们写入的一些必要的信息,包括包名类名以及相关的字段及其类型,同时在最后我们可以看到,我们重写后的序列化的结果Qun,19
。HashMap
的源代码里:transient
关键字用于修饰成员变量,被修饰的成员不被序列化或反序列化,这主要适用于一些此值可以被其他值推导出来的情况,比如一个记录长方形的类,里面有长度、宽度、面积三个成员变量,面积可以通过长度乘以宽度推导出来,这样我们在序列化的时候就没必要把面积也序列化出来,只需要序列化长度和宽度即可。同理在上述HashMap
的源代码里,size
表示存储的键值对的个数,modCount
表示这个HashMap
对象被修改的次数,同样没必要序列化出来。一是为了节省空间,二是因为某些字段的值在反序列化时可能需要重新计算。