Releases: apache/fory
v1.0.0
The Apache Fory team is pleased to announce the 1.0.0 release. This milestone release includes 84 PRs from 11 distinct contributors and turns the cross-language runtime into the default path across supported languages. See the Install page to get the libraries for your platform.
Highlights
Apache Fory 1.0.0 standardizes the cross-language serialization model. The unified xlang type system is now the default mode across languages, with compatible-mode reads, simplified field ordering, and better list/array compatibility. The release also adds decimal and bfloat16 support for xlang serialization.
The language runtimes continue to converge around the same schema and metadata model. Nested container and field codec support landed across Rust, C++, C#, Go, Dart, Python, and Swift. Kotlin gains xlang, KSP, and schema IDL support, while Scala adds schema IDL support and updated generated annotations.
This release also expands deployment coverage and performance work. Java gains Android serialization support, annotation processor support and nested type-use serialization metadata. Dart typed-container fast paths and generated struct optimizations improve throughput, alongside refreshed benchmark plots.
Key Features:
- Unified xlang type system and default xlang mode: #3644, #3685
- Decimal and bfloat16 support for xlang serialization: #3599, #3605
- Nested container and field codec support: #3625, #3630, #3636, #3639, #3640, #3641, #3643
- Kotlin xlang, KSP, and schema IDL support: #3679, #3684
- Scala schema IDL support and generated annotation updates: #3681, #3682
- Android serialization and Java annotation processor support: #3667, #3670
- Xlang compatible-mode improvements: #3648, #3650, #3675
- Serialization performance improvements: #3609, #3653, #3656, #3661
- Java row accessors and nested type-use metadata: #3631, #3633
Features
- feat(ci): fix release for csharp and dart by @chaokunyang in #3582
- feat(rust): add configurable size guardrails by @ayush00git in #3579
- refactor(rust): move Fory configuration to builder by @chaokunyang in #3593
- feat(xlang): add decimal and align serializers for xlang by @chaokunyang in #3599
- refactor(dart): aligned dart internal implementation by @Geethapranay1 in #3601
- feat(xlang): add bfloat16 support by @chaokunyang in #3605
- feat(dart): support dart web platform by @chaokunyang in #3608
- perf(dart): typed-container write fast path with scan elimination by @yash-agarwa-l in #3609
- feat(swift): nested container override support for swift by @chaokunyang in #3625
- feat(java): add schema typed row fields accessor by @chaokunyang in #3631
- feat: add nested container codec for rust by @chaokunyang in #3630
- feat(java): support nested type-use serialization metadata by @chaokunyang in #3633
- refactor(cpp): remove abseil dependency by @chaokunyang in #3634
- feat(cpp): add nested field codec support by @chaokunyang in #3636
- feat(csharp): support nested container field codec by @chaokunyang in #3639
- feat(go): support nested field annotation type specs by @chaokunyang in #3640
- feat(dart): support nested container field codec for dart by @chaokunyang in #3641
- feat(python): support nested field schema encodings by @chaokunyang in #3643
- feat(xlang): unified xlang type system by @chaokunyang in #3644
- feat(xlang): add comprehensive read checks by @chaokunyang in #3647
- feat(xlang): use compatible for xlang by default by @chaokunyang in #3648
- feat(xlang): compatible read between list array field by @chaokunyang in #3650
- perf(dart): remove generated struct slot bridge by @chaokunyang in #3653
- perf: optimize serialization perf by @chaokunyang in #3656
- perf: update benchmark plots by @chaokunyang in #3661
- refactor(rust): use absolute path in generated Rust code by @BaldDemian in #3666
- feat: add android support by @chaokunyang in #3667
- feat(compiler): add helpers to generate unified gRPC service/method names by @BaldDemian in #3672
- feat(java): annotation processor for android serialization by @chaokunyang in #3670
- feat(xlang): simplify xlang field ordering by @chaokunyang in #3675
- feat(kotlin): add kotlin xlang and ksp support by @chaokunyang in #3679
- refactor(java): replace static serializer spi lookup by @chaokunyang in #3680
- feat(scala): add scala schema idl support by @chaokunyang in #3681
- feat(scala): update generated annotation by @chaokunyang in #3682
- feat(rust): make rust chrono optional by @chaokunyang in #3683
- feat(kotlin): add schema idl support to kotlin by @chaokunyang in #3684
- feat(xlang): use xlang as default mode for all languages by @chaokunyang in #3685
Bug Fixes
- fix(dart): resolve fory pub.dev score issues by @chaokunyang in #3585
- fix(dart): fix dart ci by @chaokunyang in #3586
- fix(dart): use getUint32 for correctly encoding u64 value by @ayush00git in #3592
- fix(c++): fix c++ duration serialization by @chaokunyang in #3598
- fix(javascript): align TypeMeta preamble constants with python/java/rust/go xlang bindings by @emrul in #3603
- fix(javascript): fix javascript schema idl tests by @chaokunyang in #3604
- fix(dart): added
>>>for correct logical right shift semantics in uint by @ayush00git in #3607 - fix(go): ensure physical buffer space for unsafe varint fast-paths by @ayush00git in #3613
- fix(go): add bound checking for refResolver and metaStringResolver reads by @ayush00git in #3615
- fix(go): added pre-allocation bounds checks for slices and strings by @ayush00git in #3618
- fix(go): added maxBinarySize limit to decimal deserialization by @ayush00git in #3623
- fix(go): add configurable fieldCount and fieldDepth guardrails by @ayush00git in #3620
- fix(java): honor record field encoding in generated decode by @mandrean in #3626
- fix(java): preserve externalizable containers in compatible mode by @mandrean in #3628
- fix(python): enforce more checks in read by @chaokunyang in #3632
- fix(xlang): fix xlang type system by @chaokunyang in #3646
- fix(java): use REPLACE_STUB_ID for unregistered writeReplace classes to prevent cross-JVM ClassNotFoundException by @wakilurislam in #3638
- fix(java): fix set view ref tracking by @chaokunyang in #3649
- fix(java): recover map declared serializers for compatible reads by @mandrean in #3654
- fix: include TypeMeta header bits in hash by @chaokunyang in #3659
- fix(java): serialize suppressed exceptions by @chaokunyang in #3663
- fix(javascript): preserve getTypeInfo in regenerated read serializer by @xhzq233 in #3669
- fix(java): validate subclass serializer layer counts by @chaokunyang in #3676
- fix(java): avoid instantiating abstract meta-share types by @chaokunyang in #3677
- fix: fix release script by @chaokunyang in #3687...
v1.0.0-rc1
Highlights
- Unified the xlang type system and made xlang the default mode across languages: #3644, #3685
- Added decimal and bfloat16 support for xlang serialization: #3599, #3605
- Added nested container and field codec support across Rust, C++, C#, Go, Dart, Python, and Swift: #3625, #3630, #3636, #3639, #3640, #3641, #3643
- Added Kotlin xlang, KSP, and schema IDL support: #3679, #3684
- Added Scala schema IDL support and updated generated annotations: #3681, #3682
- Added Android serialization support, including Java annotation processor support: #3667, #3670
- Improved xlang compatibility with default compatible mode, simplified field ordering, and list/array compatible reads: #3648, #3650, #3675
- Improved serialization performance, including Dart typed-container fast paths and generated struct optimizations: #3609, #3653, #3656, #3661
- Added Java schema typed row field accessors and nested type-use serialization metadata: #3631, #3633
Features
- feat(ci): fix release for csharp and dart by @chaokunyang in #3582
- feat(rust): add configurable size guardrails by @ayush00git in #3579
- refactor(rust): move Fory configuration to builder by @chaokunyang in #3593
- feat(xlang): add decimal and align serializers for xlang by @chaokunyang in #3599
- refactor(dart): aligned dart internal implementation by @Geethapranay1 in #3601
- feat(xlang): add bfloat16 support by @chaokunyang in #3605
- feat(dart): support dart web platform by @chaokunyang in #3608
- perf(dart): typed-container write fast path with scan elimination by @yash-agarwa-l in #3609
- feat(swift): nested container override support for swift by @chaokunyang in #3625
- feat(java): add schema typed row fields accessor by @chaokunyang in #3631
- feat: add nested container codec for rust by @chaokunyang in #3630
- feat(java): support nested type-use serialization metadata by @chaokunyang in #3633
- refactor(cpp): remove abseil dependency by @chaokunyang in #3634
- feat(cpp): add nested field codec support by @chaokunyang in #3636
- feat(csharp): support nested container field codec by @chaokunyang in #3639
- feat(go): support nested field annotation type specs by @chaokunyang in #3640
- feat(dart): support nested container field codec for dart by @chaokunyang in #3641
- feat(python): support nested field schema encodings by @chaokunyang in #3643
- feat(xlang): unified xlang type system by @chaokunyang in #3644
- feat(xlang): add comprehensive read checks by @chaokunyang in #3647
- feat(xlang): use compatible for xlang by default by @chaokunyang in #3648
- feat(xlang): compatible read between list array field by @chaokunyang in #3650
- perf(dart): remove generated struct slot bridge by @chaokunyang in #3653
- perf: optimize serialization perf by @chaokunyang in #3656
- perf: update benchmark plots by @chaokunyang in #3661
- refactor(rust): use absolute path in generated Rust code by @BaldDemian in #3666
- feat: add android support by @chaokunyang in #3667
- feat(compiler): add helpers to generate unified gRPC service/method names by @BaldDemian in #3672
- feat(java): annotation processor for android serialization by @chaokunyang in #3670
- feat(xlang): simplify xlang field ordering by @chaokunyang in #3675
- feat(kotlin): add kotlin xlang and ksp support by @chaokunyang in #3679
- refactor(java): replace static serializer spi lookup by @chaokunyang in #3680
- feat(scala): add scala schema idl support by @chaokunyang in #3681
- feat(scala): update generated annotation by @chaokunyang in #3682
- feat(rust): make rust chrono optional by @chaokunyang in #3683
- feat(kotlin): add schema idl support to kotlin by @chaokunyang in #3684
- feat(xlang): use xlang as default mode for all languages by @chaokunyang in #3685
Bug Fix
- fix(dart): resolve fory pub.dev score issues by @chaokunyang in #3585
- fix(dart): fix dart ci by @chaokunyang in #3586
- fix(dart): use getUint32 for correctly encoding u64 value by @ayush00git in #3592
- fix(c++): fix c++ duration serialization by @chaokunyang in #3598
- fix(javascript): align TypeMeta preamble constants with python/java/rust/go xlang bindings by @emrul in #3603
- fix(javascript): fix javascript schema idl tests by @chaokunyang in #3604
- fix(dart): added <<< for correct logical right shift semantics in uint by @ayush00git in #3607
- fix(go): ensure physical buffer space for unsafe varint fast-paths by @ayush00git in #3613
- fix(go): add bound checking for refResolver and metaStringResolver reads by @ayush00git in #3615
- fix(go): added pre-allocation bounds checks for slices and strings by @ayush00git in #3618
- fix(go): added maxBinarySize limit to decimal deserialization by @ayush00git in #3623
- fix(go): add configurable fieldCount and fieldDepth guardrails by @ayush00git in #3620
- fix(java): honor record field encoding in generated decode by @mandrean in #3626
- fix(java): preserve externalizable containers in compatible mode by @mandrean in #3628
- fix(python): enforce more checks in read by @chaokunyang in #3632
- fix(xlang): fix xlang type system by @chaokunyang in #3646
- fix(java): use REPLACE_STUB_ID for unregistered writeReplace classes to prevent cross-JVM ClassNotFoundException by @wakilurislam in #3638
- fix(java): fix set view ref tracking by @chaokunyang in #3649
- fix(java): recover map declared serializers for compatible reads by @mandrean in #3654
- fix: include TypeMeta header bits in hash by @chaokunyang in #3659
- fix(java): serialize suppressed exceptions by @chaokunyang in #3663
- fix(javascript): preserve getTypeInfo in regenerated read serializer by @xhzq233 in #3669
- fix(java): validate subclass serializer layer counts by @chaokunyang in #3676
- fix(java): avoid instantiating abstract meta-share types by @chaokunyang in #3677
- fix: fix release script by @chaokunyang in #3687
Other Improvements
- chore: bump releasse version to 0.17.0 by @chaokunyang in #3583
- chore: skip auto release for tag starts with go by @chaokunyang in #3584
- docs: add NuGet badge by @chaokunyang in #3587
- docs(java): update graalvm guide location by @chaokunyang in #3588
- docs: rename graalvm_support.md to graalvm-support.md by @chaokunyang in #3589
- chore(rust): refine varint read/write method name by @chaokunyang in #3590
- docs: move development guide to docs root by @chaokunyang in #3591
- chore(dart): add missing license headers by @chaokunyang in #3594
- chore(csharp): add more csharp and swift tests by @chaokunyang in #3597
- chore(dart): refine dart xlang serializati...
v0.17.0
The Apache Fory team is pleased to announce the 0.17.0 release. This is a major release that includes 71 PR from 19 distinct contributors. See the Install Page to learn how to get the libraries for your platform.
JavaScript/NodeJS Serialization: First Release
Apache Fory 0.17.0 marks the first release with official JavaScript/NodeJS
documentation, benchmark coverage, and TypeScript-friendly IDL code generation.
The JavaScript runtime is built for modern Node.js services and TypeScript
codebases, while preserving Fory's cross-language object model, schema-driven
APIs, and optional reference tracking.
Key capabilities:
- High-performance serialization for JavaScript and TypeScript objects in Node.js
- Cross-language compatibility with Java, Python, Go, Rust, C#, Swift, and Dart
- Schema-driven APIs via
Type.*builders and TypeScript decorators - Optional reference tracking for shared and circular object graphs
- Compatible mode for schema evolution
- Configurable depth, binary size, and collection size guardrails
- JavaScript/TypeScript target support in the Fory IDL/compiler workflow
- Optional
@apache-fory/hpsfast string path for Node.js 20+
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);- JavaScript guide: https://fory.apache.org/docs/guide/javascript/
- Compiler docs: https://fory.apache.org/docs/compiler/
JavaScript Benchmarks
Below are throughput results (ops/sec; higher is better) comparing Fory with
Protocol Buffers and JSON across representative data structures.
| Datatype | Operation | Fory TPS | Protobuf TPS | JSON TPS | Fastest |
|---|---|---|---|---|---|
| Struct | Serialize | 8,453,950 | 1,903,706 | 3,058,232 | fory |
| Struct | Deserialize | 9,705,287 | 8,233,664 | 3,860,538 | fory |
| Sample | Serialize | 1,498,391 | 422,620 | 744,790 | fory |
| Sample | Deserialize | 1,918,162 | 819,010 | 762,048 | fory |
| MediaContent | Serialize | 1,293,157 | 729,497 | 1,299,908 | json |
| MediaContent | Deserialize | 1,638,086 | 1,209,140 | 921,191 | fory |
| StructList | Serialize | 3,928,325 | 495,648 | 891,810 | fory |
| StructList | Deserialize | 3,264,827 | 1,529,744 | 986,144 | fory |
| SampleList | Serialize | 355,581 | 92,741 | 163,120 | fory |
| SampleList | Deserialize | 424,916 | 163,253 | 162,520 | fory |
| MediaContentList | Serialize | 286,053 | 148,977 | 282,445 | fory |
| MediaContentList | Deserialize | 376,826 | 244,622 | 190,155 | fory |
Serialized data sizes (bytes):
| Datatype | Fory | Protobuf | JSON |
|---|---|---|---|
| Struct | 58 | 61 | 103 |
| Sample | 446 | 377 | 724 |
| MediaContent | 391 | 307 | 596 |
| StructList | 184 | 315 | 537 |
| SampleList | 1980 | 1900 | 3642 |
| MediaContentList | 1665 | 1550 | 3009 |
Benchmark details: https://github.com/apache/fory/tree/v0.17.0/benchmarks/javascript
Dart Serialization: First Release
Apache Fory 0.17.0 also marks the first release with official Dart
documentation, benchmark coverage, a rebuilt runtime, and Dart IDL support.
The Dart implementation focuses on generated serializers, stable
cross-language type identity, schema evolution, and predictable APIs for
service workloads.
Key capabilities:
- High-performance Dart serialization with generated code instead of reflection
- Cross-language compatibility with Java, Python, Go, Rust, C#, Swift, and JavaScript
@ForyStructand@ForyFieldannotations withbuild_runnercode generation- Compatible mode for schema evolution across versions
- Optional reference tracking for shared and circular object graphs
- Manual
Serializer<T>extension points for advanced or custom types - Dart target support in the Fory IDL/compiler workflow
Quick Start
import 'package:fory/fory.dart';
part 'person.fory.dart';
enum Color {
red,
blue,
}
@ForyStruct()
class Person {
Person();
String name = '';
Int32 age = Int32(0);
Color favoriteColor = Color.red;
}
void main() {
final fory = Fory();
PersonFory.register(
fory,
Color,
namespace: 'example',
typeName: 'Color',
);
PersonFory.register(
fory,
Person,
namespace: 'example',
typeName: 'Person',
);
final bytes = fory.serialize(Person()
..name = 'Ada'
..age = Int32(36)
..favoriteColor = Color.blue);
final roundTrip = fory.deserialize<Person>(bytes);
print(roundTrip.name);
}- Dart guide: https://fory.apache.org/docs/guide/dart/
- Compiler docs: https://fory.apache.org/docs/compiler/
Dart Benchmarks
Below are throughput results (ops/sec; higher is better) comparing Fory with
Protocol Buffers across representative data structures.
| Datatype | Operation | Fory TPS | Protobuf TPS | Fastest |
|---|---|---|---|---|
| Struct | Serialize | 3,989,432 | 1,884,653 | fory (2.12x) |
| Struct | Deserialize | 5,828,197 | 4,199,680 | fory (1.39x) |
| Sample | Serialize | 1,649,722 | 500,167 | fory (3.30x) |
| Sample | Deserialize | 2,060,113 | 785,109 | fory (2.62x) |
| MediaContent | Serialize | 800,876 | 391,235 | fory (2.05x) |
| MediaContent | Deserialize | 1,315,115 | 683,533 | fory (1.92x) |
| StructList | Serialize | 1,456,396 | 367,506 | fory (3.96x) |
| StructList | Deserialize | 1,921,006 | 645,958 | fory (2.97x) |
| SampleList | Serialize | 411,144 | 48,508 | fory (8.48x) |
| SampleList | Deserialize | 464,273 | 103,558 | fory (4.48x) |
| MediaContentList | Serialize | 186,870 | 77,029 | fory (2.43x) |
| MediaContentList | Deserialize | 330,293 | 128,215 | fory (2.58x) |
Serialized data sizes (bytes):
| Datatype | Fory | Protobuf |
|---|---|---|
| Struct | 58 | 61 |
| Sample | 446 | 377 |
| MediaContent | 365 | 307 |
| StructList | 184 | 315 |
| SampleList | 1980 | 1900 |
| MediaContentList | 1535 | 1550 |
Benchmark details: https://github.com/apache/fory/tree/v0.17.0/benchmarks/dart
Highlights
- refactor(java): refactor fory java serialization api by @chaokunyang in #3537
- refactor(python): refactor python serialization api by @chaokunyang in #3543
- feat(java): reduce java serializer memory usage by share across Fory instances by @chaokunyang in #3546
- feat(java): remove guava dependency from fory java by @chaokunyang in #3557
- refactor(dart): new dart implementation by @chaokunyang in #3551
Features
- refactor(javascript): rename apache-fory/fory to apache-fory/core by @chaokunyang in #3489
- feat(ci): add bazel downloads retry by @BaldDemian in #3492
- feat(go): add configurable size guardrails by @ayush00git in #3475
- refactor(ci): install Bazel using setup-bazel by @BaldDemian in #3494
- perf(rust): Rewrite Rust benchmarks around shared bench.proto data by @chaokunyang in #3497
- feat(cpp): add float16 to c++ by @UninspiredCarrot in #3487
- feat(java): add float support by @mengnankkkk in #3254
- feat(java): support java virtual threads by @chaokunyang in #3522
- perf(java): optimize thread safe fory for java by @chaokunyang in #3529
- test(cpp): optimize float16 sign symmetry test for ASAN by @Geethapranay1 in #3531
- feat(java): add dedicated exception serializers by @chaokunyang in #3536
- refactor(java): refactor fory java serialization api by @chaokunyang in #3537
- refactor(python): refactor python serialization api by @chaokunyang in #3543
- feat(dart): Introduce id based enum serialization by @yash-agarwa-l in #3482
- feat(javascript): add configurable size guardrails by @ayush00git in #3539
- feat(java): reduce java serializer memory usage by share across Fory instances by @chaokunyang in #3546
- refactor(javascript): move serialization runtime state into contexts by @chaokunyang in #3549
- refactor(swift): refine swift api by @chaokunyang i...
v0.17.0-rc2
Highlights
- refactor(java): refactor fory java serialization api by @chaokunyang in #3537
- refactor(python): refactor python serialization api by @chaokunyang in #3543
- feat(java): reduce java serializer memory usage by share across Fory instances by @chaokunyang in #3546
- feat(java): remove guava dependency from fory java by @chaokunyang in #3557
- refactor(dart): new dart implementation by @chaokunyang in #3551
Features
- refactor(javascript): rename apache-fory/fory to apache-fory/core by @chaokunyang in #3489
- feat(ci): add bazel downloads retry by @BaldDemian in #3492
- feat(go): add configurable size guardrails by @ayush00git in #3475
- refactor(ci): install Bazel using setup-bazel by @BaldDemian in #3494
- perf(rust): Rewrite Rust benchmarks around shared bench.proto data by @chaokunyang in #3497
- feat(cpp): add float16 to c++ by @UninspiredCarrot in #3487
- feat(java): add float support by @mengnankkkk in #3254
- feat(java): support java virtual threads by @chaokunyang in #3522
- perf(java): optimize thread safe fory for java by @chaokunyang in #3529
- test(cpp): optimize float16 sign symmetry test for ASAN by @Geethapranay1 in #3531
- feat(java): add dedicated exception serializers by @chaokunyang in #3536
- refactor(java): refactor fory java serialization api by @chaokunyang in #3537
- refactor(python): refactor python serialization api by @chaokunyang in #3543
- feat(dart): Introduce id based enum serialization by @yash-agarwa-l in #3482
- feat(javascript): add configurable size guardrails by @ayush00git in #3539
- feat(java): reduce java serializer memory usage by share across Fory instances by @chaokunyang in #3546
- refactor(javascript): move serialization runtime state into contexts by @chaokunyang in #3549
- refactor(swift): refine swift api by @chaokunyang in #3554
- feat(xlang): refine xlang api and enum serialization by @chaokunyang in #3555
- feat(java): remove guava dependency from fory java by @chaokunyang in #3557
- refactor(dart): new dart implementation by @chaokunyang in #3551
- feat(compiler): Add JavaScript/TypeScript IDL code generation by @miantalha45 in #3394
- perf(javascript): add javascript benchmark by @chaokunyang in #3562
- perf(dart): optimize struct deserialize with direct dispatch codegen by @yash-agarwa-l in #3563
- feat(dart): add dart IDL support by @chaokunyang in #3571
- feat(python): fix python struct xlang ref track error by @chaokunyang in #3574
- feat: make generate enum use id for wire format by @chaokunyang in #3576
Bug Fix
- fix(java): Restore compact codec fixed width optimizations by @stevenschlansker in #3478
- fix(rust): handle panics from fuzz-found edge cases by @utafrali in #3481
- fix(rust): add error handling logic for std duration; add support for chrono duration by @BaldDemian in #3490
- fix(compiler): validate rpc request/response types by @retryoos in #3493
- fix(c++): fix misaligned address access errors detected by UBSan in buffer.h by @BaldDemian in #3479
- fix(java): finalize codegen config hash on first use by @chaokunyang in #3495
- fix(rust): fix several panics detected by cargo-fuzz by @BaldDemian in #3483
- fix(java): handle private final map codegen by @chaokunyang in #3504
- fix(compiler): repair broken service example and add regression coverage by @VikingDeng in #3505
- fix(rust): deep clone TypeMeta to prevent UB in concurrent scenarios by @BaldDemian in #3511
- fix(compiler): fix failed tests in compiler; add compiler CI by @BaldDemian in #3516
- fix(compiler): allow qualified nested types in FDL rpc signatures by @VikingDeng in #3518
- fix(java): preserve ConcurrentSkipListSet comparator on copy by @mandrean in #3520
- test(compiler): add IR validation and codegen tests for gRPC service support by @darius024 in #3528
- fix(java): Correct resolution of dependent/nested serializers in GraalVM by @rakow in #3532
- fix(java): fix objectstream serializer async jit and graalvm support by @chaokunyang in #3534
- ci: fix Bazel cache paths for C++ workflows by @chaokunyang in #3535
- fix(python): fix wrong calling orders in visit_other by @BaldDemian in #3542
- fix(js): corrected the float64 array size by @ayush00git in #3541
- fix(java): configure type checker during build by @chaokunyang in #3550
- fix(java): auto-select child serializers for sorted containers by @chaokunyang in #3552
- fix(java): support skip optional sql serializers for java11+ by @chaokunyang in #3553
- fix(rust): apply consistent pascalcase naming for nested types by @utafrali in #3548
- fix(javascript): fix flaky javascript idl tests by @chaokunyang in #3565
- fix(swift): fix swift generated code compile warnings by @chaokunyang in #3566
- fix(java): add test for previous uncaught regression. by @PiotrDuz in #3573
Other Improvements
- chore(java): Update Spotless and Checkstyle to allow building with JDK25 by @stevenschlansker in #3476
- chore(java): Clean up Javadoc warnings, and fail the build if any new ones are introduced by @stevenschlansker in #3477
- chore: bump version to 0.16.0 by @chaokunyang in #3488
- docs: add python benchmark result to readme by @chaokunyang in #3496
- docs: fix benchmark plots by @chaokunyang in #3498
- docs: add fory code review skill by @chaokunyang in #3500
- chore: adjust skills softlinks by @chaokunyang in #3501
- chore(cpp): configure CI to extract and execute C++ code from Markdo… by @Tyooughtul in #3381
- docs: improve comments in Java generator by @codewithtarun2005 in #3507
- docs: refactor agents.md to reduce token usage by @chaokunyang in #3538
- docs: add ai-review policy by @chaokunyang in #3545
- chore: Bump org.apache.logging.log4j:log4j-core from 2.25.3 to 2.25.4 in /java/fory-test-core by @dependabot[bot] in #3556
- chore(javascript): rename ref tracking to ref by @chaokunyang in #3559
- docs(dart): add dart docs by @chaokunyang in #3560
- docs(javascript): add javascript docs by @chaokunyang in #3561
- docs: refine dart and javascript docs by @chaokunyang in #3567
- docs(dart): update dart benchmark docs by @yash-agarwa-l in #3568
- docs: update readme by @chaokunyang in #3575
New Contributors
- @utafrali made their first contribution in #3481
- @BaldDemian made their first contribution in #3490
- @retryoos made their first contribution in #3493
- @Tyooughtul made their first contribution in #3381
- @UninspiredCarrot made their first contribution in #3487
- @VikingDeng made their first contribution in #3505
- @codewithtarun2005 made their first contribution in #3507
- @darius024 made their first contribution in #3528
- @rakow made their first contribution in #3532
- @PiotrDuz made their first contribution in #3573
Full Changelog: v0.16.0...v0.17.0-rc2
v0.17.0-rc1
Highlights
- refactor(java): refactor fory java serialization api by @chaokunyang in #3537
- refactor(python): refactor python serialization api by @chaokunyang in #3543
- feat(java): reduce java serializer memory usage by share across Fory instances by @chaokunyang in #3546
- feat(java): remove guava dependency from fory java by @chaokunyang in #3557
- refactor(dart): new dart implementation by @chaokunyang in #3551
Features
- refactor(javascript): rename apache-fory/fory to apache-fory/core by @chaokunyang in #3489
- feat(ci): add bazel downloads retry by @BaldDemian in #3492
- feat(go): add configurable size guardrails by @ayush00git in #3475
- refactor(ci): install Bazel using setup-bazel by @BaldDemian in #3494
- perf(rust): Rewrite Rust benchmarks around shared bench.proto data by @chaokunyang in #3497
- feat(cpp): add float16 to c++ by @UninspiredCarrot in #3487
- feat(java): add float support by @mengnankkkk in #3254
- feat(java): support java virtual threads by @chaokunyang in #3522
- perf(java): optimize thread safe fory for java by @chaokunyang in #3529
- test(cpp): optimize float16 sign symmetry test for ASAN by @Geethapranay1 in #3531
- feat(java): add dedicated exception serializers by @chaokunyang in #3536
- refactor(java): refactor fory java serialization api by @chaokunyang in #3537
- refactor(python): refactor python serialization api by @chaokunyang in #3543
- feat(dart): Introduce id based enum serialization by @yash-agarwa-l in #3482
- feat(javascript): add configurable size guardrails by @ayush00git in #3539
- feat(java): reduce java serializer memory usage by share across Fory instances by @chaokunyang in #3546
- refactor(javascript): move serialization runtime state into contexts by @chaokunyang in #3549
- refactor(swift): refine swift api by @chaokunyang in #3554
- feat(xlang): refine xlang api and enum serialization by @chaokunyang in #3555
- feat(java): remove guava dependency from fory java by @chaokunyang in #3557
- refactor(dart): new dart implementation by @chaokunyang in #3551
- feat(compiler): Add JavaScript/TypeScript IDL code generation by @miantalha45 in #3394
- perf(javascript): add javascript benchmark by @chaokunyang in #3562
- perf(dart): optimize struct deserialize with direct dispatch codegen by @yash-agarwa-l in #3563
- feat(dart): add dart IDL support by @chaokunyang in #3571
- feat(python): fix python struct xlang ref track error by @chaokunyang in #3574
- feat: make generate enum use id for wire format by @chaokunyang in #3576
Bug Fix
- fix(java): Restore compact codec fixed width optimizations by @stevenschlansker in #3478
- fix(rust): handle panics from fuzz-found edge cases by @utafrali in #3481
- fix(rust): add error handling logic for std duration; add support for chrono duration by @BaldDemian in #3490
- fix(compiler): validate rpc request/response types by @retryoos in #3493
- fix(c++): fix misaligned address access errors detected by UBSan in buffer.h by @BaldDemian in #3479
- fix(java): finalize codegen config hash on first use by @chaokunyang in #3495
- fix(rust): fix several panics detected by cargo-fuzz by @BaldDemian in #3483
- fix(java): handle private final map codegen by @chaokunyang in #3504
- fix(compiler): repair broken service example and add regression coverage by @VikingDeng in #3505
- fix(rust): deep clone TypeMeta to prevent UB in concurrent scenarios by @BaldDemian in #3511
- fix(compiler): fix failed tests in compiler; add compiler CI by @BaldDemian in #3516
- fix(compiler): allow qualified nested types in FDL rpc signatures by @VikingDeng in #3518
- fix(java): preserve ConcurrentSkipListSet comparator on copy by @mandrean in #3520
- test(compiler): add IR validation and codegen tests for gRPC service support by @darius024 in #3528
- fix(java): Correct resolution of dependent/nested serializers in GraalVM by @rakow in #3532
- fix(java): fix objectstream serializer async jit and graalvm support by @chaokunyang in #3534
- ci: fix Bazel cache paths for C++ workflows by @chaokunyang in #3535
- fix(python): fix wrong calling orders in visit_other by @BaldDemian in #3542
- fix(js): corrected the float64 array size by @ayush00git in #3541
- fix(java): configure type checker during build by @chaokunyang in #3550
- fix(java): auto-select child serializers for sorted containers by @chaokunyang in #3552
- fix(java): support skip optional sql serializers for java11+ by @chaokunyang in #3553
- fix(rust): apply consistent pascalcase naming for nested types by @utafrali in #3548
- fix(javascript): fix flaky javascript idl tests by @chaokunyang in #3565
- fix(swift): fix swift generated code compile warnings by @chaokunyang in #3566
- fix(java): add test for previous uncaught regression. by @PiotrDuz in #3573
Other Improvements
- chore(java): Update Spotless and Checkstyle to allow building with JDK25 by @stevenschlansker in #3476
- chore(java): Clean up Javadoc warnings, and fail the build if any new ones are introduced by @stevenschlansker in #3477
- chore: bump version to 0.16.0 by @chaokunyang in #3488
- docs: add python benchmark result to readme by @chaokunyang in #3496
- docs: fix benchmark plots by @chaokunyang in #3498
- docs: add fory code review skill by @chaokunyang in #3500
- chore: adjust skills softlinks by @chaokunyang in #3501
- chore(cpp): configure CI to extract and execute C++ code from Markdo… by @Tyooughtul in #3381
- docs: improve comments in Java generator by @codewithtarun2005 in #3507
- docs: refactor agents.md to reduce token usage by @chaokunyang in #3538
- docs: add ai-review policy by @chaokunyang in #3545
- chore: Bump org.apache.logging.log4j:log4j-core from 2.25.3 to 2.25.4 in /java/fory-test-core by @dependabot[bot] in #3556
- chore(javascript): rename ref tracking to ref by @chaokunyang in #3559
- docs(dart): add dart docs by @chaokunyang in #3560
- docs(javascript): add javascript docs by @chaokunyang in #3561
- docs: refine dart and javascript docs by @chaokunyang in #3567
- docs(dart): update dart benchmark docs by @yash-agarwa-l in #3568
- docs: update readme by @chaokunyang in #3575
New Contributors
- @utafrali made their first contribution in #3481
- @BaldDemian made their first contribution in #3490
- @retryoos made their first contribution in #3493
- @Tyooughtul made their first contribution in #3381
- @UninspiredCarrot made their first contribution in #3487
- @VikingDeng made their first contribution in #3505
- @codewithtarun2005 made their first contribution in #3507
- @darius024 made their first contribution in #3528
- @rakow made their first contribution in #3532
- @PiotrDuz made their first contribution in #3573
Full Changelog: v0.16.0...v0.17.0-rc1
v0.16.0
The Apache Fory team is pleased to announce the 0.16.0 release. This is a major release that includes 91 PR from 17 distinct contributors. See the Install Page to learn how to get the libraries for your platform.
Highlights
- feat(c#): c# serialization implementation by @chaokunyang in #3383
- feat(c#): add csharp target and idl integration tests by @chaokunyang in #3406
- feat(swift): implement fory serialization for swift language by @chaokunyang in #3359
- feat(swift): fory swift schema idl codegen by @chaokunyang in #3433
- feat(JavaScript): Support EXT,NAMED_EXT by @theweipeng in #3312
- feat(JavaScript): align xlang protocol by @theweipeng in #3316
- refactor(python): unify read/write api for python xlang and native mode by @chaokunyang in #3348
- feat(c++/python): support stream deserialization for c++ and python by @chaokunyang in #3307
- feat(python): fast cython struct serializer by @chaokunyang in #3443
- refactor(java): unify serializer write/read APIs and remove xwrite/xread by @chaokunyang in #3400
C# Serialization: First Release
Apache Fory 0.16.0 is the first release with official C# serialization support.
The C# runtime targets modern .NET workloads and brings the same object graph,
cross-language, and schema-evolution model available in other Fory runtimes.
Key capabilities:
- High-performance binary serialization for .NET 8+ with source-generator-based serializers for
[ForyObject]types - Cross-language mode with Java, Python, C++, Go, Rust, and JavaScript
- Optional reference tracking for shared and circular object graphs
- Compatible mode for schema evolution
- Dynamic object payloads, custom serializers, and namespace/name registration APIs
ThreadSafeForywrapper for concurrent service workloads- C# target support in the Fory IDL/compiler workflow
Quick Start
using Apache.Fory;
[ForyObject]
public sealed class User
{
public long Id { get; set; }
public string Name { get; set; } = string.Empty;
public string? Email { get; set; }
}
Fory fory = Fory.Builder()
.Xlang(true)
.Compatible(true)
.Build();
fory.Register<User>(1);
byte[] payload = fory.Serialize(new User
{
Id = 1,
Name = "Alice",
Email = "alice@example.com",
});
User decoded = fory.Deserialize<User>(payload);- C# guide: https://fory.apache.org/docs/guide/csharp/
- Compiler docs: https://fory.apache.org/docs/compiler/
C# Benchmarks
Below are timing results (ns/op; lower is better) comparing Fory with Protobuf
and Msgpack across representative data structures.
| Data Type | Operation | Fory | Protobuf | Msgpack |
|---|---|---|---|---|
| Struct | Serialize | 39.2 | 121.5 | 66.0 |
| Struct | Deserialize | 58.3 | 180.1 | 102.6 |
| Sample | Serialize | 269.2 | 562.6 | 339.6 |
| Sample | Deserialize | 175.6 | 1084.9 | 531.8 |
| MediaContent | Serialize | 306.3 | 434.7 | 351.5 |
| MediaContent | Deserialize | 379.4 | 718.8 | 676.9 |
| StructList | Serialize | 136.1 | 468.5 | 266.9 |
| StructList | Deserialize | 221.1 | 687.0 | 488.5 |
| SampleList | Serialize | 1198.9 | 2811.9 | 1635.7 |
| SampleList | Deserialize | 791.5 | 5174.5 | 2629.2 |
| MediaContentList | Serialize | 1393.9 | 2199.4 | 1710.9 |
| MediaContentList | Deserialize | 1719.5 | 3373.1 | 3401.2 |
Serialized data sizes (bytes):
| Data Type | Fory | Protobuf | Msgpack |
|---|---|---|---|
| Struct | 58 | 61 | 55 |
| Sample | 446 | 460 | 562 |
| MediaContent | 365 | 307 | 479 |
| StructList | 184 | 315 | 284 |
| SampleList | 1980 | 2315 | 2819 |
| MediaContentList | 1535 | 1550 | 2404 |
Benchmark details: https://fory.apache.org/docs/benchmarks/csharp/
Swift Serialization: First Release
Apache Fory 0.16.0 is also the first release with official Swift serialization
support. The Swift implementation focuses on idiomatic API design, macro-based
model serialization, cross-language compatibility, and strong support for object
graph workloads.
Key capabilities:
- High-performance serialization for Swift value and reference types
@ForyObjectmacro for zero-boilerplate model serialization- Cross-language protocol compatibility with Java, Python, C++, Go, Rust, and JavaScript
- Compatible mode for schema evolution across versions
- Dynamic value support for
Any,AnyObject,any Serializer, andAnyHashable - Reference tracking for shared/circular graphs, including weak references on classes
- Swift target support in the Fory IDL/compiler workflow
Quick Start
import Fory
@ForyObject
struct User: Equatable {
var name: String = ""
var age: Int32 = 0
}
let fory = Fory(xlang: true, trackRef: false, compatible: true)
fory.register(User.self, id: 1)
let input = User(name: "Alice", age: 30)
let data = try fory.serialize(input)
let output: User = try fory.deserialize(data)- Swift guide: https://fory.apache.org/docs/guide/swift/
- Compiler docs: https://fory.apache.org/docs/compiler/
Swift Benchmarks
Below are throughput results (ops/sec; higher is better) comparing Fory with
Protobuf and Msgpack across representative data structures.
| Data Type | Operation | Fory | Protobuf | Msgpack | Fastest |
|---|---|---|---|---|---|
| Struct | Serialize | 9,727,950 | 6,572,406 | 141,248 | fory (1.48x) |
| Struct | Deserialize | 11,889,570 | 8,584,510 | 99,792 | fory (1.39x) |
| Sample | Serialize | 3,496,305 | 1,281,983 | 17,188 | fory (2.73x) |
| Sample | Deserialize | 1,045,018 | 765,706 | 12,767 | fory (1.36x) |
| MediaContent | Serialize | 1,425,354 | 678,542 | 29,048 | fory (2.10x) |
| MediaContent | Deserialize | 614,447 | 478,298 | 12,711 | fory (1.28x) |
| StructList | Serialize | 3,307,962 | 1,028,210 | 24,781 | fory (3.22x) |
| StructList | Deserialize | 2,788,200 | 708,596 | 8,160 | fory (3.93x) |
| SampleList | Serialize | 715,734 | 205,380 | 3,361 | fory (3.48x) |
| SampleList | Deserialize | 199,317 | 133,425 | 1,498 | fory (1.49x) |
| MediaContentList | Serialize | 364,097 | 103,721 | 5,538 | fory (3.51x) |
| MediaContentList | Deserialize | 103,421 | 86,331 | 1,529 | fory (1.20x) |
Serialized data sizes (bytes):
| Data Type | Fory | Protobuf | Msgpack |
|---|---|---|---|
| MediaContent | 365 | 301 | 524 |
| MediaContentList | 1535 | 1520 | 2639 |
| Sample | 446 | 375 | 737 |
| SampleList | 1980 | 1890 | 3698 |
| Struct | 58 | 61 | 65 |
| StructList | 184 | 315 | 338 |
Benchmark details: https://fory.apache.org/docs/benchmarks/swift/
Features
- feat(grpc): update lexer/parser to support service and rpc definitions for idl compilers by @ayush00git in #3308
- feat(JavaScript): Support EXT,NAMED_EXT by @theweipeng in #3312
- feat(go): add missing type resolver for uint{16,32,64}slice by @BrianLii in #3311
- feat(JavaScript): support ForyField by @theweipeng in #3314
- feat(JavaScript): align xlang protocol by @theweipeng in #3316
- feat(javascript): add float16 support by @ayush00git in #3253
- feat(JavaScript): Align testcases by @theweipeng in #3319
- feat(go): update float16 array/slice logic in createSerializer by @BrianLii in #3318
- feat(JavaScript): Align testcase by @theweipeng in #3320
- feat(JavaScript): Align testcases by @theweipeng in #3321
- feat(dart): align dart xlang serialization by @chaokunyang in #3322
- feat(go): improve test coverage for int slice primitive serializers by @BrianLii in #3313
- refactor(dart): revamp runtime API and unify codegen naming by @chaokunyang in #3323
- feat(JavaScript): Align xlang protocol by @theweipeng in #3326
- feat(JavaScript): fix test_polymorphic_map by @theweipeng in #3327
- feat(dart): align dart with xlang serialization spec by @chaokunyang in #3325
- feat(go): add support for bfloat16 by @BrianLii in #3310
- feat(javascript): add bfloat16 and bfloat16_array support by @miantalha45 in #3328
- feat(JavaScript): fix testcase by @theweipeng in h...
v0.15.0
Highlights
- feat(go): new golang xlang serialization implementation by @chaokunyang in #3063
- feat(rust): add tuple struct support and improve generic type handling by @ariesdevil in #3087
- refactor(rust): unify tuple struct and named struct protocol, and make schema evolution happy by @ariesdevil in #3092
feat(java/python/rust/go/c++): align nullable meta for xlang struct fields serialization by @chaokunyang in #3093 - feat(java/python/rust/go/c++): xlang fields reference and typeinfo alignment by @chaokunyang in #3107
- feat(c++): add SharedWeak for circular reference support by @chaokunyang in #3109
- feat(xlang): support unsigned int for xlang by @chaokunyang in #3111 and #3113
- feat(xlang/java): refactor java native serialization type system and streaming type info for xlang by @chaokunyang in #3153
- feat(xlang): fory schema idl and compiler by @chaokunyang in #3106
- feat(compiler): add flatbuffers idl support by @chaokunyang in #3184
- feat(compiler): support shared/circular reference serialization for fory/protobuf/flatbuffer idl by @chaokunyang in #3226
Go Serialization: First Release
Apache Fory 0.15.0 is the first release with official Go serialization support.
The Go implementation delivers high-performance serialization with cross-language
compatibility and production-focused configuration options.
Key capabilities:
- Cross-language mode with Java, Python,
cpp, Rust, and JavaScript (fory.WithXlang(true)) - Reflection-based serialization by default, plus optional experimental AOT code generation for hot paths
- Reference tracking for shared/circular object graphs (
fory.WithTrackRef(true)+fory:"ref"tags) - Compatible mode for schema evolution (
fory.WithCompatible(true)) supporting add/remove/reorder field changes - Thread-safe wrapper (
github.com/apache/fory/go/fory/threadsafe) for concurrent workloads
Quick Start
package main
import (
"github.com/apache/fory/go/fory"
)
type User struct {
ID int64
Name string
}
func main() {
f := fory.New(
fory.WithXlang(true),
fory.WithCompatible(true),
)
_ = f.RegisterStruct(User{}, 1)
data, _ := f.Serialize(&User{ID: 1, Name: "Alice"})
var out User
_ = f.Deserialize(data, &out)
}- Go guide: https://fory.apache.org/docs/guide/go/
Go Benchmarks
Below are timing results (ns/op; lower is better) comparing Fory with Protobuf and Msgpack across representative data structures.
| Data Type | Operation | Fory | Protobuf | Msgpack |
|---|---|---|---|---|
| Struct | Serialize | 66.0 | 97.8 | 184.9 |
| Struct | Deserialize | 82.7 | 90.9 | 309.6 |
| Structlist | Serialize | 632.8 | 1783.0 | 3340.0 |
| Structlist | Deserialize | 906.4 | 1891.0 | 5709.0 |
| Sample | Serialize | 137.3 | 367.3 | 1492.0 |
| Sample | Deserialize | 263.6 | 422.2 | 2661.0 |
| Samplelist | Serialize | 1962.0 | 7087.0 | 26169.0 |
| Samplelist | Deserialize | 4234.0 | 9321.0 | 53615.0 |
| Mediacontent | Serialize | 268.8 | 471.1 | 773.7 |
| Mediacontent | Deserialize | 426.9 | 553.1 | 1432.0 |
| Mediacontentlist | Serialize | 3736.0 | 9107.0 | 13911.0 |
| Mediacontentlist | Deserialize | 7247.0 | 11435.0 | 27975.0 |
Serialized data sizes (bytes):
| Data Type | Fory | Protobuf | Msgpack |
|---|---|---|---|
| Struct | 58 | 61 | 57 |
| Sample | 446 | 375 | 524 |
| MediaContent | 342 | 301 | 400 |
| StructList | 560 | 1260 | 1146 |
| SampleList | 7600 | 7560 | 10486 |
| MediaContentList | 5776 | 6080 | 8006 |
Note: Results depend on hardware and implementation versions. See the Go benchmark docs for details: https://fory.apache.org/docs/benchmarks/go/
Fory Schema IDL and Compiler: First Release
Apache Fory 0.15.0 also introduces the first release of the Fory schema IDL and
compiler toolchain. You can define schemas once and generate native types and
registration code across languages.
Key capabilities:
- Schema-first development with
enum,message, andunion - Fory-native field semantics:
optional(nullability),ref(shared/circular references),list, andmap - Multi-language code generation for Java, Python, Go, Rust, and
cpp - Protobuf (
.proto) and FlatBuffers (.fbs) frontend support, translated into Fory IR/codegen - Idiomatic generated APIs with
to/from byteshelpers
Quick Start
pip install fory-compiler
foryc example.fdl --lang java,python,go,rust,cpp --output ./generatedpackage example;
message Person [id=101] {
string name = 1;
optional string email = 2;
}Generated Code Example
foryc generates idiomatic native types plus registration/byte helpers. For the
schema above, generated code looks like:
// Go (excerpt)
type Person struct {
Name string `fory:"id=1"`
Email optional.Optional[string] `fory:"id=2"`
}
func (m *Person) ToBytes() ([]byte, error) { ... }
func (m *Person) FromBytes(data []byte) error { ... }
func RegisterTypes(f *fory.Fory) error {
return f.RegisterStruct(Person{}, 101)
}// Java (excerpt)
public class Person {
@ForyField(id = 1)
private String name;
@ForyField(id = 2, nullable = true)
private String email;
public byte[] toBytes() { ... }
public static Person fromBytes(byte[] bytes) { ... }
}# Python (excerpt)
@pyfory.dataclass
class Person:
name: str = pyfory.field(id=1, default="")
email: Optional[str] = pyfory.field(id=2, default=None)
def to_bytes(self) -> bytes: ...
@classmethod
def from_bytes(cls, data: bytes) -> "Person": ...- Compiler docs: https://fory.apache.org/docs/compiler/
Features
- feat(java): add config params for IdentityObjectIntMap by @jim-parsons in #3048
- perf: add cpp benchmark report by @chaokunyang in #3051
- feat(python): add Union type support for xlang serialization by @zhan7236 in #3059
- feat(go): new golang xlang serialization implementation by @chaokunyang in #3063
- feat(java): enhance ForyField annotation with tag ID support for optimized serialization by @mchernyakov in #3021
- feat(c++): add iterator container serialization support by @zhan7236 in #3068
- refactor(go): refactor go error processing by @chaokunyang in #3069
- feat(rust): add generate_default attr, no longer generate
Defaulttrait impl by default by @ariesdevil in #3074 - feat(java): implement Union type support for cross-language serialization by @zhan7236 in #3062
- perf(go): add go benchmarks and optimize performance by @chaokunyang in #3071
- feat(python): add java python xlang tests and align protocol by @chaokunyang in #3077
- feat(rust): add i128 and isize type support by @ariesdevil in #3080
- feat(rust): add unit type and PhantomData serializer support by @ariesdevil in #3081
- refactor(python): refactor pyfory serializers code structure by @chaokunyang in #3083
- feat(rust): add union and none type support by @ariesdevil in #3084
- feat(go): add go struct field tag support by @chaokunyang in #3082
- feat(rust): add tuple struct support and improve generic type handling by @ariesdevil in #3087
- feat(rust): support configure rust field meta to reduce cost by @chaokunyang in #3089
- feat(c++): support customize c++ field meta by @chaokunyang in #3088
- feat(ci): make rust xlang ci run separately to make ci faster by @chaokunyang in #3090
- feat(python): support configure field meta for python by @chaokunyang in #3091
- refactor(rust): unify tuple struct and named struct protocol, and make schema evolution happy by @ariesdevil in #3092
- feat(java): build Descriptors with final ref_tracking flags by @chaokunyang in #3070
- feat(java/python/rust/go/c++): align nullable meta for xlang struct fields serialization by @chaokunyang in #3093
- feat(rust): implement fine-grained ref tracking for rust by @chaokunyang in #3101
- feat(c++): fine-grained ref tracking for c++ by @chaokunyang in #3103
- feat(java/python/rust/go/c++): xlang nullable/ref alignment by @chaokunyang in #3104
- feat(jav...
v0.15.0-rc3
Highlights
- feat(go): new golang xlang serialization implementation by @chaokunyang in #3063
- feat(rust): add tuple struct support and improve generic type handling by @ariesdevil in #3087
- refactor(rust): unify tuple struct and named struct protocol, and make schema evolution happy by @ariesdevil in #3092
feat(java/python/rust/go/c++): align nullable meta for xlang struct fields serialization by @chaokunyang in #3093 - feat(java/python/rust/go/c++): xlang fields reference and typeinfo alignment by @chaokunyang in #3107
- feat(c++): add SharedWeak for circular reference support by @chaokunyang in #3109
- feat(xlang): support unsigned int for xlang by @chaokunyang in #3111 and #3113
- feat(xlang/java): refactor java native serialization type system and streaming type info for xlang by @chaokunyang in #3153
- feat(xlang): fory schema idl and compiler by @chaokunyang in #3106
- feat(compiler): add flatbuffers idl support by @chaokunyang in #3184
- feat(compiler): support shared/circular reference serialization for fory/protobuf/flatbuffer idl by @chaokunyang in #3226
Features
- feat(java): add config params for IdentityObjectIntMap by @jim-parsons in #3048
- perf: add cpp benchmark report by @chaokunyang in #3051
- feat(python): add Union type support for xlang serialization by @zhan7236 in #3059
- feat(go): new golang xlang serialization implementation by @chaokunyang in #3063
- feat(java): enhance ForyField annotation with tag ID support for optimized serialization by @mchernyakov in #3021
- feat(c++): add iterator container serialization support by @zhan7236 in #3068
- refactor(go): refactor go error processing by @chaokunyang in #3069
- feat(rust): add generate_default attr, no longer generate
Defaulttrait impl by default by @ariesdevil in #3074 - feat(java): implement Union type support for cross-language serialization by @zhan7236 in #3062
- perf(go): add go benchmarks and optimize performance by @chaokunyang in #3071
- feat(python): add java python xlang tests and align protocol by @chaokunyang in #3077
- feat(rust): add i128 and isize type support by @ariesdevil in #3080
- feat(rust): add unit type and PhantomData serializer support by @ariesdevil in #3081
- refactor(python): refactor pyfory serializers code structure by @chaokunyang in #3083
- feat(rust): add union and none type support by @ariesdevil in #3084
- feat(go): add go struct field tag support by @chaokunyang in #3082
- feat(rust): add tuple struct support and improve generic type handling by @ariesdevil in #3087
- feat(rust): support configure rust field meta to reduce cost by @chaokunyang in #3089
- feat(c++): support customize c++ field meta by @chaokunyang in #3088
- feat(ci): make rust xlang ci run separately to make ci faster by @chaokunyang in #3090
- feat(python): support configure field meta for python by @chaokunyang in #3091
- refactor(rust): unify tuple struct and named struct protocol, and make schema evolution happy by @ariesdevil in #3092
- feat(java): build Descriptors with final ref_tracking flags by @chaokunyang in #3070
- feat(java/python/rust/go/c++): align nullable meta for xlang struct fields serialization by @chaokunyang in #3093
- feat(rust): implement fine-grained ref tracking for rust by @chaokunyang in #3101
- feat(c++): fine-grained ref tracking for c++ by @chaokunyang in #3103
- feat(java/python/rust/go/c++): xlang nullable/ref alignment by @chaokunyang in #3104
- feat(java/python/rust/go/c++): xlang fields reference and typeinfo alignment by @chaokunyang in #3107
- feat(java/python/go/rust): add circular reference xlang tests by @chaokunyang in #3108
- feat(c++): add SharedWeak for circular reference support by @chaokunyang in #3109
- feat(js): add schema-based per-field nullable support for xlang by @theharsh999 in #3100
- feat(xlang): support unsigned int for xlang by @chaokunyang in #3111
- feat(java): long array serializer support varint encoding by @Pigsy-Monk in #3115
- feat(xlang): support serialization for unsigned types and field encoding config by @chaokunyang in #3113
- perf(go): optimize go struct fields serialization perf by @chaokunyang in #3120
- feat(java): int array serializer support varint encoding by @Pigsy-Monk in #3124
- feat(java): support xlang serialization for GraalVM native image by @chaokunyang in #3126
- refactor(go): rename go interface{} to any by @chaokunyang in #3128
- refactor(xlang): remove magic number from protocol by @chaokunyang in #3137
- feat(xlang): use little endian when serializing array of multiple byte element size by @chaokunyang in #3140
- refactor(java/c++): rename morphic to dynamic by @chaokunyang in #3142
- feat(xlang): add unsigned integer type support for JavaScript by @ayush00git in #3139
- feat: add unsigned number for dart by @ayush00git in #3144
- feat(xlang/java): refactor java native serialization type system and streaming type info for xlang by @chaokunyang in #3153
- feat(dart): add struct serializer support for unsigned integer types by @ayush00git in #3155
- feat(xlang): fory schema idl and compiler by @chaokunyang in #3106
- refactor(java): use
Types.NONE + 1as base java native id by @chaokunyang in #3180 - refactor(compiler): refactor fory compiler into hierarchical architecture by @chaokunyang in #3179
- feat(JavaScript): Add cross language test for JavaScript by @theweipeng in #3161
- feat(dart): add dart ci by @chaokunyang in #3189
- feat(compiler): add flatbuffers idl support by @chaokunyang in #3184
- feat(java): enhance java unsigned int/array type system by @chaokunyang in #3190
- feat(dart): add uint annotation types to the fory's codegen system by @ayush00git in #3181
- feat(dart): add uint struct support to the codegen system by @ayush00git in #3192
- feat(compiler): add union support to fory compiler and runtime by @chaokunyang in #3195
- feat(c++): support private fields of c++ class by @chaokunyang in #3193
- feat(compiler): generate getter/setter/has/clear methods for c++ by @chaokunyang in #3199
- feat(JavaScript): impl the xlang string by @theweipeng in #3197
- feat(c++): make fory enum/nuion macro in user namespace by @chaokunyang in #3200
- feat(go): use option for optional fields by @chaokunyang in #3202
- feat(c++): make shared_ptr track ref by default by @chaokunyang in #3214
- feat(go): support [N]uint types array serializers by @ayush00git in #3201
- feat(xlang): reserve 4 bits for type meta by @chaokunyang in #3204
- feat(go): remove murmur hash go deps by @chaokunyang in #3217
- feat(compiler): refine generated c++ API by @chaokunyang in #3221
- feat(python): refactor cython buffer to use c++ buffer by @chaokunyang in #3219
- ci: speed up setup-python on windows by @chaokunyang in #3222
- feat(python): add buffer index accessors by @chaokunyang in #3223
- feat(xlang/compiler): support shared/circular reference serialization for fory/protobuf/flatbuffer idl by @chaokunyang in #3226
- feat(c++): add polymorphic serialization support for
anyto compiler by @chaokunyang in #3232 - feat(JavaScript): i...
v0.15.0-rc2
Highlights
- feat(go): new golang xlang serialization implementation by @chaokunyang in #3063
- feat(rust): add tuple struct support and improve generic type handling by @ariesdevil in #3087
- refactor(rust): unify tuple struct and named struct protocol, and make schema evolution happy by @ariesdevil in #3092
feat(java/python/rust/go/c++): align nullable meta for xlang struct fields serialization by @chaokunyang in #3093 - feat(java/python/rust/go/c++): xlang fields reference and typeinfo alignment by @chaokunyang in #3107
- feat(c++): add SharedWeak for circular reference support by @chaokunyang in #3109
- feat(xlang): support unsigned int for xlang by @chaokunyang in #3111 and #3113
- feat(xlang/java): refactor java native serialization type system and streaming type info for xlang by @chaokunyang in #3153
- feat(xlang): fory schema idl and compiler by @chaokunyang in #3106
- feat(compiler): add flatbuffers idl support by @chaokunyang in #3184
- feat(compiler): support shared/circular reference serialization for fory/protobuf/flatbuffer idl by @chaokunyang in #3226
Features
- feat(java): add config params for IdentityObjectIntMap by @jim-parsons in #3048
- perf: add cpp benchmark report by @chaokunyang in #3051
- feat(python): add Union type support for xlang serialization by @zhan7236 in #3059
- feat(go): new golang xlang serialization implementation by @chaokunyang in #3063
- feat(java): enhance ForyField annotation with tag ID support for optimized serialization by @mchernyakov in #3021
- feat(c++): add iterator container serialization support by @zhan7236 in #3068
- refactor(go): refactor go error processing by @chaokunyang in #3069
- feat(rust): add generate_default attr, no longer generate
Defaulttrait impl by default by @ariesdevil in #3074 - feat(java): implement Union type support for cross-language serialization by @zhan7236 in #3062
- perf(go): add go benchmarks and optimize performance by @chaokunyang in #3071
- feat(python): add java python xlang tests and align protocol by @chaokunyang in #3077
- feat(rust): add i128 and isize type support by @ariesdevil in #3080
- feat(rust): add unit type and PhantomData serializer support by @ariesdevil in #3081
- refactor(python): refactor pyfory serializers code structure by @chaokunyang in #3083
- feat(rust): add union and none type support by @ariesdevil in #3084
- feat(go): add go struct field tag support by @chaokunyang in #3082
- feat(rust): add tuple struct support and improve generic type handling by @ariesdevil in #3087
- feat(rust): support configure rust field meta to reduce cost by @chaokunyang in #3089
- feat(c++): support customize c++ field meta by @chaokunyang in #3088
- feat(ci): make rust xlang ci run separately to make ci faster by @chaokunyang in #3090
- feat(python): support configure field meta for python by @chaokunyang in #3091
- refactor(rust): unify tuple struct and named struct protocol, and make schema evolution happy by @ariesdevil in #3092
- feat(java): build Descriptors with final ref_tracking flags by @chaokunyang in #3070
- feat(java/python/rust/go/c++): align nullable meta for xlang struct fields serialization by @chaokunyang in #3093
- feat(rust): implement fine-grained ref tracking for rust by @chaokunyang in #3101
- feat(c++): fine-grained ref tracking for c++ by @chaokunyang in #3103
- feat(java/python/rust/go/c++): xlang nullable/ref alignment by @chaokunyang in #3104
- feat(java/python/rust/go/c++): xlang fields reference and typeinfo alignment by @chaokunyang in #3107
- feat(java/python/go/rust): add circular reference xlang tests by @chaokunyang in #3108
- feat(c++): add SharedWeak for circular reference support by @chaokunyang in #3109
- feat(js): add schema-based per-field nullable support for xlang by @theharsh999 in #3100
- feat(xlang): support unsigned int for xlang by @chaokunyang in #3111
- feat(java): long array serializer support varint encoding by @Pigsy-Monk in #3115
- feat(xlang): support serialization for unsigned types and field encoding config by @chaokunyang in #3113
- perf(go): optimize go struct fields serialization perf by @chaokunyang in #3120
- feat(java): int array serializer support varint encoding by @Pigsy-Monk in #3124
- feat(java): support xlang serialization for GraalVM native image by @chaokunyang in #3126
- refactor(go): rename go interface{} to any by @chaokunyang in #3128
- refactor(xlang): remove magic number from protocol by @chaokunyang in #3137
- feat(xlang): use little endian when serializing array of multiple byte element size by @chaokunyang in #3140
- refactor(java/c++): rename morphic to dynamic by @chaokunyang in #3142
- feat(xlang): add unsigned integer type support for JavaScript by @ayush00git in #3139
- feat: add unsigned number for dart by @ayush00git in #3144
- feat(xlang/java): refactor java native serialization type system and streaming type info for xlang by @chaokunyang in #3153
- feat(dart): add struct serializer support for unsigned integer types by @ayush00git in #3155
- feat(xlang): fory schema idl and compiler by @chaokunyang in #3106
- refactor(java): use
Types.NONE + 1as base java native id by @chaokunyang in #3180 - refactor(compiler): refactor fory compiler into hierarchical architecture by @chaokunyang in #3179
- feat(JavaScript): Add cross language test for JavaScript by @theweipeng in #3161
- feat(dart): add dart ci by @chaokunyang in #3189
- feat(compiler): add flatbuffers idl support by @chaokunyang in #3184
- feat(java): enhance java unsigned int/array type system by @chaokunyang in #3190
- feat(dart): add uint annotation types to the fory's codegen system by @ayush00git in #3181
- feat(dart): add uint struct support to the codegen system by @ayush00git in #3192
- feat(compiler): add union support to fory compiler and runtime by @chaokunyang in #3195
- feat(c++): support private fields of c++ class by @chaokunyang in #3193
- feat(compiler): generate getter/setter/has/clear methods for c++ by @chaokunyang in #3199
- feat(JavaScript): impl the xlang string by @theweipeng in #3197
- feat(c++): make fory enum/nuion macro in user namespace by @chaokunyang in #3200
- feat(go): use option for optional fields by @chaokunyang in #3202
- feat(c++): make shared_ptr track ref by default by @chaokunyang in #3214
- feat(go): support [N]uint types array serializers by @ayush00git in #3201
- feat(xlang): reserve 4 bits for type meta by @chaokunyang in #3204
- feat(go): remove murmur hash go deps by @chaokunyang in #3217
- feat(compiler): refine generated c++ API by @chaokunyang in #3221
- feat(python): refactor cython buffer to use c++ buffer by @chaokunyang in #3219
- ci: speed up setup-python on windows by @chaokunyang in #3222
- feat(python): add buffer index accessors by @chaokunyang in #3223
- feat(xlang/compiler): support shared/circular reference serialization for fory/protobuf/flatbuffer idl by @chaokunyang in #3226
- feat(c++): add polymorphic serialization support for
anyto compiler by @chaokunyang in #3232 - feat(JavaScript): i...
v0.15.0-rc1
Highlights
- feat(go): new golang xlang serialization implementation by @chaokunyang in #3063
- feat(rust): add tuple struct support and improve generic type handling by @ariesdevil in #3087
- refactor(rust): unify tuple struct and named struct protocol, and make schema evolution happy by @ariesdevil in #3092
feat(java/python/rust/go/c++): align nullable meta for xlang struct fields serialization by @chaokunyang in #3093 - feat(java/python/rust/go/c++): xlang fields reference and typeinfo alignment by @chaokunyang in #3107
- feat(c++): add SharedWeak for circular reference support by @chaokunyang in #3109
- feat(xlang): support unsigned int for xlang by @chaokunyang in #3111 and #3113
- feat(xlang/java): refactor java native serialization type system and streaming type info for xlang by @chaokunyang in #3153
Features
- feat(java): add config params for IdentityObjectIntMap by @jim-parsons in #3048
- perf: add cpp benchmark report by @chaokunyang in #3051
- feat(python): add Union type support for xlang serialization by @zhan7236 in #3059
- feat(go): new golang xlang serialization implementation by @chaokunyang in #3063
- feat(java): enhance ForyField annotation with tag ID support for optimized serialization by @mchernyakov in #3021
- feat(c++): add iterator container serialization support by @zhan7236 in #3068
- refactor(go): refactor go error processing by @chaokunyang in #3069
- feat(rust): add generate_default attr, no longer generate
Defaulttrait impl by default by @ariesdevil in #3074 - feat(java): implement Union type support for cross-language serialization by @zhan7236 in #3062
- perf(go): add go benchmarks and optimize performance by @chaokunyang in #3071
- feat(python): add java python xlang tests and align protocol by @chaokunyang in #3077
- feat(rust): add i128 and isize type support by @ariesdevil in #3080
- feat(rust): add unit type and PhantomData serializer support by @ariesdevil in #3081
- refactor(python): refactor pyfory serializers code structure by @chaokunyang in #3083
- feat(rust): add union and none type support by @ariesdevil in #3084
- feat(go): add go struct field tag support by @chaokunyang in #3082
- feat(rust): add tuple struct support and improve generic type handling by @ariesdevil in #3087
- feat(rust): support configure rust field meta to reduce cost by @chaokunyang in #3089
- feat(c++): support customize c++ field meta by @chaokunyang in #3088
- feat(ci): make rust xlang ci run separately to make ci faster by @chaokunyang in #3090
- feat(python): support configure field meta for python by @chaokunyang in #3091
- refactor(rust): unify tuple struct and named struct protocol, and make schema evolution happy by @ariesdevil in #3092
- feat(java): build Descriptors with final ref_tracking flags by @chaokunyang in #3070
- feat(java/python/rust/go/c++): align nullable meta for xlang struct fields serialization by @chaokunyang in #3093
- feat(rust): implement fine-grained ref tracking for rust by @chaokunyang in #3101
- feat(c++): fine-grained ref tracking for c++ by @chaokunyang in #3103
- feat(java/python/rust/go/c++): xlang nullable/ref alignment by @chaokunyang in #3104
- feat(java/python/rust/go/c++): xlang fields reference and typeinfo alignment by @chaokunyang in #3107
- feat(java/python/go/rust): add circular reference xlang tests by @chaokunyang in #3108
- feat(c++): add SharedWeak for circular reference support by @chaokunyang in #3109
- feat(js): add schema-based per-field nullable support for xlang by @theharsh999 in #3100
- feat(xlang): support unsigned int for xlang by @chaokunyang in #3111
- feat(java): long array serializer support varint encoding by @Pigsy-Monk in #3115
- feat(xlang): support serialization for unsigned types and field encoding config by @chaokunyang in #3113
- perf(go): optimize go struct fields serialization perf by @chaokunyang in #3120
- feat(java): int array serializer support varint encoding by @Pigsy-Monk in #3124
- feat(java): support xlang serialization for GraalVM native image by @chaokunyang in #3126
- refactor(go): rename go interface{} to any by @chaokunyang in #3128
- refactor(xlang): remove magic number from protocol by @chaokunyang in #3137
- feat(xlang): use little endian when serializing array of multiple byte element size by @chaokunyang in #3140
- refactor(java/c++): rename morphic to dynamic by @chaokunyang in #3142
- feat(xlang): add unsigned integer type support for JavaScript by @ayush00git in #3139
- feat(dart): add unsigned number for dart by @ayush00git in #3144
- feat(xlang/java): refactor java native serialization type system and streaming type info for xlang by @chaokunyang in #3153
Bug Fix
- fix(docs): fix graalvm link by @chaokunyang in #3056
- fix(Rust): prevent obtaining generic type metadata on custom types(struct/enum) by @urlyy in #3057
- fix(Rust): Move the calculating of TypeMeta::bytes and TypeMeta::hash ahead of serialization by @urlyy in #3060
- fix(java): Better ergonomics for AllowListChecker by @Asuka-star in #3061
- fix(rust): output original registered ID in type mismatch error log by @userzhy in #3067
- fix(java): Fix CopyOnWriteArrayList field serialization by @vybhavjs in #3079
- fix(go): reference tracking fails when >127 objects serialized by @jonyoder in #3086
- fix(java): fix abstract enum and abstract array serialization for GraalVM by @chaokunyang in #3095
- fix(rust): enable Union type cross-language serialization between Rust and Java by @ariesdevil in #3094
- fix: x86 architecture missing from universal2 macOS wheel by @madhavajay in #3114
- fix(java): optimize type resolver calls for xlang mode on graalvm by @chaokunyang in #3129
- fix(java): stop compilation service when shutdowning compile service by @chaokunyang in #3138
- fix(python): fix collection null elements read/write by @chaokunyang in #3149
- fix: typo in the xlang_serialization_spec.md by @ayush00git in #3151
- fix(java): use littlen endian for utf16 string on big endian by @chaokunyang in #3159
- fix(java): fix openj9 sliced string serde by @chaokunyang in #3160
Other Improvements
- chore: bump release version to 0.14.0 by @chaokunyang in #3052
- chore: fix benchmark plot by @chaokunyang in #3053
- docs: add cpp doc in main readme.md by @chaokunyang in #3055
- chore(deps): bump org.apache.logging.log4j:log4j-core from 2.20.0 to 2.25.3 in /java/fory-test-core by @dependabot[bot] in #3065
- chore(python): Update badge styles in README.md by @chaokunyang in #3072
- chore(rust): revert rust crates version by @ariesdevil in #3075
- docs(c++): Add MSVC compatibility to the CMake sample in the CPP document. by @Eiskomet in #3078
- chore: bump release version to 0.14.1 by @chaokunyang in #3096
- docs(go): add go serialization doc by @chaokunyang in #3121
- docs(go): fix go serialization doc by @chaokunyang in #3125
- docs(go): fix broken go doc links by @chaokunyang in #3127
- docs(go): add go version requirements by @chaokunyang in #3134
- docs(go): add docs for go pkg dev by @chaokunyang in #3135
- doc...




