Java序列化就是把Java对象按照一定的格式存到文件或者磁盘当中,那么Java内置的序列化有几种方式呢?每种方式的相同点和不同点是什么呢?
序列化的进阶:即三种方式,任何一种方式都可以进行序列化和反序列化
第一种
使用默认的序列化机制,即实现Serializable接口即可,不需要实现任何方法。
该接口没有任何方法,只是一个标记而已,告诉Java虚拟机该类可以被序列化了。然后利用ObjectOutputStream进行序列化和用ObjectInputStream进行反序列化。
注意:
该方式下序列化机制会自动保存该对象的成员变量,static成员变量和transient关键字修饰的成员变量不会被序列化保存。如:
要序列化的对象
看看序列化和反序列化效果:
序列化和反序列化结果
这是最简单的一种方式,因为这种方式让序列化机制看起来很方便(然后,我们在进行对象序列化时,只需要使用ObjectOutputStream和ObjectInputStream的writeObject(object)方法和readObject()方法,就可以把传入的对象参数序列化和反序列化了,其他不用管)。有时候想自己来控制序列化哪些成员,还有如何保存static和transient成员?
再注意:
该方式下,反序列化时不会调用该对象的构造器,但是会调用父类的构造器,如果父类没有默认构造器则会报错。static字段是类共享的字段,当该类的一个对象被序列化后,这个static变量可能会被另一个对象改变,所以这就决定了静态变量是不能序列化的,但如果再加上final修饰,就可以被序列化了,因为这是一个常量,不会改变。
第二种
实现Externalizable接口。
Externalizable接口是继承自Serializable接口的,我们在实现Externalizable接口时,必须实现writeExternal(ObjectOutput)和readExternal(ObjectInput)方法,在这两个方法下我们可以手动的进行序列化和反序列化那些需要保存的成员变量。
Externalizable
Externalizable结果
反序列化时,首先会调用对象的默认构造器(没有则报错,如果默认构造器不是public的也会报错),然后再调用readExternal方法。
这种方式一定要显式的序列化成员变量,使得整个序列化过程是可控制的,可以自己选择将哪些部分序列化。