13、序列化和反序列化
(1)、概述
一般情况下,一个对象会随着程序的执行完成而消失,而有时我们需要保存下来一个对象的状态,这个时候就可以把它序列化。序列化最终的目的是为了对象可以跨平台存储和进行网络传输,而我们进行跨平台存储和网络传输的方式就是IO,而IO支持的数据格式就是字节数组,二进制串在Java里面所指的是byte[]。
对象状态也就是实例变量,不是方法,如果是静态变量,那么它不会被序列化到流中,反序列化后这个字段会为空或者0。因为本质上序列化是针对对象的序列化,而静态变量实际上是类的属性,不是对象的属性。
①、序列化
将数据结构或对象转换成二进制串的过程。
②、反序列化
将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程。
(2)、 Serializable接口
Serializable接口只是用来标识这个对象可以被序列化。Serializable接口的注释建议在类里声明serialVersionUID变量,因为默认的serialVersionUID是jdk生成的,不同版本jdk可能生成的值不同,如果序列化数据的serialVersionUID和对应类的serialVersionUID不一致,就会导致反序列化失败。如果是网络传输,那就必须保证序列化和反序列化的serialVersionUID保持一致,否则会反序列化失败。
(3)、序列化方式
常见序列化协议包括XML、JSON、Protobuf、Thrift和Avro。
①、JDK原生
JDK自带序列化方法,只需要类实现Serializable接口,就可以通过ObjectOutputStream类将对象变成byte[]字节数组。JDK序列化会把对象类的描述信息和所有的属性以及继承的元数据都序列化为字节流,所以会导致生成的字节流相对比较大,也不支持跨语言,因此在实际项目和框架中用的都比较少。
②、XML
XML是一种常用的序列化和反序列化协议,具有跨机器,跨语言等优点。
③、JSON
JSON序列化常见的框架有:FastJSON、Jackson、Gson 等。
JSON起源于弱类型语言Javascript, 它的产生来自于一种称之为”Associative array”的概念,其本质是就是采用”Attribute-value”的方式来描述对象。JSON序列化方式是生成一串有规则的字符串,JSON可读性强,支持跨平台。