美文网首页
数据序列化 - 学习笔记

数据序列化 - 学习笔记

作者: 云藤 | 来源:发表于2018-11-26 14:33 被阅读10次

    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 protoco

            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

    相关文章

      网友评论

          本文标题:数据序列化 - 学习笔记

          本文链接:https://www.haomeiwen.com/subject/dduuxqtx.html