GraalVM 支持
GraalVM Native Image
GraalVM native image 提前将 Java 代码编译为本地可执行文件,从而实现更快的启动速度和更低的内存使用。但是,本地镜像不支持运行时 JIT 编译或反射,除非进行显式配置。
Apache Fory™ 通过使用代码生成而非反射,可以完美地与 GraalVM native image 配合使用。所有序列化器代码都在构建时生成,在大多数情况下无需反射配置文件。
工作原理
当您执行以下操作时,Fory 会在 GraalVM 构建时生成序列化代码:
- 将 Fory 创建为静态字段
- 在静态初始化器中注册所有类
- 调用
fory.ensureSerializersCompiled()来编译序列化器 - 通过
native-image.properties配置该类在构建时初始化
主要优势:对于大多数可序列化的类,您无需配置反射 json 或序列化 json。
注意:Fory 的 asyncCompilationEnabled 选项在 GraalVM native image 中会自动禁用,因为不支持运行时 JIT。
基础用法
步骤 0:添加 GraalVM 支持依赖
在构建 native image 时,请将 fory-graalvm-feature 添加到应用依赖中:
<dependency>
<groupId>org.apache.fory</groupId>
<artifactId>fory-graalvm-feature</artifactId>
<version>${fory.version}</version>
</dependency>
该依赖已经在 META-INF/native-image 中携带 GraalVM feature 元数据,因此只要将它加入依赖,就会在 native-image 构建期间自动启用 org.apache.fory.graalvm.feature.ForyGraalVMFeature。
步骤 1:创建 Fory 并注册类
import org.apache.fory.Fory;
public class Example {
// 必须是静态字段
static Fory fory;
static {
fory = Fory.builder().build();
fory.register(MyClass.class);
fory.register(AnotherClass.class);
// 在构建时编译所有序列化器
fory.ensureSerializersCompiled();
}
public static void main(String[] args) {
byte[] bytes = fory.serialize(new MyClass());
MyClass obj = (MyClass) fory.deserialize(bytes);
}
}