title: Overview sidebar_position: 1 id: 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
Fory Definition Language (FDL) is a schema definition language for Apache Fory that enables type-safe cross-language serialization. Define your data structures once and generate native data structure code for Java, Python, Go, Rust, and C++.
FDL provides a simple, intuitive syntax for defining cross-language data structures:
package example; enum Status [id=100] { PENDING = 0; ACTIVE = 1; COMPLETED = 2; } message User [id=101] { string name = 1; int32 age = 2; optional string email = 3; repeated string tags = 4; } message Order [id=102] { ref User customer = 1; repeated Item items = 2; Status status = 3; map<string, int32> metadata = 4; }
Define your data model once in FDL and generate consistent, type-safe code across all languages. This ensures:
Unlike generic IDLs, FDL is designed specifically for Fory serialization:
refoptional modifier for nullable typesGenerated code uses native language constructs:
@ForyField annotations#[derive(ForyObject)]FORY_STRUCT macroscd compiler pip install -e .
Create example.fdl:
package example; message Person [id=100] { string name = 1; int32 age = 2; optional string email = 3; }
# Generate for all languages foryc example.fdl --output ./generated # Generate for specific languages foryc example.fdl --lang java,python --output ./generated
Java:
Fory fory = Fory.builder().withLanguage(Language.XLANG).build(); ExampleForyRegistration.register(fory); Person person = new Person(); person.setName("Alice"); person.setAge(30); byte[] data = fory.serialize(person);
Python:
import pyfory from example import Person, register_example_types fory = pyfory.Fory() register_example_types(fory) person = Person(name="Alice", age=30) data = fory.serialize(person)
| Document | Description |
|---|---|
| FDL Syntax Reference | Complete language syntax and grammar |
| Type System | Primitive types, collections, and type rules |
| Compiler Guide | CLI options and build integration |
| Generated Code | Output format for each target language |
| Protocol Buffers IDL Support | Comparison with protobuf and migration guide |
| FlatBuffers IDL Support | FlatBuffers mapping rules and codegen differences |
FDL supports two registration modes:
Numeric Type IDs - Fast and compact:
message User [id=100] { ... } // Registered with ID 100
Namespace-based - Flexible and readable:
message Config { ... } // Registered as "package.Config"
optional: Field can be null/Noneref: Enable reference tracking for shared/circular referencesrepeated: Field is a list/arraymessage Example { optional string nullable = 1; ref Node parent = 2; repeated int32 numbers = 3; }
FDL types map to native types in each language:
| FDL Type | Java | Python | Go | Rust | C++ |
|---|---|---|---|---|---|
int32 | int | int | int32 | i32 | int32_t |
string | String | str | string | String | std::string |
bool | boolean | bool | bool | bool | bool |
See Type System for complete mappings.
optional explicitly: Make nullability clear in the schemaref for shared objects: Enable reference tracking when objects are sharedSee the examples directory for complete working examples.