美文网首页
fastjson是怎么实现的序列化

fastjson是怎么实现的序列化

作者: flyjar | 来源:发表于2025-08-14 17:04 被阅读0次

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

其核心实现原理如下:

1. 核心思路

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

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

2. 序列化的关键步骤

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

(1)获取类信息

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

  • 类的所有字段(包括私有字段,通过 Class.getDeclaredFields() 获取)。
  • 字段的类型(如 Stringint、自定义类等)。
  • 类的继承关系(父类的字段也会被处理)。

(2)过滤与筛选字段

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

  • 默认情况下,所有非 transient 修饰的字段都会被序列化(与 Serializable 不同,这里 transient 仅作为过滤标记)。
  • 可通过注解(如 @JSONField(serialize=false))手动排除字段。
  • 静态字段(static)默认不参与序列化。

(3)字段值的转换

将字段值转换为 JSON 支持的类型:

  • 基本类型(intboolean 等)直接转换为 JSON 对应类型。
  • 引用类型(String、集合、自定义对象等)递归处理:
    • 集合(ListMap 等)会转换为 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通道中进行传输

相关文章

网友评论

      本文标题:fastjson是怎么实现的序列化

      本文链接:https://www.haomeiwen.com/subject/binwojtx.html