<span id="OSC_h1_1"></span>
一、概述
在高级编程语言的世界中,开发者始终与**【object/struct】**这类高度抽象的数据结构打交道。然而在分布式架构下,任何服务进程都不是数据孤岛——跨进程数据交换是必然需求。
以Java为例,业务逻辑的输入输出都是**【object】。但在RPC场景中,这些对象必须经由网络传输。这里出现了一个根本性矛盾:网络介质(网线/光纤)对面向对象编程(OOP)一无所知,它们只会用光和电忠实地传输扁平化**的字节流(byte[])。
软件工程经典的分层理论驱使我们去添加一个转换层。
我们需要有个工具或者组件来协助进行**【object】和【byte[]】之间的双向转换**。这个过程包含两个对称的流程:
- 【object】->【byte[]】:业界一般称为序列化/serialize,但是那个单词念起来很拗口,本文我们都叫它【编码/encode】好了。
- 【byte[]】->【object】:业界一般称为反序列化/deserialize,但是那个单词念起来很拗口,本文我们都叫它【解码/decode】好了。
Hessian作为Java生态中久经考验的对象编解码器,相较于同类产品具有以下两大核心优势:
- 深度Java生态适配:与JSON、Protobuf等语言中立的通用协议不同,Hessian专为Java深度优化,对泛型、多态等Java特有语言特性提供原生支持。
- 高效二进制协议:相较JSON等文本协议,Hessian采用精心设计的二进制编码方案,在编解码效率和数据压缩率方面表现更优。
需要强调的是,软件工程没有银弹——业务场景的差异决定了编解码器的选择必然需要权衡取舍。但就Java RPC而言,Hessian应该是经过广泛实践验证的稳健选择。
本文将系统解析Hessian的编码流程,重点揭示其实现【object】->【byte[]】转换的核心机制。
二、基础编码原理
对象编码过程主要包含如下两大核心:
-
对象图遍历:遍历高级数据结构
- 通过反射或元编程技术遍历对象图(Object Graph)。
- 是同类产品的通用逻辑,不管jackson、fastjson、hessian都需要用不同的方式做类似的事情。
-
编码格式:将高级数据结构按协议拍平放到byte[]
- 同类产品百家争鸣,各有各的思路。
- 是同类产品的竞技场,各个产品在这里体现差异化的竞争力。
- 设计权衡包括:
- 二进制效率 vs 可读性(如Hessian二进制 vs JSON文本)
- 编码紧凑性 vs 扩展灵活性
- 跨语言支持 vs 语言特性深度优化
未经允许不得转载:紫竹林-程序员中文网 » 0基础带你精通Java对象序列化–以Hessian为例|得物技术