Java中序列化的含义:
Java中对象的序列化指的是将对象转换成以字节序列的形式来表示,这些字节序列包含了对象的数据和信息,一个序列化后的对象可以被写到数据库或文件中,也可用于网络传输,一般当我们使用缓存cache(内存空间不够有可能会本地存储到硬盘)或远程调用rpc(网络传输)的时候,经常需要让我们的实体类实现Serializable接口,目的就是为了让其可序列化。
当然,序列化后的最终目的是为了反序列化,恢复成原先的Java对象,要不然序列化后干嘛呢,所以序列化后的字节序列都是可以恢复成Java对象的,这个过程就是反序列化。
transient---避免属性序列化
transient关键字的作用:
简单地说,就是让某些被修饰的成员属性变量不被序列化
transient关键字使用场景:
1、类中的字段值可以根据其它字段推导出来,如一个长方形类有三个属性:长度、宽度、面积(示例而已,一般不会这样设计),那么在序列化的时候,面积这个属性就没必要被序列化了;
2、其它,看具体业务需求吧,哪些字段不想被序列化;
为什么要不被序列化呢,主要是为了节省存储空间,其它的感觉没啥好处,
序列化/反序列化
序列化:把对象转换为字节序列存储于磁盘或者进行网络传输的过程称为对象的序列化。
反序列化:把磁盘或网络节点上的字节序列恢复到对象的过程称为对象的反序列化。
序列化:
【1】、必须实现序列化接口 Serializable:Java.lang.Serializable 接口
【2】、serialVersionUID:序列化的版本号,凡是实现 Serializable 接口的类都有一个静态的表示序列化版本标识符的变量。
定义了 serialVersionUID 之后,就可以对序列化后的对象进行修改,此时不会产生新的 serialVersionUID,导致还原时出错。
【3】、serialVersionUID 的取值:此值是通过Java运行时环境根据类的内部细节自动生成的。如果类的源代码进行了修改, 再重新编译,新生成的类文件的serialVersionUID的值也会发生变化。 (源码变动:即序列化,与反序列化源码不一致)
反序列化:
【1】:对象序列化代码如下,具体细节注释说明:Java中通过对象流 ObjectOutputStream 进行序列化。
【2】:反序列化为对象,具体细节注释说明:Java中通过对象流 ObjectInputStream 进行序列化。