序列化是把对象转换为字节流的过程,以方便传输或存储。反序列化,则是反过来把字节流转换为对象的过程。

关于序列化算法,几年前常用的有 JDK(Java)序列化、XML 序列化等,但前者不能跨语言,后者性能较差(时间空间开销大);现在 RESTful 应用最常用的是 JSON 序列化,追求性能的 RPC 框架(比如 gRPC)使用 protobuf 序列化,这 2 种方法都是跨语言的,而且性能不错,应用广泛。

序列化和反序列化需要确保算法一致

注意 Jackson JSON 反序列化对额外字段的处理

反序列化时要小心类的构造方法

  • 默认情况下,在反序列化的时候,Jackson 框架只会调用无参构造方法创建对象

枚举作为 API 接口参数或返回值的两个大坑

对于枚举,我建议尽量在程序内部使用,而不是作为 API 接口的参数或返回值,原因是枚举涉及序列化和反序列化时会有两个大坑。

  • 第一个坑是,客户端和服务端的枚举定义不一致时,会出异常
  • 第二个坑,也是更大的坑,枚举序列化反序列化实现自定义的字段非常麻烦,会涉及 Jackson 的 Bug。