fastjson是怎么实现的序列化
2025-08-14 本文已影响0人
flyjar
Fastjson 它的序列化机制与 Java 原生的 Serializable 机制完全不同,不依赖 Serializable 接口,而是通过反射和自定义解析实现对象与 JSON 格式的转换。
其核心实现原理如下:
1. 核心思路
Fastjson 的序列化过程本质是:将 Java 对象的字段(包括属性值)提取出来,按照 JSON 格式(键值对)进行组织,最终转换为字符串。
反之,反序列化则是将 JSON 字符串解析为对应 Java 类的对象,并为字段赋值。
2. 序列化的关键步骤
以 JSON.toJSONString(Object obj) 方法为例,序列化过程大致分为:
(1)获取类信息
通过反射获取目标对象的类信息,包括:
- 类的所有字段(包括私有字段,通过
Class.getDeclaredFields()获取)。 - 字段的类型(如
String、int、自定义类等)。 - 类的继承关系(父类的字段也会被处理)。
(2)过滤与筛选字段
根据规则决定哪些字段需要序列化:
- 默认情况下,所有非
transient修饰的字段都会被序列化(与Serializable不同,这里transient仅作为过滤标记)。 - 可通过注解(如
@JSONField(serialize=false))手动排除字段。 - 静态字段(
static)默认不参与序列化。
(3)字段值的转换
将字段值转换为 JSON 支持的类型:
- 基本类型(
int、boolean等)直接转换为 JSON 对应类型。 - 引用类型(
String、集合、自定义对象等)递归处理:- 集合(
List、Map等)会转换为 JSON 数组或对象。 - 自定义对象会重复上述步骤,解析其内部字段。
- 集合(
(4)拼接 JSON 字符串
按照 JSON 语法规则(大括号、引号、逗号等),将字段和值拼接为最终的 JSON 字符串。
3. 与 Java 原生序列化的核心区别
| 特性 | Java 原生序列化(Serializable) |
Fastjson 序列化 |
|---|---|---|
| 依赖接口 | 必须实现 Serializable 接口 |
无需任何接口,所有类都可处理 |
| 序列化结果 | 二进制字节流(不可读) | 文本格式的 JSON 字符串(易读) |
| 核心技术 | JVM 内置机制 | 反射 + 自定义解析逻辑 |
| 兼容性 | 依赖 serialVersionUID
|
不依赖版本号,更灵活 |
| 用途 | 对象持久化、网络传输(二进制) | 数据交换(如接口 JSON 响应) |
4. 示例代码
import com.alibaba.fastjson.JSON;
// 无需实现任何接口
class User {
private String name;
private int age;
private transient String password; // transient字段默认不序列化
// 构造方法、getter/setter省略
}
public class FastjsonDemo {
public static void main(String[] args) {
User user = new User();
user.setName("Alice");
user.setAge(20);
user.setPassword("123456");
// 序列化:对象 -> JSON字符串
String json = JSON.toJSONString(user);
System.out.println(json);
// 输出: {"age":20,"name":"Alice"}(password被transient修饰,未序列化)
}
}
总结
Fastjson 序列化的核心是通过反射解析对象结构,并将其转换为JSON 文本格式,因此无需依赖 Serializable 接口。这种设计使其更适合跨语言数据交换(如前后端接口通信),同时也更灵活(可通过注解自定义序列化规则)。将对象转为json格式的字符串就是在序列化,字符串会在IO通道中进行传输