The Apache Fory team is pleased to announce the 0.14.0 release. This is a major release that includes 85 PR from 11 distinct contributors. See the Install Page to learn how to get the libraries for your platform.
Highlights
- Official C++ Support: First release of Apache Fory C++ with high-performance object graph serialization, cross-language interoperability, and schema evolution
- Row Format & Type System: New row-oriented format type system across Java, Python, and C++, enabling row-columnar conversions and removing Arrow dependencies
- Performance Enhancements: Significant optimizations across all languages, including thread-local context in Rust and fast flat-int maps for C++ type dispatch
- Ecosystem Updates: Added support for JDK 25 (Java), Go 1.23, and Bazel 8. Python officially marked as stable with improved build parallelism
- Advanced Java Features: GraalVM Native Image support via
ForyFeatureand optimized serializers for blocking queues and final fields - ObjectStreamSerializer Refactoring: Refactored
ObjectStreamSerializerwith meta-shared compatible mode for reduced space cost and improved performance on JDK customized serialization APIs
C++: First Release Highlights
This is the first Apache Fory C++ release, delivering a complete, high-performance serialization framework for modern C++17. If you build C++ applications requiring fast serialization, cross-language communication, or schema evolution, Fory C++ provides type-safe, compile-time serialization with minimal overhead.
Key capabilities:
- Macro-based struct registration via
FORY_STRUCTfor compile-time type safety - Cross-language serialization with Java, Python, Go, Rust, and JavaScript
- Forward/backward compatible schema evolution (Compatible mode)
- Reference tracking for shared objects and circular references
- Thread-safe and single-threaded (fastest) variants
- Comprehensive type support: primitives,
std::string,std::vector,std::map,std::set,std::optional,std::shared_ptr,std::unique_ptr,std::variant, and temporal types - Zero-copy Row format for analytics workloads with random field access
- CMake (FetchContent) and Bazel build system support
Quick Start
#include "fory/serialization/fory.h"
using namespace fory::serialization;
struct Person {
std::string name;
int32_t age;
std::vector<std::string> hobbies;
FORY_STRUCT(Person, name, age, hobbies);
};
int main() {
auto fory = Fory::builder()
.xlang(true) // Enable cross-language mode
.track_ref(false) // Disable ref tracking for simple types
.build();
fory.register_struct<Person>(1);
Person person{"Alice", 30, {"reading", "coding"}};
auto bytes = fory.serialize(person).value();
Person decoded = fory.deserialize<Person>(bytes).value();
// person == decoded
return 0;
}
- Guide: C++ Serialization – https://fory.apache.org/docs/docs/guide/cpp/
- Examples: hello_world, hello_row
C++ Benchmarks
Below are timing results (nanoseconds; lower is better) comparing Fory with Protobuf across different data structures.
| Datatype | Operation | Fory (ns) | Protobuf (ns) | Faster |
|---|---|---|---|---|
| MediaContent | Serialize | 414 | 2,046 | Fory (4.9x) |
| MediaContent | Deserialize | 1,361 | 2,890 | Fory (2.1x) |
| Sample | Serialize | 210 | 307 | Fory (1.5x) |
| Sample | Deserialize | 1,061 | 1,500 | Fory (1.4x) |
| Struct | Serialize | 51 | 181 | Fory (3.5x) |
| Struct | Deserialize | 136 | 170 | Fory (1.3x) |
Note: Results depend on hardware and implementation versions. See the C++ benchmark guide for how to run benchmarks yourself: https://github.com/apache/fory/tree/main/benchmarks/cpp_benchmark
Features
- feat(python): add raw method to buffer object by @chaokunyang in https://github.com/apache/fory/pull/2875
- feat(rust): add duration serializer support by @chaokunyang in https://github.com/apache/fory/pull/2878
- feat(rust): add typename to unregistered error message by @chaokunyang in https://github.com/apache/fory/pull/2881
- perf(rust): support criterion profiler to generate flamegraph by @chaokunyang in https://github.com/apache/fory/pull/2882
- refactor(rust): merge fory_debug into fory macro attr by @chaokunyang in https://github.com/apache/fory/pull/2883
- feat(rust): direct derive primitve write/read by @chaokunyang in https://github.com/apache/fory/pull/2890
- perf(rust): optimize buffer write read perf by @chaokunyang in https://github.com/apache/fory/pull/2892
- feat(Rust): Support u128 & u128_array by @urlyy in https://github.com/apache/fory/pull/2899
- feat(c++): implement fory cpp object graph serialization framework by @chaokunyang in https://github.com/apache/fory/pull/2908
- feat(python): pure python row-columar convert by @chaokunyang in https://github.com/apache/fory/pull/2919
- feat(c++): implement xlang serialization for c++ by @chaokunyang in https://github.com/apache/fory/pull/2925
- feat(c++/python): add row format schema and remove arrow dependency by @chaokunyang in https://github.com/apache/fory/pull/2928
- feat(java): implement fory row format type system by @chaokunyang in https://github.com/apache/fory/pull/2931
- feat(python): implement cython bazel build directly without 3rd deps by @chaokunyang in https://github.com/apache/fory/pull/2936
- feat(c+/python): upgrade bazel to bazel8 by @chaokunyang in https://github.com/apache/fory/pull/2937
- feat(java/python/c++): add schema encoder and remove arrow serializers by @chaokunyang in https://github.com/apache/fory/pull/2938
- feat(c++): check max dyn depth when deserializing polymorphic types by @chaokunyang in https://github.com/apache/fory/pull/2939
- feat(c++): add cmake build support and add cpp examples by @chaokunyang in https://github.com/apache/fory/pull/2942
- feat(c++ ): add cpp benchmark by @chaokunyang in https://github.com/apache/fory/pull/2943
- perf(rust): use segmented pool to reduce contention of fory pool by @chaokunyang in https://github.com/apache/fory/pull/2945
- perf(rust): use thread local to manage fory rust WriteContext/ReadContext by @chaokunyang in https://github.com/apache/fory/pull/2946
- feat(rust): add fory config for rust by @chaokunyang in https://github.com/apache/fory/pull/2947
- perf(c++): optimize cpp serialization performance by @chaokunyang in https://github.com/apache/fory/pull/2944
- perf(c++): remove shared_ptr from type info to reduce atomic counter cost by @chaokunyang in https://github.com/apache/fory/pull/2951
- feat: refine python module check by @chaokunyang in https://github.com/apache/fory/pull/2952
- feat(java): support jdk 25 by @chaokunyang in https://github.com/apache/fory/pull/2954
- feat(java): add optimized serializers for blocking queues by @zhan7236 in https://github.com/apache/fory/pull/2955
- perf(c++): directly error set instead of result to reduce cost on hotpath by @chaokunyang in https://github.com/apache/fory/pull/2959
- perf(c++): optimize primitive struct fields read performance by @chaokunyang in https://github.com/apache/fory/pull/2960
- feat(java): implement FinalFieldReplaceResolveSerializer for final fields with writeReplace/readResolve methods by @mchernyakov in https://github.com/apache/fory/pull/2917
- perf(c++): add mac profile script for c++ by @chaokunyang in https://github.com/apache/fory/pull/2962
- perf(c++): fair benchmark for cpp by @chaokunyang in https://github.com/apache/fory/pull/2963
- perf(c++): optimize type dispatch performance by a fast flat-int map by @chaokunyang in https://github.com/apache/fory/pull/2966
- perf(c++): add media content benchmark by @chaokunyang in https://github.com/apache/fory/pull/2968
- feat(c++): support polymorphic collection elements serialization by @chaokunyang in https://github.com/apache/fory/pull/2974
- feat(c++): add cpp tuple serializer by @chaokunyang in https://github.com/apache/fory/pull/2975
- refactor(xlang): use 0 for unknow type id by @chaokunyang in https://github.com/apache/fory/pull/2985
- feat(java): Add ForyFeature for GraalVM Native Image by @mengnankkkk in https://github.com/apache/fory/pull/2701
- feat(c++): support container xlang serialization with polymorphic elements by @chaokunyang in https://github.com/apache/fory/pull/2980
- feat(python): parallel python wheel build by @chaokunyang in https://github.com/apache/fory/pull/2989
- perf(c++): improve the serialization performance of array/collection by @LiangliangSui in https://github.com/apache/fory/pull/2986
- feat(go): upgrade go to to 1.23 by @chaokunyang in https://github.com/apache/fory/pull/2995
- perf(c++): centralize error state in context for faster serialization by @chaokunyang in https://github.com/apache/fory/pull/3009
- refactor(go): redesign serialization implementation with performance and usability improvements by @chaokunyang in https://github.com/apache/fory/pull/2998
- refactor(rust): merge rust type layer into TypeMeta by @chaokunyang in https://github.com/apache/fory/pull/3019
- ci: remove macos x86 CI for Python by @chaokunyang in https://github.com/apache/fory/pull/3023
- feat(c++): support unsigned type for cpp by @chaokunyang in https://github.com/apache/fory/pull/3022
- feat(c++): support variant-based union type serialization for c++ by @chaokunyang in https://github.com/apache/fory/pull/3032
- feat(java): refactor ObjectStreamSerializer to use meta shared compatible serializer by @chaokunyang in https://github.com/apache/fory/pull/3034
- feat(java): separate user register type id with fory registered type id by @chaokunyang in https://github.com/apache/fory/pull/3035
- feat(): add c++ user guide doc by @chaokunyang in https://github.com/apache/fory/pull/3037
- refactor(c++/rust): refine c++ serialize_to API by @chaokunyang in https://github.com/apache/fory/pull/3045
Bug Fix
- fix(Rust): fix Binary implementation by @urlyy in https://github.com/apache/fory/pull/2902
- fix(rust): fix array field support by @chaokunyang in https://github.com/apache/fory/pull/2933
- fix(rust): raise error for nested polymorphics for collection by @chaokunyang in https://github.com/apache/fory/pull/2934
- fix(kotlin): support Kotlin field with Java reserved world by @chaokunyang in https://github.com/apache/fory/pull/2948
- fix(java): handle TypeVariable in row format type inference by @chaokunyang in https://github.com/apache/fory/pull/2949
- fix(java): use single quotes in Python command for Windows compatibility by @zhan7236 in https://github.com/apache/fory/pull/2953
- fix(java): fix race condition in blocking queue serializers by @zhan7236 in https://github.com/apache/fory/pull/2956
- fix(cpp): fix the type error by @LiangliangSui in https://github.com/apache/fory/pull/2961
- fix(go): fix struct value reference tracking bug by @chaokunyang in https://github.com/apache/fory/pull/2991
- fix(java): support serialization of CopyOnWriteArraySet by @LiangliangSui in https://github.com/apache/fory/pull/2999
Other Improvements
- docs: fix broken table in in java_serialization_guide.md by @mosinnik in https://github.com/apache/fory/pull/2876
- chore(rust): fix tuple test comment by @chaokunyang in https://github.com/apache/fory/pull/2877
- docs(rust): remove redundant doc for shared reference by @chaokunyang in https://github.com/apache/fory/pull/2879
- chore(Java): Update java quickstart doc, for note register order-sensitive by @moooonk in https://github.com/apache/fory/pull/2837
- chore(CI): Add caching for bazel in github workflows by @prakash-218 in https://github.com/apache/fory/pull/2888
- chore(CI): Fix cache with symlinks by @prakash-218 in https://github.com/apache/fory/pull/2893
- chore: move benchmarks to separate dir to speed up ci build by @chaokunyang in https://github.com/apache/fory/pull/2894
- docs: fix rust benchmark links by @chaokunyang in https://github.com/apache/fory/pull/2896
- docs: fix cargo benchmark comand in doc by @chaokunyang in https://github.com/apache/fory/pull/2897
- chore: bump release version to 0.13.1 by @chaokunyang in https://github.com/apache/fory/pull/2901
- docs(java): add logging section by @mosinnik in https://github.com/apache/fory/pull/2905
- chore(c++): remove cpp benchmarks by @chaokunyang in https://github.com/apache/fory/pull/2926
- chore(c++): move meta string to meta dir by @chaokunyang in https://github.com/apache/fory/pull/2940
- docs: remove unused type mappings for arrow types by @chaokunyang in https://github.com/apache/fory/pull/2964
- chore: Remove the content related to arrow. by @LiangliangSui in https://github.com/apache/fory/pull/2965
- chore(c++): move common macro into macros.h by @chaokunyang in https://github.com/apache/fory/pull/2970
- docs: Update Bazel version in README.md by @chaokunyang in https://github.com/apache/fory/pull/2971
- docs: refine xlang spec documentation by @chaokunyang in https://github.com/apache/fory/pull/2979
- docs: Refine metadata packing and automatic type mapping by @chaokunyang in https://github.com/apache/fory/pull/2984
- ci: add workflow to remove HTML comments from PR body by @chaokunyang in https://github.com/apache/fory/pull/2983
- docs: Update xlang_serialization_spec.md by @chaokunyang in https://github.com/apache/fory/pull/2987
- docs: update the C++ benchmark case by @LiangliangSui in https://github.com/apache/fory/pull/2988
- chore(deps): bump gopkg.in/yaml.v3 from 3.0.0-20200313102051-9f266ea9e77c to 3.0.1 in /go/fory by @dependabot[bot] in https://github.com/apache/fory/pull/2996
- chore: bump release version to 0.13.2 by @chaokunyang in https://github.com/apache/fory/pull/2997
- chore(python): mark pyfory as stable by @chaokunyang in https://github.com/apache/fory/pull/3001
- docs(c++): add cpp bazel example and add ci by @chaokunyang in https://github.com/apache/fory/pull/3033
- docs: refactor user guide docs by @chaokunyang in https://github.com/apache/fory/pull/3036
- docs: add scala and kotlin docs by @chaokunyang in https://github.com/apache/fory/pull/3040
- docs: refactor xlang docs by @chaokunyang in https://github.com/apache/fory/pull/3041
- docs: add row format spec by @chaokunyang in https://github.com/apache/fory/pull/3042
- docs: fix sidebar position by @chaokunyang in https://github.com/apache/fory/pull/3043
- docs: remove copy rust/python docs by @chaokunyang in https://github.com/apache/fory/pull/3044
New Contributors
- @mosinnik made their first contribution in https://github.com/apache/fory/pull/2876
- @prakash-218 made their first contribution in https://github.com/apache/fory/pull/2888
- @zhan7236 made their first contribution in https://github.com/apache/fory/pull/2953
- @mchernyakov made their first contribution in https://github.com/apache/fory/pull/2917
Full Changelog: https://github.com/apache/fory/compare/v0.13.2...v0.14.0
