title: Java Serialization Guide sidebar_position: 0 id: java_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().withLanguage(Language.JAVA) .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 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. ThreadSafeFory fory = new ThreadLocalFory(classLoader -> { Fory f = Fory.builder().withLanguage(Language.JAVA) .withClassLoader(classLoader).build(); f.register(SomeClass.class, 1); return f; }); byte[] bytes = fory.serialize(object); System.out.println(fory.deserialize(bytes)); } }
import java.util.List; import java.util.Arrays; import org.apache.fory.*; import org.apache.fory.config.*; public class Example { // reuse fory. private static final ThreadSafeFory fory = new ThreadLocalFory(classLoader -> { Fory f = Fory.builder().withLanguage(Language.JAVA) .withClassLoader(classLoader).build(); f.register(SomeClass.class, 1); return f; }); public static void main(String[] args) { SomeClass object = new SomeClass(); byte[] bytes = fory.serialize(object); System.out.println(fory.deserialize(bytes)); } }
Fory provides multiple options for thread-safe serialization:
Uses thread-local storage to maintain separate Fory instances per thread:
ThreadSafeFory fory = new ThreadLocalFory(classLoader -> { Fory f = Fory.builder().withLanguage(Language.JAVA) .withClassLoader(classLoader).build(); f.register(SomeClass.class, 1); return f; }); byte[] bytes = fory.serialize(object); System.out.println(fory.deserialize(bytes));
For virtual threads or environments where thread-local storage is not appropriate, use buildThreadSafeForyPool:
ThreadSafeFory fory = Fory.builder() .withLanguage(Language.JAVA) .withRefTracking(false) .withCompatibleMode(CompatibleMode.SCHEMA_CONSISTENT) .withAsyncCompilation(true) .buildThreadSafeForyPool(minPoolSize, maxPoolSize);
Note that calling buildThreadSafeFory() on ForyBuilder will create an instance of ThreadLocalFory. This may not be appropriate in environments where virtual threads are used, as each thread will create its own Fory instance, a relatively expensive operation. An alternative for virtual threads is to use buildThreadSafeForyPool.
// Single-thread Fory Fory fory = Fory.builder() .withLanguage(Language.JAVA) .withRefTracking(false) .withCompatibleMode(CompatibleMode.SCHEMA_CONSISTENT) .withAsyncCompilation(true) .build(); // Thread-safe Fory (ThreadLocalFory) ThreadSafeFory fory = Fory.builder() .withLanguage(Language.JAVA) .withRefTracking(false) .withCompatibleMode(CompatibleMode.SCHEMA_CONSISTENT) .withAsyncCompilation(true) .buildThreadSafeFory();