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
Other Improvements
- 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 serialization by @chaokunyang in #3596
- docs: add more agent harness rules by @chaokunyang in #3610
- chore(dart): remove stale dart note files by @chaokunyang in #3642
- chore(java): configure default Fory log level by @chaokunyang in #3657
- chore: clean up code and add compiler warning checks by @chaokunyang in #3660
- docs: tighten benchmark throughput plots by @chaokunyang in #3662
- docs: update readme by @chaokunyang in #3664
- docs: add README schema IDL example by @chaokunyang in #3665
- docs: update xlang/native serialization doc by @chaokunyang in #3686
New Contributors
- @emrul made their first contribution in #3603
- @wakilurislam made their first contribution in #3638
- @xhzq233 made their first contribution in #3669
Full Changelog: v0.17.0...v1.0.0