fastjson是怎么实现的序列化

2025-08-14  本文已影响0人  flyjar

Fastjson 它的序列化机制与 Java 原生的 Serializable 机制完全不同,不依赖 Serializable 接口,而是通过反射自定义解析实现对象与 JSON 格式的转换。

其核心实现原理如下:

1. 核心思路

Fastjson 的序列化过程本质是:将 Java 对象的字段(包括属性值)提取出来,按照 JSON 格式(键值对)进行组织,最终转换为字符串

反之,反序列化则是将 JSON 字符串解析为对应 Java 类的对象,并为字段赋值。

2. 序列化的关键步骤

JSON.toJSONString(Object obj) 方法为例,序列化过程大致分为:

(1)获取类信息

通过反射获取目标对象的类信息,包括:

(2)过滤与筛选字段

根据规则决定哪些字段需要序列化:

(3)字段值的转换

将字段值转换为 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通道中进行传输

上一篇 下一篇

猜你喜欢

热点阅读