Java 序列化与反序列化的疑问

发布时间 2023-09-21 23:18:40作者: 一个大转盘

关于序列化和反序列化的疑问

  1. 为什么需要序列化和反序列化 ?

    因为计算机底层存储和传输都是二进制,所以需要将对象转化成字节数组。那么问题来了,只需要转成字节数组就行了,那为啥还要弄这么多东西?搞这么复杂?

    因为直接转生成的字节数组是不规则的,所以我们不能通过这样的字节数组把原来的对象还原出来,那么我们就必须生成有规则的字节数组,而序列化就是这样一种规则,根据某种规则把对象转成字节数组(序列化),反序列化就是利用这种规则把字节数组还原成对象(反序列化

  2. 为什么有些实体类要继承Serializable才能序列化,而controller里,发送和接受的数据里不需要?

    因为序列化只是定义了拆解对象的具体规则,那这种规则肯定也是多种多样的,比如现在常见的序列化方式有:JDK 原生、JSON、ProtoBuf、Hessian、Kryo等。

    JDK原生: 实现Serializable接口;JDK 原生的序列化方式生成的字节流比较大,也不支持跨语言,因此在实际项目和框架中用的都比较少

    ProtoBuf: 谷歌推出的,是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于通信协议、数据存储等。序列化后体积小,一般用于对传输性能有较高要求的系统

    Hessian: Hessian 是一个轻量级的二进制 web service 协议,主要用于传输二进制数据。

    在传输数据前 Hessian 支持将对象序列化成二进制流,相对于 JDK 原生序列化,Hessian序列化之后体积更小,性能更优。

    Kryo: Kryo 是一个 Java 序列化框架,号称 Java 最快的序列化框架。Kryo 在序列化速度上很有优势,底层依赖于字节码生成机制。

    由于只能限定在 JVM 语言上,所以 Kryo 不支持跨语言使用。

    JSON: 上面讲的几种序列化方式都是直接将对象变成二进制,也就是byte[]字节数组,这些方式都可以叫二进制方式。

    JSON 序列化方式生成的是一串有规则的字符串,在可读性上要优于上面几种方式,但是在体积上就没什么优势了。

    另外 JSON 是有规则的字符串,不跟任何编程语言绑定,天然上就具备了跨平台。
    总结一下:JSON 可读性强,支持跨平台,体积稍微逊色。

  3. 假如请求响应 用的是jdk的序列化,那么前端应该怎么读取呢
    感觉是读取不了,但是使用Java rmi应该可以读取吧?

  4. Java rpc 可以使用jdk序列化 ?可能要去看看rpc的实现方式
    猜测1 jdk序列化后的是字节数组,传输的是字节数据,响应中应该有标识着这是jdk序列化的数据,然后rpc调用放就会采用jdk的方式读取

  5. 为啥ruoyi序列化采用的是json但还是实现了jdk的Serializable接口
    猜测1 rpc调用 OpenFeign 底层用的是Java rmi (猜测),所以为了方便就序列化(×)
    猜测错了,openfeign 采用的负载均衡,找到url,然后发起http请求
    问了文心一言回答是:

虽然实现了Serializable接口,但RuoYi在实际应用中可能并不会使用Java原生的序列化机制。
相反,它可能使用其他的序列化库(如Jackson)来实现JSON序列化和反序列化操作。
因此,Serializable接口在这里更多地作为一种备用或者扩展的序列化机制存在。

我的觉得有点道理在

以上都是我的思考和查询资料所得,还有一些猜测,仅作为自我学习的记录

部分参考资料