Kong Jing

序列化

26 May 2020

  1. ### 序列化

    什么是序列化?

    系统底层,数据的传输是使用的字节序列形式,那么进程通讯需要使用序列化与反序列化。

    广义上来看,数据序列化就是讲数据结构或者对象转换成我们可以存储或者传输的数据格式的一个过程,在序列化的过程中,数据结构或者对象将其状态信息写入到临时或者持久性的存储区中。

    数据序列化相当于我们原先的对象序列化概念作出了扩展,在对象序列化和反序列化中,我们熟知的两种方法,其一是java语言中提供的Serializable接口,其二是Android提供的parcelable接口,json或者sqlite,来实现网络传输或者数据的本地存储,都是数据的序列化。

    序列化

    将数据结构或者对象转换成二进制串的过程。

    反序列化

    将在序列化过程中所生成的二进制串换成数据结构或者对象的过程。

    细节点。

    intent socket http

    序列化, 反序列化,概念

    序列化的用途:网络上,跨进程。

    序列化方案: serializable parcelable (二进制)

    #### 如何选择合理的序列化方案

    json xml&soap protobuf

    协议: 数据结构

    ##### 序列化的特性

    通用性, 支持跨平台,以及有稳定的公共包进行支持

    强健性, 成熟度不够,语言/平台的不公平性

    性能, 时间空间复杂度

    可调试, 支持不到位,访问限制

    扩展性, 支持新的业务字段,不影响老的服务。

    安全性, 跨局域网的访问场景,序列化协议要兼容成熟的http传输层框架

    #### serializable

    Externalizable 接口

    writeExternal()

    readExternal()

    ObjectOutputStream

    ObjectInputStream

    kotlin学习 jvm ——》 java

    Serializable的特点

    \1. 可序列化类中,未实现SerialZable,那么不能序列化或者进行反序列化。

    \2. 也就是说,反序列化的过程中,它的非可序列化的属性将会调用无参数构造函数重新创建。

    \3. 因此这个属性的无参数构造函数必须可以访问,否则运行时会报错。

    \4. 一个实现序列化的类,它的子类是可以序列化的。

    serialVersionUID 解决要序列化的对象,版本有没有发生变化的问题。

    client service

    A 《- new A();

    serialVersionUID = 2

    控制版本

    序列化步骤与数据了解

    序列化的原理

    序列化流程

    ```mermaid

    graph TD

    A[ObjectOutputStream] –> A1 B(模块B)

    B –> C{判断条件C}

    C –> 条件C1 D[模块D]
    C –> 条件C2 E[模块E]
    C –> 条件C3 F[模块F]

    ```

    Serializable 需要注意的地方

    多引用写入

    子类实现序列化,父类不实现序列化/对象引用

    类的演化

    大量的使用反射 产生大量的临时对象

    ### Parcelable接口

— Kong Jing