Skip to main content
Version: 0.16

Fory Creation

This page covers Scala-specific requirements for creating Fory instances.

Basic Setup​

When using Fory for Scala serialization, you must:

  1. Enable Scala optimization via withScalaOptimizationEnabled(true)
  2. Register Scala serializers via ScalaSerializers.registerSerializers(fory)
import org.apache.fory.Fory
import org.apache.fory.serializer.scala.ScalaSerializers

val fory = Fory.builder()
.withScalaOptimizationEnabled(true)
.build()

// Register optimized Fory serializers for Scala
ScalaSerializers.registerSerializers(fory)

Registering Scala Internal Types​

Depending on the object types you serialize, you may need to register some Scala internal types:

fory.register(Class.forName("scala.Enumeration.Val"))

To avoid such registration, you can disable class registration:

val fory = Fory.builder()
.withScalaOptimizationEnabled(true)
.requireClassRegistration(false)
.build()

Note: Disabling class registration allows deserialization of unknown types. This is more flexible but may be insecure if the classes contain malicious code.

Reference Tracking​

Circular references are common in Scala. Reference tracking should be enabled with withRefTracking(true):

val fory = Fory.builder()
.withScalaOptimizationEnabled(true)
.withRefTracking(true)
.build()

Note: If you don't enable reference tracking, StackOverflowError may occur for some Scala versions when serializing Scala Enumeration.

Thread Safety​

Fory instance creation is not cheap. Instances should be shared between multiple serializations.

Single-Thread Usage​

import org.apache.fory.Fory
import org.apache.fory.serializer.scala.ScalaSerializers

object ForyHolder {
val fory: Fory = {
val f = Fory.builder()
.withScalaOptimizationEnabled(true)
.build()
ScalaSerializers.registerSerializers(f)
f
}
}

Multi-Thread Usage​

For multi-threaded applications, use ThreadSafeFory:

import org.apache.fory.ThreadSafeFory
import org.apache.fory.ThreadLocalFory
import org.apache.fory.serializer.scala.ScalaSerializers

object ForyHolder {
val fory: ThreadSafeFory = new ThreadLocalFory(classLoader => {
val f = Fory.builder()
.withScalaOptimizationEnabled(true)
.withClassLoader(classLoader)
.build()
ScalaSerializers.registerSerializers(f)
f
})
}

Configuration​

All configuration options from Fory Java are available. See Java Configuration for the complete list.

Common options for Scala:

import org.apache.fory.Fory
import org.apache.fory.config.CompatibleMode
import org.apache.fory.serializer.scala.ScalaSerializers

val fory = Fory.builder()
.withScalaOptimizationEnabled(true)
// Enable reference tracking for circular references
.withRefTracking(true)
// Enable schema evolution support
.withCompatibleMode(CompatibleMode.COMPATIBLE)
// Enable async compilation for better startup performance
.withAsyncCompilation(true)
.build()

ScalaSerializers.registerSerializers(fory)