# Summary
对象信息 => 二进制
1. 所有的序列化实现本质上都是类似这样的,都是把对象里包含的成员信息,以某和顺序,编码成不同的二进制,通过某种协议用不同的长度、分隔符和特殊符号来区分类型利具体的值。只不过,不同的实现方式,在性能、跨语言特性等能力上有所差异。
2. JDK 中的序列化,因为协议设计高度依赖于 Java 语言本身,同样的协议就很难被其他语言所支持。
3. 而另一种序列化方式 JSON,就可以认为和语言并没有强绑定关系,各大主流语言都有对 JSON 解析的良好支持,所以,如果采用JSON 作为 RPC 框架中的序列化反序列化方式,通常就可以支持跨语言服务的调用。
4. 但是 [[JSON]] 缺点也很明显,它本质上是纯文本的编码方式,编码空间利用率很低,导致一次 RPC 调用在网络上传输的二进制流长度比JDK 的实现要高很多,而且,编解码需要对 JSON 文本进行嵌套的解析,整体上性能比较差。
# Cues
[protobuf](protobuf.md)
[[Thrift]]
# Notes
在使用 Java 对 JSON 数据进行解析的时候,您不一定需要将整个 JSON 数据结构中每一个字段都严格定义为对应的类和属性。通常有以下几种策略和考虑点:
1. **完整建模**:
您可以像示例中一样,将 JSON 中的每个层级、每个数据结构都定义成相应的 Java 类,并通过 Jackson、Gson 等 JSON 库实现与类之间的自动映射。这种方式有以下特点:
- **优点**:类型安全、代码可读性和可维护性较高,后期扩展方便。
- **缺点**:初期建模工作量较大,需要对 JSON 结构有较为清晰的认识。如果 JSON 结构经常变化或者不稳定,需要频繁改动类。
2. **按需定义**:
如果您只关心 JSON 数据中的一部分字段,或者业务逻辑只需要处理某些关键数据,那么您可以只为需要的数据结构定义对应的属性和类。Jackson 和 Gson 等常用 JSON 库在反序列化时,对于类中未定义的字段会自动忽略。
- **优点**:简化初期开发,无需全面定义整个结构,减少冗余代码。
- **缺点**:后期如果需求变动,需要再次修改类结构。如果 JSON 结构变动不大而需求频繁增加,会导致不断补全类字段。
3. **使用 Map 或 JsonNode 等通用数据结构**:
在有些情况下,如果 JSON 数据结构非常灵活或者不确定,您可以先将数据解析到一个通用的结构(如 `Map<String, Object>` 或 `com.fasterxml.jackson.databind.JsonNode`)中,然后在运行时根据需要进行数据提取和类型转换。这种方案往往与部分定义类结合起来使用。
- **优点**:灵活性极强,适合处理动态、未知或频繁变动的 JSON 数据结构。
- **缺点**:需要编写更多自定义逻辑来从通用结构中提取所需信息;类型安全性和可维护性较弱。
**总结**:
- 如果您的 JSON 数据结构相对稳定,您也希望代码可读、可维护,那么推荐像示例中一样对数据结构进行完整建模。
- 如果您只对部分数据感兴趣,且不想一次性定义所有字段,那么就可以选择只定义所需的那部分字段对应的类属性,未定义的字段在解析时会被忽略。
- 如有更复杂或变动频繁的场景,可以在部分定义类的基础上,用 `Map` 或 `JsonNode` 等通用结构灵活解析剩余字段。