Keyword: Java Seralization, Avro, Thrift, Protocol Buffer
数据序列化的意义:
把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;(持久化对象)
在网络上传送对象的字节序列。(网络传输对象)
Java Seralization
Java平台允许我们在内存中创建可复用的Java对象,但只有当JVM(Java虚拟机)处于运行时,这些对象才可能存在,也就是这些对象的生命周期不会比JVM的生命周期更长。但在现实应用中,就可能要求在JVM停止运行之后能够保存指定的对象(持久化对象),并在将来重新读取被保存的对象。
网络通信时,无论是何种类型的数据,都会转成字节序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象
Java 中的对象序列化, 帮助实现了以下两个重要特性:
a. 远程方法调用 (Remote Method Invocation, RMI): 远程调用其他机器上的对象。当向远程对象传递消息时,就需要利用序列化传递参数和返回值 。
b. JavaBean: Bean的状态信息通常是在设计时配置的,这些信息必须保存下来,供程序启动时调用
Java 中的对象实例化为轻量级持久(lightweigth persistence)。所谓持久(persistence), 即指对象的生命周期不是由程序是否运行决定的。通过将序列化的对象写入磁盘,等程序再次运行时再读出来, 可以达到持久的效果。 之所以说是轻量级, 是因为在Java中我们需要明确的进行序列化和反序列化的操作,而不是让系统handle 所有的细节。
Java 实现:
1. 对象实现:必须实现这两个接口之一才可以序列化: Serializable, Externalizable.
Externalizable接口 与Serializable 接口类似,只是Externalizable接口需要强制自定义序列化。
2. 序列化:ObjectOutputStream代表对象输出流。 反序化:ObjectInputStream代表对象输入流
3. 阻止递归序列化:
当对某个对象进行序列化时,系统会自动将该对象的所有属性依次进行序列化,如果某个属性引用到别一个对象,则被引用的对象也会被序列化。如果被引用的对象的属性也引用了其他对象,则被引用的对象也会被序列化。 这就是递归序列化。有时候,我们并不希望出现递归序列化,或是某个存敏感信息(如银行密码)的属性不被序列化,我们就可通过transient关键字修饰该属性来阻止被序列化。方法、static属性(静态属性)、transient属性(即瞬态属性)都不会被序列化
4. serialVersionUID: 只要我们自己指定了serialVersionUID,就可以在序列化后,去添加一个字段,或者方法,而不会影响到后期的还原. 显式地定义serialVersionUID有两种用途:
a、 在某些场合,希望类的不同版本对序列化兼容,因此需要确保类的不同版本具有相同的serialVersionUID;
b、 在某些场合,不希望类的不同版本对序列化兼容,因此需要确保类的不同版本具有不同的serialVersionUID。
5. 示例
其他序列化框架:
当我们碰到性能问题,或者需要跨语言传输数据时,我们可能需要依赖其他序列化框架。
比较流行的几个框架有:
1. Avro [ævrə] 数据序列化框架. Hadoop 的一个子项目. (spark, flink 没有采用). 优势: 动态模式(不用生成代码,而且性能很好,不是最好,很多系列化问题可以针对具体问题,具体分析)
http://techblog.rtbhouse.com/2017/04/18/fast-avro/
http://vanillajava.blogspot.com/2011/10/serialization-using-bytebuffer-and.html
https://github.com/eishay/jvm-serializers/wiki
https://www.jianshu.com/p/ecbb607809c4
2. Apache Thrift: facebook, version 0.11 Inkubator. also offers RPC. an interface definition language and binary communication protocol
https://en.wikipedia.org/wiki/Apache_Thrift
3. Protocol Buffers: 2001 (design)~2008 (open sourced), 所有Google service 的框架. 但在Google体系之外使用的较少
背景知识:
Interface Definition Language (IDL )
binary/XML/JSON/plain text 为数据格式; http/soap 为传输协议。 序列化实现并不包含
Reference:
https://blog.csdn.net/zcl_love_wx/article/details/52126876
https://www.jianshu.com/p/ecbb607809c4