序列化--Serializable接口与transient修饰符

序列化定义:Java中对象的序列化指的是将对象转换成以字节序列的形式来表示,这些字节序列包含了对象的数据和信息(对象的瞬时状态),一个序列化后的对象可以被写到数据库或文件中,也可用于网络传输

 

应用场景:一是实现pojo对象的读写操作,将每个对象转换为字节流,而这些字节流可以被持久化到设备上,再次读取时会将字节流还原成对象。当我们希望某些数据能在程序停止运行后,还能继续存在。在程序再次执行时还能获取这些数据时,或者让其他的程序也能够利用这些数据资源时。二是实现网络间的数据传输。网络间的数据传输是高频发而且数据量也是非常大的。以订单数据传输为例,当我们希望获取到订单类里的全部数据并据此生成一份订单的excel文件时,这个订单类就必须要实现序列化

 

java对象序列化不仅保留一个对象的数据,而且递归保存对象引用的每个对象的数据(所以引用的对象也必须可序列化)。可以将整个对象层次写入字节流中,可以保存在文件中或在网络连接上传递。利用对象序列化可以进行对象的”深复制”,即复制对象本身及引用的对象本身。序列化一个对象可能得到整个对象序列。

 

序列化方式:一,实现Serializable接口(常用),Serializable接口是一个空接口,仅作为一个标识,实现该接口即标识该类的对象可被序列化,真正序列化和反序列化的操作并不需要它来完成(更深层次暂不了解)。二,或者实现Externalizable接口(不了解)

 

序列化ID:serialVersionUID它是决定 Java 对象能否反序列化成功的重要因子。该字段必须是静态的,final,类型是long。在反序列化时,Java 虚拟机会把字节流中的 serialVersionUID 与被序列化类中的 serialVersionUID 进行比较,如果相同则可以进行反序列化,否则就会抛出序列化版本不一致的异常。如果可序列化类没有显式声明serialVersionUID,则序列化运行时将根据Java对象序列化规范中所述的类的各个方面计算该类的默认serialVersionUID值。然而,所有的可序列化类都被强烈建议显示声明自己的serialVersionUID,因为默认的serialVersionUID对那些编译器相关的细节高度敏感,这可能会导致在反序列化时产生意外的InvalidClassException。还强烈建议,显式的serialVersionUID声明在可能的情况下使用private修饰符,对继承成员无效。

 

注意事项:static关键字修饰的字段不会被序列化,因为序列化保存的是对象的状态,而 static 修饰的字段属于类的状态。transient关键字可以阻止字段被序列化到文件中。

你可能感兴趣的:(JavaSe基础知识)