Apache Fory™ Dart is the Dart xlang runtime for Apache Fory™. It reads and writes Fory's cross-language wire format and works in both Dart and Flutter applications. Because Flutter prohibits dart:mirrors, the runtime uses static code generation for type handling.
The publishable package lives at packages/fory/. See its README for the full user-facing documentation including getting started, API reference, and code examples.
| Directory | Description |
|---|---|
packages/fory/lib/ | Core runtime and public API |
packages/fory/lib/src/codegen/ | Build-runner code generator |
packages/fory/example/ | Annotated example with generated output |
packages/fory/test/ | Unit and integration tests |
test/ | Cross-language integration tests |
| Fory xlang type | Dart type |
|---|---|
| bool | bool |
| int8 | int + @ForyField(type: Int8Type()) |
| int16 | int + @ForyField(type: Int16Type()) |
| int32 | int + @ForyField(type: Int32Type()) |
| int64 | int or Int64 |
| uint8 | int + @ForyField(type: Uint8Type()) |
| uint16 | int + @ForyField(type: Uint16Type()) |
| uint32 | int + @ForyField(type: Uint32Type()) |
| uint64 | int or Uint64 |
| float16 | double + @ForyField(type: Float16Type()) |
| bfloat16 | double + @ForyField(type: Bfloat16Type()) |
| float32 | fory.Float32 (wrapper) |
| float64 | double |
| string | String |
| binary | Uint8List |
| local_date | LocalDate |
| timestamp | Timestamp |
| list | List |
| set | Set |
| map | Map |
| enum | enum |
| named_struct | class |
| array | BoolList + @ArrayField(element: BoolType()) |
| array | Int8List |
| array | Int16List |
| array | Int32List |
| array | Int64List |
| array | Uint8List |
| array | Uint16List |
| array | Uint32List |
| array | Uint64List |
| array | Float16List |
| array | Bfloat16List |
| array | Float32List |
| array | Float64List |
Annotate your model and run the code generator:
import 'package:fory/fory.dart'; part 'person.fory.dart'; @ForyStruct() class Person { Person(); String name = ''; @ForyField(type: Int32Type()) int age = 0; }
dart run build_runner build --delete-conflicting-outputs
Serialize and deserialize:
final fory = Fory(); PersonForyModule.register(fory, Person, namespace: 'example', typeName: 'Person'); final bytes = fory.serialize(Person()..name = 'Ada'..age = 36); final roundTrip = fory.deserialize<Person>(bytes);
Run tests from the workspace root:
cd packages/fory dart test
Run the code generator on the example:
cd packages/fory dart run build_runner build --delete-conflicting-outputs