Skip to main content

Fory v0.14.0 Released

· 9 min read
Shawn Yang

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 ForyFeature and optimized serializers for blocking queues and final fields
  • ObjectStreamSerializer Refactoring: Refactored ObjectStreamSerializer with 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_STRUCT for 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;
}

C++ Benchmarks

Below are timing results (nanoseconds; lower is better) comparing Fory with Protobuf across different data structures.

DatatypeOperationFory (ns)Protobuf (ns)Faster
MediaContentSerialize4142,046Fory (4.9x)
MediaContentDeserialize1,3612,890Fory (2.1x)
SampleSerialize210307Fory (1.5x)
SampleDeserialize1,0611,500Fory (1.4x)
StructSerialize51181Fory (3.5x)
StructDeserialize136170Fory (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

Bug Fix

Other Improvements

New Contributors

Full Changelog: https://github.com/apache/fory/compare/v0.13.2...v0.14.0