title: Java Serialization Guide sidebar_position: 0 id: serialization_index license: | Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Apache Fory™ provides blazingly fast Java object serialization with JIT compilation and zero-copy techniques. When only Java object serialization is needed, this mode delivers better performance compared to cross-language object graph serialization.
writeObject/readObject/writeReplace/readResolve/readObjectNoData/ExternalizableNote that Fory creation is not cheap, the Fory instances should be reused between serializations instead of creating it every time. You should keep Fory as a static global variable, or instance variable of some singleton object or limited objects.
import java.util.List; import java.util.Arrays; import org.apache.fory.*; import org.apache.fory.config.*; public class Example { public static void main(String[] args) { SomeClass object = new SomeClass(); // Note that Fory instances should be reused between // multiple serializations of different objects. Fory fory = Fory.builder().withXlang(false) .requireClassRegistration(true) .build(); // Registering types can reduce class name serialization overhead, but not mandatory. // If class registration enabled, all custom types must be registered. // Registration order must be consistent if id is not specified fory.register(SomeClass.class); byte[] bytes = fory.serialize(object); System.out.println(fory.deserialize(bytes)); } }
import org.apache.fory.*; import org.apache.fory.config.*; public class Example { public static void main(String[] args) { SomeClass object = new SomeClass(); ThreadSafeFory fory = Fory.builder() .withXlang(false) .buildThreadSafeFory(); fory.register(SomeClass.class, 1); byte[] bytes = fory.serialize(object); System.out.println(fory.deserialize(bytes)); } }
import org.apache.fory.*; import org.apache.fory.config.*; public class Example { private static final ThreadSafeFory fory = Fory.builder() .withXlang(false) .buildThreadSafeFory(); static { fory.register(SomeClass.class, 1); } public static void main(String[] args) { SomeClass object = new SomeClass(); byte[] bytes = fory.serialize(object); System.out.println(fory.deserialize(bytes)); } }
Fory provides two thread-safe runtime styles:
buildThreadSafeForyThis is the default choice. It uses a fixed-size shared ThreadPoolFory sized to 4 * availableProcessors() and is the preferred runtime for virtual-thread workloads:
ThreadSafeFory fory = Fory.builder() .withXlang(false) .withRefTracking(false) .withCompatible(false) .withAsyncCompilation(true) .buildThreadSafeFory();
See more details in Virtual Threads.
Use buildThreadLocalFory() only when you explicitly want one Fory instance per long-lived platform thread, or when you want to pin that choice regardless of JDK version:
ThreadSafeFory fory = Fory.builder() .withXlang(false) .buildThreadLocalFory(); fory.register(SomeClass.class, 1); byte[] bytes = fory.serialize(object); System.out.println(fory.deserialize(bytes));
buildThreadSafeForyPoolUse buildThreadSafeForyPool(poolSize) when you want to set that fixed shared pool size explicitly. It eagerly creates poolSize Fory instances, keeps them in shared fixed slots, and then lets any caller borrow one through a thread-agnostic fast path. Calls only block when every pooled instance is already in use; the runtime does not key cached instances by thread identity:
ThreadSafeFory fory = Fory.builder() .withXlang(false) .withRefTracking(false) .withCompatible(false) .withAsyncCompilation(true) .buildThreadSafeForyPool(poolSize);
// Single-thread Fory Fory fory = Fory.builder() .withXlang(false) .withRefTracking(false) .withCompatible(false) .withAsyncCompilation(true) .build(); // Thread-safe Fory (thread-safe Fory backed by a pool of Fory instances) ThreadSafeFory fory = Fory.builder() .withXlang(false) .withRefTracking(false) .withCompatible(false) .withAsyncCompilation(true) .buildThreadSafeFory(); // Explicit thread-local runtime ThreadSafeFory threadLocalFory = Fory.builder() .withXlang(false) .buildThreadLocalFory();
@ForyField, @Ignore, and integer encoding annotationsserializeEnumByName and @ForyEnumId