This PR adds Dart language support to Apache Fory™, implementing a comprehensive serialization solution for Dart and Flutter applications. Apache Fory™ Dart consists of approximately 15,000 lines of code and provides an efficient serialization mechanism that works within Flutter's reflection limitations.
Dart supports reflection, but Flutter explicitly prohibits it. To address this constraint, Apache Fory™ Dart uses a combination of:
This approach ensures compatibility with Flutter while maintaining the performance and flexibility expected from Apache Fory™.
import 'package:fory/fory.dart'; part 'example.g.dart'; @foryClass class SomeClass with _$SomeClassFory { late int id; late String name; late Map<String, double> map; SomeClass(this.id, this.name, this.map); SomeClass.noArgs(); }
After annotating your class with @foryClass, run:
dart run build_runner build
This generates the necessary code in example.g.dart and creates the _$SomeClassFory mixin.
Fory fory = Fory(ref: true); fory.register($SomeClass, typename: "example.SomeClass"); SomeClass obj = SomeClass(1, 'SomeClass', {'a': 1.0}); // Serialize Uint8List bytes = fory.serialize(obj); // Deserialize obj = fory.deserialize(bytes) as SomeClass;
import 'package:fory/fory.dart'; part 'example.g.dart'; @foryEnum enum EnumFoo { A, B }
Registration is similar to classes:
fory.register($EnumFoo, typename: "example.EnumFoo");
Apache Fory™ Dart currently supports the following type mappings in XLANG mode:
| Fory Type | Dart Type |
|---|---|
| bool | bool |
| int8 | fory.Int8 |
| int16 | fory.Int16 |
| int32 | fory.Int32 |
| var_int32 | fory.Int32 |
| int64 | int |
| var_int64 | int |
| sli_int64 | int |
| float32 | fory.Float32 |
| float64 | double |
| string | String |
| enum | Enum |
| named_enum | Enum |
| named_struct | class |
| list | List |
| set | Set (LinkedHashSet, HashSet, SplayTreeSet) |
| map | Map (LinkedHashMap, HashMap, SplayTreeMap) |
| timestamp | fory.TimeStamp |
| local_date | fory.LocalDate |
| binary | Uint8List |
| bool_array | BoolList |
| int8_array | Int8List |
| int16_array | Int16List |
| int32_array | Int32List |
| int64_array | Int64List |
| float32_array | Float32List |
| float64_array | Float64List |
The implementation is organized into three main components:
Codegen: Located at dart/packages/fory/lib/src/codegen Handles static code generation for serialization/deserialization.
ForyCore: Located at dart/packages/fory/lib/src Contains the core serialization and deserialization logic.
ForyTest: Located at dart/fory-test Comprehensive test suite for Apache Fory™ Dart functionality.
The test suite is inspired by Apache Fory™ Java's testing approach and includes:
Tests use the standard dart test framework.
To run tests:
# First, generate necessary code cd fory-test dart run build_runner build # Run all tests dart test # For more options (skipping tests, platform-specific tests, etc.) # See: https://github.com/dart-lang/test/blob/master/pkgs/test/README.md
Inside the fory-test/test_config directory you will find YAML configuration files required by certain tests (for example, the cross_language tests). Before executing those tests, please review and adjust the configs in fory-test/test_config (or provide your own) so that they match your environment.
Apache Fory™ Dart maintains high code quality standards. You can verify this using:
dart analyze dart fix --dry-run dart fix --apply
analyzer: '>=6.5.0 <8.0.0' build: ^2.4.1 build_config: ^1.1.0 collection: ^1.19.1 meta: ^1.14.0 source_gen: ^2.0.0 glob: ^2.1.3 decimal: ^3.2.1 lints: ^5.0.0 build_runner: ^2.4.6
path: ^1.9.1 yaml: ^3.1.3 lints: ^5.0.0 build: ^2.4.2 build_runner: ^2.4.15 test: ^1.24.0 checks: ^0.3.0 build_test: ^2.2.3 analyzer: '>=6.5.0 <8.0.0' collection: ^1.19.1