JavaScript Serialization Guide
Apache Fory JavaScript lets you serialize JavaScript and TypeScript objects to bytes and deserialize them back — including across services written in Java, Python, Go, Rust, Swift, and other Fory-supported languages.
Why Fory JavaScript?
- Xlang: serialize in JavaScript, deserialize in Java, Python, Go, and more without writing glue code
- Fast: serializer code is generated and cached the first time you register a schema, not on every call
- Reference-aware: shared references and circular object graphs are supported when enabled
- Explicit schemas: field types, nullability, and polymorphism are declared once with
Type.*builders or TypeScript decorators - Safe defaults: configurable depth, binary size, and collection size limits reject unexpectedly large or deep payloads
- Modern types:
bigint, typed arrays,Map,Set,Date,float16, andbfloat16are supported
Installation
Install the JavaScript packages from npm:
npm install @apache-fory/core
Optional Node.js string fast-path support is available through @apache-fory/hps:
npm install @apache-fory/core @apache-fory/hps
@apache-fory/hps depends on Node.js 20+ and is optional. If it is unavailable, Fory still works correctly; omit hps from the configuration.
Quick Start
import Fory, { Type } from "@apache-fory/core";
const userType = Type.struct(
{ typeName: "example.user" },
{
id: Type.int64(),
name: Type.string(),
age: Type.int32(),
},
);
const fory = new Fory();
const { serialize, deserialize } = fory.register(userType);
const bytes = serialize({
id: 1n,
name: "Alice",
age: 30,
});
const user = deserialize(bytes);
console.log(user);
// { id: 1n, name: 'Alice', age: 30 }
How it works
Fory is schema-driven. You describe the shape of your data once with Type.* builders (or TypeScript decorators), then call fory.register(schema). This returns a { serialize, deserialize } pair that is fast to call repeatedly.
// 1. Define the schema
const personType = Type.struct("example.person", {
name: Type.string(),
email: Type.string().setNullable(true),
});
// 2. Register once
const fory = new Fory();
const { serialize, deserialize } = fory.register(personType);
// 3. Use as many times as needed
const bytes = serialize({ name: "Alice", email: null });
const person = deserialize(bytes);
Create one Fory instance per application and reuse it — creating a new one for every request wastes the work of schema registration.
Configuration
Fory JavaScript is xlang-only. new Fory() uses compatible schema evolution by default. Configure
reference tracking, size limits, and optional Node.js string acceleration through constructor
options; see Configuration.
Documentation
| Topic | Description |
|---|---|
| Basic Serialization | Core APIs and everyday usage |
| Configuration | Runtime options, compatible mode, limits, and HPS |
| Type Registration | Numeric IDs, names, decorators, and schema registration |
| Schema Metadata | Type builders, field options, and decorators |
| Supported Types | Primitive, collection, time, enum, and struct mappings |
| References | Shared references and circular object graphs |
| Schema Evolution | Compatible mode and evolving structs |
| Xlang Serialization | Interop guidance and mapping rules |
| Troubleshooting | Common issues, limits, and debugging tips |