序列化是将对象转换为二进制形式(如字节数组),通常用于网络传输、数据持久化等目的。反序列化则是将这些字节数组还原成原始对象,主要用于完成远程调用。
| 序列化技术 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| Java默认序列化 | - | 无法跨语言、码流大、性能差 | - |
| XML | 人机可读性好、可指定名称 | 文件庞大、格式复杂、不包含类型信息 | 配置文件存储、数据转换 |
| JSON | 兼容性高、简单易读写、数据较小、可扩展性好 | 数据描述性差、不适合ms级别性能要求 | 跨防火墙访问、Web浏览器Ajax请求 |
| Fastjson | 接口简单易用、序列化速度快 | 注重速度牺牲标准和功能性、文档不全 | 协议交互、Web输出、Android客户端 |
| Thrift | 体积小、速度快、支持多语言和数据类型 | 使用者少、不安全、调试难、不支持持久层直接读写 | 分布式系统RPC |
| Avro | 支持丰富数据类型、自我描述、提高解析速度 | 对静态类型语言用户不直观 | Hadoop中的数据格式 |
| Protobuf | 码流小、性能高、结构化数据格式 | 需要工具生成代码、支持语言较少 | 高性能RPC、跨防火墙访问、应用层持久化 |
| Protostuff | 基于protobuf、无需.proto文件 | - | 高性能RPC、简化开发流程 |
| JBoss Marshalling | 直接序列化Java类 | - | - |
| MessagePack | 高效二进制序列化 | - | - |
| Hessian | 二进制轻量级远程调用 | - | - |
| Kryo | 基于protobuf、只支持Java | 需要注册 | - |