<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://fory.apache.org/blog</id>
    <title>Apache Fory™ Blog</title>
    <updated>2026-04-19T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://fory.apache.org/blog"/>
    <subtitle>Apache Fory™ Blog</subtitle>
    <icon>https://fory.apache.org/img/favicon.ico</icon>
    <entry>
        <title type="html"><![CDATA[Fory v0.17.0 Released]]></title>
        <id>https://fory.apache.org/blog/fory_0_17_0_release</id>
        <link href="https://fory.apache.org/blog/fory_0_17_0_release"/>
        <updated>2026-04-19T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[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.]]></summary>
        <content type="html"><![CDATA[<p>The Apache Fory team is pleased to announce the 0.17.0 release. This is a major release that includes <a href="https://github.com/apache/fory/compare/v0.16.0...v0.17.0" target="_blank" rel="noopener noreferrer">71 PR</a> from 19 distinct contributors. See the <a href="https://fory.apache.org/docs/start/install" target="_blank" rel="noopener noreferrer">Install</a> Page to learn how to get the libraries for your platform.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="javascriptnodejs-serialization-first-release">JavaScript/NodeJS Serialization: First Release<a href="https://fory.apache.org/blog/fory_0_17_0_release#javascriptnodejs-serialization-first-release" class="hash-link" aria-label="Direct link to JavaScript/NodeJS Serialization: First Release" title="Direct link to JavaScript/NodeJS Serialization: First Release">​</a></h2>
<p>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.</p>
<p><strong>Key capabilities:</strong></p>
<ul>
<li>High-performance serialization for JavaScript and TypeScript objects in Node.js</li>
<li>Cross-language compatibility with Java, Python, Go, Rust, C#, Swift, and Dart</li>
<li>Schema-driven APIs via <code>Type.*</code> builders and TypeScript decorators</li>
<li>Optional reference tracking for shared and circular object graphs</li>
<li>Compatible mode for schema evolution</li>
<li>Configurable depth, binary size, and collection size guardrails</li>
<li>JavaScript/TypeScript target support in the Fory IDL/compiler workflow</li>
<li>Optional <code>@apache-fory/hps</code> fast string path for Node.js 20+</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="quick-start">Quick Start<a href="https://fory.apache.org/blog/fory_0_17_0_release#quick-start" class="hash-link" aria-label="Direct link to Quick Start" title="Direct link to Quick Start">​</a></h3>
<div class="language-ts codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-ts codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> Fory</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> Type </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"@apache-fory/core"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> userType </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Type</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">struct</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> typeName</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"example.user"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    id</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> Type</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">int64</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    name</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> Type</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">string</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    age</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> Type</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">int32</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> fory </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">Fory</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> serialize</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> deserialize </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">register</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">userType</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> bytes </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">serialize</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  id</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1n</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  name</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Alice"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  age</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">30</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> user </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">deserialize</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">bytes</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">user</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<ul>
<li>JavaScript guide: <a href="https://fory.apache.org/docs/guide/javascript/" target="_blank" rel="noopener noreferrer">https://fory.apache.org/docs/guide/javascript/</a></li>
<li>Compiler docs: <a href="https://fory.apache.org/docs/compiler/" target="_blank" rel="noopener noreferrer">https://fory.apache.org/docs/compiler/</a></li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="javascript-benchmarks">JavaScript Benchmarks<a href="https://fory.apache.org/blog/fory_0_17_0_release#javascript-benchmarks" class="hash-link" aria-label="Direct link to JavaScript Benchmarks" title="Direct link to JavaScript Benchmarks">​</a></h3>
<img src="https://fory.apache.org/img/blog/fory_0_17_0_release/javascript_throughput.png" width="90%">
<p>Below are throughput results (ops/sec; higher is better) comparing Fory with
Protocol Buffers and JSON across representative data structures.</p>
<table><thead><tr><th>Datatype</th><th>Operation</th><th>Fory TPS</th><th>Protobuf TPS</th><th>JSON TPS</th><th>Fastest</th></tr></thead><tbody><tr><td>Struct</td><td>Serialize</td><td>8,453,950</td><td>1,903,706</td><td>3,058,232</td><td>fory</td></tr><tr><td>Struct</td><td>Deserialize</td><td>9,705,287</td><td>8,233,664</td><td>3,860,538</td><td>fory</td></tr><tr><td>Sample</td><td>Serialize</td><td>1,498,391</td><td>422,620</td><td>744,790</td><td>fory</td></tr><tr><td>Sample</td><td>Deserialize</td><td>1,918,162</td><td>819,010</td><td>762,048</td><td>fory</td></tr><tr><td>MediaContent</td><td>Serialize</td><td>1,293,157</td><td>729,497</td><td>1,299,908</td><td>json</td></tr><tr><td>MediaContent</td><td>Deserialize</td><td>1,638,086</td><td>1,209,140</td><td>921,191</td><td>fory</td></tr><tr><td>StructList</td><td>Serialize</td><td>3,928,325</td><td>495,648</td><td>891,810</td><td>fory</td></tr><tr><td>StructList</td><td>Deserialize</td><td>3,264,827</td><td>1,529,744</td><td>986,144</td><td>fory</td></tr><tr><td>SampleList</td><td>Serialize</td><td>355,581</td><td>92,741</td><td>163,120</td><td>fory</td></tr><tr><td>SampleList</td><td>Deserialize</td><td>424,916</td><td>163,253</td><td>162,520</td><td>fory</td></tr><tr><td>MediaContentList</td><td>Serialize</td><td>286,053</td><td>148,977</td><td>282,445</td><td>fory</td></tr><tr><td>MediaContentList</td><td>Deserialize</td><td>376,826</td><td>244,622</td><td>190,155</td><td>fory</td></tr></tbody></table>
<p>Serialized data sizes (bytes):</p>
<table><thead><tr><th>Datatype</th><th>Fory</th><th>Protobuf</th><th>JSON</th></tr></thead><tbody><tr><td>Struct</td><td>58</td><td>61</td><td>103</td></tr><tr><td>Sample</td><td>446</td><td>377</td><td>724</td></tr><tr><td>MediaContent</td><td>391</td><td>307</td><td>596</td></tr><tr><td>StructList</td><td>184</td><td>315</td><td>537</td></tr><tr><td>SampleList</td><td>1980</td><td>1900</td><td>3642</td></tr><tr><td>MediaContentList</td><td>1665</td><td>1550</td><td>3009</td></tr></tbody></table>
<p>Benchmark details: <a href="https://github.com/apache/fory/tree/v0.17.0/benchmarks/javascript" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/tree/v0.17.0/benchmarks/javascript</a></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="dart-serialization-first-release">Dart Serialization: First Release<a href="https://fory.apache.org/blog/fory_0_17_0_release#dart-serialization-first-release" class="hash-link" aria-label="Direct link to Dart Serialization: First Release" title="Direct link to Dart Serialization: First Release">​</a></h2>
<p>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.</p>
<p><strong>Key capabilities:</strong></p>
<ul>
<li>High-performance Dart serialization with generated code instead of reflection</li>
<li>Cross-language compatibility with Java, Python, Go, Rust, C#, Swift, and JavaScript</li>
<li><code>@ForyStruct</code> and <code>@ForyField</code> annotations with <code>build_runner</code> code generation</li>
<li>Compatible mode for schema evolution across versions</li>
<li>Optional reference tracking for shared and circular object graphs</li>
<li>Manual <code>Serializer&lt;T&gt;</code> extension points for advanced or custom types</li>
<li>Dart target support in the Fory IDL/compiler workflow</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="quick-start-1">Quick Start<a href="https://fory.apache.org/blog/fory_0_17_0_release#quick-start-1" class="hash-link" aria-label="Direct link to Quick Start" title="Direct link to Quick Start">​</a></h3>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">import 'package:fory/fory.dart';</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">part 'person.fory.dart';</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">enum Color {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  red,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  blue,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">@ForyStruct()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">class Person {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  Person();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  String name = '';</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  Int32 age = Int32(0);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  Color favoriteColor = Color.red;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">void main() {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  final fory = Fory();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  PersonFory.register(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    fory,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Color,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    namespace: 'example',</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    typeName: 'Color',</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  );</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  PersonFory.register(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    fory,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Person,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    namespace: 'example',</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    typeName: 'Person',</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  );</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  final bytes = fory.serialize(Person()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    ..name = 'Ada'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    ..age = Int32(36)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    ..favoriteColor = Color.blue);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  final roundTrip = fory.deserialize&lt;Person&gt;(bytes);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  print(roundTrip.name);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<ul>
<li>Dart guide: <a href="https://fory.apache.org/docs/guide/dart/" target="_blank" rel="noopener noreferrer">https://fory.apache.org/docs/guide/dart/</a></li>
<li>Compiler docs: <a href="https://fory.apache.org/docs/compiler/" target="_blank" rel="noopener noreferrer">https://fory.apache.org/docs/compiler/</a></li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="dart-benchmarks">Dart Benchmarks<a href="https://fory.apache.org/blog/fory_0_17_0_release#dart-benchmarks" class="hash-link" aria-label="Direct link to Dart Benchmarks" title="Direct link to Dart Benchmarks">​</a></h3>
<img src="https://fory.apache.org/img/blog/fory_0_17_0_release/dart_throughput.png" width="90%">
<p>Below are throughput results (ops/sec; higher is better) comparing Fory with
Protocol Buffers across representative data structures.</p>
<table><thead><tr><th>Datatype</th><th>Operation</th><th style="text-align:right">Fory TPS</th><th style="text-align:right">Protobuf TPS</th><th>Fastest</th></tr></thead><tbody><tr><td>Struct</td><td>Serialize</td><td style="text-align:right">3,989,432</td><td style="text-align:right">1,884,653</td><td>fory (2.12x)</td></tr><tr><td>Struct</td><td>Deserialize</td><td style="text-align:right">5,828,197</td><td style="text-align:right">4,199,680</td><td>fory (1.39x)</td></tr><tr><td>Sample</td><td>Serialize</td><td style="text-align:right">1,649,722</td><td style="text-align:right">500,167</td><td>fory (3.30x)</td></tr><tr><td>Sample</td><td>Deserialize</td><td style="text-align:right">2,060,113</td><td style="text-align:right">785,109</td><td>fory (2.62x)</td></tr><tr><td>MediaContent</td><td>Serialize</td><td style="text-align:right">800,876</td><td style="text-align:right">391,235</td><td>fory (2.05x)</td></tr><tr><td>MediaContent</td><td>Deserialize</td><td style="text-align:right">1,315,115</td><td style="text-align:right">683,533</td><td>fory (1.92x)</td></tr><tr><td>StructList</td><td>Serialize</td><td style="text-align:right">1,456,396</td><td style="text-align:right">367,506</td><td>fory (3.96x)</td></tr><tr><td>StructList</td><td>Deserialize</td><td style="text-align:right">1,921,006</td><td style="text-align:right">645,958</td><td>fory (2.97x)</td></tr><tr><td>SampleList</td><td>Serialize</td><td style="text-align:right">411,144</td><td style="text-align:right">48,508</td><td>fory (8.48x)</td></tr><tr><td>SampleList</td><td>Deserialize</td><td style="text-align:right">464,273</td><td style="text-align:right">103,558</td><td>fory (4.48x)</td></tr><tr><td>MediaContentList</td><td>Serialize</td><td style="text-align:right">186,870</td><td style="text-align:right">77,029</td><td>fory (2.43x)</td></tr><tr><td>MediaContentList</td><td>Deserialize</td><td style="text-align:right">330,293</td><td style="text-align:right">128,215</td><td>fory (2.58x)</td></tr></tbody></table>
<p>Serialized data sizes (bytes):</p>
<table><thead><tr><th>Datatype</th><th style="text-align:right">Fory</th><th style="text-align:right">Protobuf</th></tr></thead><tbody><tr><td>Struct</td><td style="text-align:right">58</td><td style="text-align:right">61</td></tr><tr><td>Sample</td><td style="text-align:right">446</td><td style="text-align:right">377</td></tr><tr><td>MediaContent</td><td style="text-align:right">365</td><td style="text-align:right">307</td></tr><tr><td>StructList</td><td style="text-align:right">184</td><td style="text-align:right">315</td></tr><tr><td>SampleList</td><td style="text-align:right">1980</td><td style="text-align:right">1900</td></tr><tr><td>MediaContentList</td><td style="text-align:right">1535</td><td style="text-align:right">1550</td></tr></tbody></table>
<p>Benchmark details: <a href="https://github.com/apache/fory/tree/v0.17.0/benchmarks/dart" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/tree/v0.17.0/benchmarks/dart</a></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="highlights">Highlights<a href="https://fory.apache.org/blog/fory_0_17_0_release#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights">​</a></h2>
<ul>
<li>refactor(java): refactor fory java serialization api by @chaokunyang in <a href="https://github.com/apache/fory/pull/3537" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3537</a></li>
<li>refactor(python): refactor python serialization api by @chaokunyang in <a href="https://github.com/apache/fory/pull/3543" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3543</a></li>
<li>feat(java): reduce java serializer memory usage by share across Fory instances by @chaokunyang in <a href="https://github.com/apache/fory/pull/3546" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3546</a></li>
<li>feat(java): remove guava dependency from fory java by @chaokunyang in <a href="https://github.com/apache/fory/pull/3557" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3557</a></li>
<li>refactor(dart): new dart implementation by @chaokunyang in <a href="https://github.com/apache/fory/pull/3551" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3551</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="features">Features<a href="https://fory.apache.org/blog/fory_0_17_0_release#features" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features">​</a></h2>
<ul>
<li>refactor(javascript): rename apache-fory/fory to  apache-fory/core by @chaokunyang in <a href="https://github.com/apache/fory/pull/3489" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3489</a></li>
<li>feat(ci): add bazel downloads retry by @BaldDemian in <a href="https://github.com/apache/fory/pull/3492" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3492</a></li>
<li>feat(go): add configurable size guardrails by @ayush00git in <a href="https://github.com/apache/fory/pull/3475" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3475</a></li>
<li>refactor(ci): install Bazel using setup-bazel by @BaldDemian in <a href="https://github.com/apache/fory/pull/3494" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3494</a></li>
<li>perf(rust): Rewrite Rust benchmarks around shared bench.proto data by @chaokunyang in <a href="https://github.com/apache/fory/pull/3497" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3497</a></li>
<li>feat(cpp): add float16 to c++ by @UninspiredCarrot in <a href="https://github.com/apache/fory/pull/3487" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3487</a></li>
<li>feat(java): add float support by @mengnankkkk in <a href="https://github.com/apache/fory/pull/3254" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3254</a></li>
<li>feat(java): support java virtual threads by @chaokunyang in <a href="https://github.com/apache/fory/pull/3522" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3522</a></li>
<li>perf(java): optimize thread safe fory for java by @chaokunyang in <a href="https://github.com/apache/fory/pull/3529" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3529</a></li>
<li>test(cpp): optimize float16 sign symmetry test for ASAN by @Geethapranay1 in <a href="https://github.com/apache/fory/pull/3531" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3531</a></li>
<li>feat(java): add dedicated exception serializers by @chaokunyang in <a href="https://github.com/apache/fory/pull/3536" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3536</a></li>
<li>refactor(java): refactor fory java serialization api by @chaokunyang in <a href="https://github.com/apache/fory/pull/3537" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3537</a></li>
<li>refactor(python): refactor python serialization api by @chaokunyang in <a href="https://github.com/apache/fory/pull/3543" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3543</a></li>
<li>feat(dart): Introduce id based enum serialization by @yash-agarwa-l in <a href="https://github.com/apache/fory/pull/3482" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3482</a></li>
<li>feat(javascript): add configurable size guardrails by @ayush00git in <a href="https://github.com/apache/fory/pull/3539" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3539</a></li>
<li>feat(java): reduce java serializer memory usage by share across Fory instances by @chaokunyang in <a href="https://github.com/apache/fory/pull/3546" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3546</a></li>
<li>refactor(javascript): move serialization runtime state into contexts by @chaokunyang in <a href="https://github.com/apache/fory/pull/3549" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3549</a></li>
<li>refactor(swift): refine swift api by @chaokunyang in <a href="https://github.com/apache/fory/pull/3554" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3554</a></li>
<li>feat(xlang): refine xlang api and enum serialization by @chaokunyang in <a href="https://github.com/apache/fory/pull/3555" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3555</a></li>
<li>feat(java): remove guava dependency from fory java by @chaokunyang in <a href="https://github.com/apache/fory/pull/3557" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3557</a></li>
<li>refactor(dart): new dart implementation by @chaokunyang in <a href="https://github.com/apache/fory/pull/3551" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3551</a></li>
<li>feat(compiler): Add JavaScript/TypeScript IDL code generation by @miantalha45 in <a href="https://github.com/apache/fory/pull/3394" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3394</a></li>
<li>perf(javascript): add javascript benchmark by @chaokunyang in <a href="https://github.com/apache/fory/pull/3562" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3562</a></li>
<li>perf(dart): optimize struct deserialize with direct dispatch codegen by @yash-agarwa-l in <a href="https://github.com/apache/fory/pull/3563" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3563</a></li>
<li>feat(dart): add dart IDL support by @chaokunyang in <a href="https://github.com/apache/fory/pull/3571" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3571</a></li>
<li>feat(python): fix python struct xlang ref track error by @chaokunyang in <a href="https://github.com/apache/fory/pull/3574" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3574</a></li>
<li>feat: make generate enum use id for wire format by @chaokunyang in <a href="https://github.com/apache/fory/pull/3576" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3576</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="bug-fix">Bug Fix<a href="https://fory.apache.org/blog/fory_0_17_0_release#bug-fix" class="hash-link" aria-label="Direct link to Bug Fix" title="Direct link to Bug Fix">​</a></h2>
<ul>
<li>fix(java): Restore compact codec fixed width optimizations by @stevenschlansker in <a href="https://github.com/apache/fory/pull/3478" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3478</a></li>
<li>fix(rust): handle panics from fuzz-found edge cases by @utafrali in <a href="https://github.com/apache/fory/pull/3481" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3481</a></li>
<li>fix(rust): add error handling logic for std duration; add support for chrono duration by @BaldDemian in <a href="https://github.com/apache/fory/pull/3490" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3490</a></li>
<li>fix(compiler): validate rpc request/response types by @retryoos in <a href="https://github.com/apache/fory/pull/3493" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3493</a></li>
<li>fix(c++): fix misaligned address access errors detected by UBSan in buffer.h by @BaldDemian in <a href="https://github.com/apache/fory/pull/3479" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3479</a></li>
<li>fix(java): finalize codegen config hash on first use by @chaokunyang in <a href="https://github.com/apache/fory/pull/3495" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3495</a></li>
<li>fix(rust): fix several panics detected by cargo-fuzz by @BaldDemian in <a href="https://github.com/apache/fory/pull/3483" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3483</a></li>
<li>fix(java): handle private final map codegen by @chaokunyang in <a href="https://github.com/apache/fory/pull/3504" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3504</a></li>
<li>fix(compiler): repair broken service example and add regression coverage by @VikingDeng in <a href="https://github.com/apache/fory/pull/3505" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3505</a></li>
<li>fix(rust): deep clone TypeMeta to prevent UB in concurrent scenarios by @BaldDemian in <a href="https://github.com/apache/fory/pull/3511" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3511</a></li>
<li>fix(compiler): fix failed tests in compiler; add compiler CI by @BaldDemian in <a href="https://github.com/apache/fory/pull/3516" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3516</a></li>
<li>fix(compiler): allow qualified nested types in FDL rpc signatures by @VikingDeng in <a href="https://github.com/apache/fory/pull/3518" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3518</a></li>
<li>fix(java): preserve ConcurrentSkipListSet comparator on copy by @mandrean in <a href="https://github.com/apache/fory/pull/3520" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3520</a></li>
<li>test(compiler): add IR validation and codegen tests for gRPC service support by @darius024 in <a href="https://github.com/apache/fory/pull/3528" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3528</a></li>
<li>fix(java): Correct resolution of dependent/nested serializers in GraalVM by @rakow in <a href="https://github.com/apache/fory/pull/3532" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3532</a></li>
<li>fix(java): fix objectstream serializer async jit and graalvm support by @chaokunyang in <a href="https://github.com/apache/fory/pull/3534" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3534</a></li>
<li>ci: fix Bazel cache paths for C++ workflows by @chaokunyang in <a href="https://github.com/apache/fory/pull/3535" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3535</a></li>
<li>fix(python): fix wrong calling orders in visit_other by @BaldDemian in <a href="https://github.com/apache/fory/pull/3542" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3542</a></li>
<li>fix(js): corrected the float64 array size by @ayush00git in <a href="https://github.com/apache/fory/pull/3541" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3541</a></li>
<li>fix(java): configure type checker during build by @chaokunyang in <a href="https://github.com/apache/fory/pull/3550" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3550</a></li>
<li>fix(java): auto-select child serializers for sorted containers by @chaokunyang in <a href="https://github.com/apache/fory/pull/3552" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3552</a></li>
<li>fix(java): support skip optional sql serializers for java11+ by @chaokunyang in <a href="https://github.com/apache/fory/pull/3553" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3553</a></li>
<li>fix(rust): apply consistent pascalcase naming for nested types by @utafrali in <a href="https://github.com/apache/fory/pull/3548" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3548</a></li>
<li>fix(javascript): fix flaky javascript idl tests by @chaokunyang in <a href="https://github.com/apache/fory/pull/3565" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3565</a></li>
<li>fix(swift): fix swift generated code compile warnings by @chaokunyang in <a href="https://github.com/apache/fory/pull/3566" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3566</a></li>
<li>fix(java): add test for previous uncaught regression.  by @PiotrDuz in <a href="https://github.com/apache/fory/pull/3573" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3573</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="other-improvements">Other Improvements<a href="https://fory.apache.org/blog/fory_0_17_0_release#other-improvements" class="hash-link" aria-label="Direct link to Other Improvements" title="Direct link to Other Improvements">​</a></h2>
<ul>
<li>chore(java): Update Spotless and Checkstyle to allow building with JDK25 by @stevenschlansker in <a href="https://github.com/apache/fory/pull/3476" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3476</a></li>
<li>chore(java): Clean up Javadoc warnings, and fail the build if any new ones are introduced by @stevenschlansker in <a href="https://github.com/apache/fory/pull/3477" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3477</a></li>
<li>chore: bump version to 0.16.0 by @chaokunyang in <a href="https://github.com/apache/fory/pull/3488" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3488</a></li>
<li>docs: add python benchmark result to readme by @chaokunyang in <a href="https://github.com/apache/fory/pull/3496" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3496</a></li>
<li>docs: fix benchmark plots by @chaokunyang in <a href="https://github.com/apache/fory/pull/3498" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3498</a></li>
<li>docs: add fory code review skill by @chaokunyang in <a href="https://github.com/apache/fory/pull/3500" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3500</a></li>
<li>chore: adjust skills softlinks by @chaokunyang in <a href="https://github.com/apache/fory/pull/3501" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3501</a></li>
<li>chore(cpp): configure CI to extract and execute C++ code from Markdo… by @Tyooughtul in <a href="https://github.com/apache/fory/pull/3381" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3381</a></li>
<li>docs: improve comments in Java generator by @codewithtarun2005 in <a href="https://github.com/apache/fory/pull/3507" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3507</a></li>
<li>docs: refactor agents.md to reduce token usage by @chaokunyang in <a href="https://github.com/apache/fory/pull/3538" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3538</a></li>
<li>docs: add ai-review policy by @chaokunyang in <a href="https://github.com/apache/fory/pull/3545" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3545</a></li>
<li>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 <a href="https://github.com/apache/fory/pull/3556" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3556</a></li>
<li>chore(javascript): rename ref tracking to ref by @chaokunyang in <a href="https://github.com/apache/fory/pull/3559" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3559</a></li>
<li>docs(dart): add dart docs by @chaokunyang in <a href="https://github.com/apache/fory/pull/3560" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3560</a></li>
<li>docs(javascript): add javascript docs by @chaokunyang in <a href="https://github.com/apache/fory/pull/3561" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3561</a></li>
<li>docs: refine dart and javascript docs by @chaokunyang in <a href="https://github.com/apache/fory/pull/3567" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3567</a></li>
<li>docs(dart): update dart benchmark docs by @yash-agarwa-l in <a href="https://github.com/apache/fory/pull/3568" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3568</a></li>
<li>docs: update readme by @chaokunyang in <a href="https://github.com/apache/fory/pull/3575" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3575</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="new-contributors">New Contributors<a href="https://fory.apache.org/blog/fory_0_17_0_release#new-contributors" class="hash-link" aria-label="Direct link to New Contributors" title="Direct link to New Contributors">​</a></h2>
<ul>
<li>@utafrali made their first contribution in <a href="https://github.com/apache/fory/pull/3481" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3481</a></li>
<li>@BaldDemian made their first contribution in <a href="https://github.com/apache/fory/pull/3490" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3490</a></li>
<li>@retryoos made their first contribution in <a href="https://github.com/apache/fory/pull/3493" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3493</a></li>
<li>@Tyooughtul made their first contribution in <a href="https://github.com/apache/fory/pull/3381" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3381</a></li>
<li>@UninspiredCarrot made their first contribution in <a href="https://github.com/apache/fory/pull/3487" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3487</a></li>
<li>@VikingDeng made their first contribution in <a href="https://github.com/apache/fory/pull/3505" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3505</a></li>
<li>@codewithtarun2005 made their first contribution in <a href="https://github.com/apache/fory/pull/3507" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3507</a></li>
<li>@darius024 made their first contribution in <a href="https://github.com/apache/fory/pull/3528" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3528</a></li>
<li>@rakow made their first contribution in <a href="https://github.com/apache/fory/pull/3532" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3532</a></li>
<li>@PiotrDuz made their first contribution in <a href="https://github.com/apache/fory/pull/3573" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3573</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a href="https://github.com/apache/fory/compare/v0.16.0...v0.17.0" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/compare/v0.16.0...v0.17.0</a></p>]]></content>
        <author>
            <name>Shawn Yang</name>
            <uri>https://github.com/chaokunyang</uri>
        </author>
        <category label="fory" term="fory"/>
        <category label="c#" term="c#"/>
        <category label="swift" term="swift"/>
        <category label="java" term="java"/>
        <category label="python" term="python"/>
        <category label="compiler" term="compiler"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Fory v0.16.0 Released]]></title>
        <id>https://fory.apache.org/blog/fory_0_16_0_release</id>
        <link href="https://fory.apache.org/blog/fory_0_16_0_release"/>
        <updated>2026-03-17T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[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.]]></summary>
        <content type="html"><![CDATA[<p>The Apache Fory team is pleased to announce the 0.16.0 release. This is a major release that includes <a href="https://github.com/apache/fory/compare/v0.15.0...v0.16.0" target="_blank" rel="noopener noreferrer">91 PR</a> from 17 distinct contributors. See the <a href="https://fory.apache.org/docs/start/install" target="_blank" rel="noopener noreferrer">Install</a> Page to learn how to get the libraries for your platform.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="highlights">Highlights<a href="https://fory.apache.org/blog/fory_0_16_0_release#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights">​</a></h2>
<ul>
<li>feat(c#): c# serialization implementation by @chaokunyang in <a href="https://github.com/apache/fory/pull/3383" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3383</a></li>
<li>feat(c#): add csharp target and idl integration tests by @chaokunyang in <a href="https://github.com/apache/fory/pull/3406" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3406</a></li>
<li>feat(swift): implement fory serialization for swift language by @chaokunyang in <a href="https://github.com/apache/fory/pull/3359" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3359</a></li>
<li>feat(swift): fory swift schema idl codegen by @chaokunyang in <a href="https://github.com/apache/fory/pull/3433" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3433</a></li>
<li>feat(JavaScript): Support EXT,NAMED_EXT by @theweipeng in <a href="https://github.com/apache/fory/pull/3312" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3312</a></li>
<li>feat(JavaScript): align xlang protocol by @theweipeng in <a href="https://github.com/apache/fory/pull/3316" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3316</a></li>
<li>refactor(python): unify read/write api for python xlang and native mode by @chaokunyang in <a href="https://github.com/apache/fory/pull/3348" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3348</a></li>
<li>feat(c++/python): support stream deserialization for c++ and python by @chaokunyang in <a href="https://github.com/apache/fory/pull/3307" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3307</a></li>
<li>feat(python): fast cython struct serializer by @chaokunyang in <a href="https://github.com/apache/fory/pull/3443" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3443</a></li>
<li>refactor(java): unify serializer write/read APIs and remove xwrite/xread by @chaokunyang in <a href="https://github.com/apache/fory/pull/3400" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3400</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="c-serialization-first-release">C# Serialization: First Release<a href="https://fory.apache.org/blog/fory_0_16_0_release#c-serialization-first-release" class="hash-link" aria-label="Direct link to C# Serialization: First Release" title="Direct link to C# Serialization: First Release">​</a></h2>
<p>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.</p>
<p><strong>Key capabilities:</strong></p>
<ul>
<li>High-performance binary serialization for .NET 8+ with source-generator-based serializers for <code>[ForyObject]</code> types</li>
<li>Cross-language mode with Java, Python, C++, Go, Rust, and JavaScript</li>
<li>Optional reference tracking for shared and circular object graphs</li>
<li>Compatible mode for schema evolution</li>
<li>Dynamic object payloads, custom serializers, and namespace/name registration APIs</li>
<li><code>ThreadSafeFory</code> wrapper for concurrent service workloads</li>
<li>C# target support in the Fory IDL/compiler workflow</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="quick-start">Quick Start<a href="https://fory.apache.org/blog/fory_0_16_0_release#quick-start" class="hash-link" aria-label="Direct link to Quick Start" title="Direct link to Quick Start">​</a></h3>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">using Apache.Fory;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[ForyObject]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">public sealed class User</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">{</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    public long Id { get; set; }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    public string Name { get; set; } = string.Empty;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    public string? Email { get; set; }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Fory fory = Fory.Builder()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    .Xlang(true)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    .Compatible(true)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    .Build();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">fory.Register&lt;User&gt;(1);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">byte[] payload = fory.Serialize(new User</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">{</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Id = 1,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Name = "Alice",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Email = "alice@example.com",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">});</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">User decoded = fory.Deserialize&lt;User&gt;(payload);</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<ul>
<li>C# guide: <a href="https://fory.apache.org/docs/guide/csharp/" target="_blank" rel="noopener noreferrer">https://fory.apache.org/docs/guide/csharp/</a></li>
<li>Compiler docs: <a href="https://fory.apache.org/docs/compiler/" target="_blank" rel="noopener noreferrer">https://fory.apache.org/docs/compiler/</a></li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="c-benchmarks">C# Benchmarks<a href="https://fory.apache.org/blog/fory_0_16_0_release#c-benchmarks" class="hash-link" aria-label="Direct link to C# Benchmarks" title="Direct link to C# Benchmarks">​</a></h3>
<img src="https://fory.apache.org/img/blog/fory_0_16_0_release/csharp_benchmark_combined.png" width="90%">
<p>Below are timing results (ns/op; lower is better) comparing Fory with Protobuf
and Msgpack across representative data structures.</p>
<table><thead><tr><th>Data Type</th><th>Operation</th><th>Fory</th><th>Protobuf</th><th>Msgpack</th></tr></thead><tbody><tr><td>Struct</td><td>Serialize</td><td>39.2</td><td>121.5</td><td>66.0</td></tr><tr><td>Struct</td><td>Deserialize</td><td>58.3</td><td>180.1</td><td>102.6</td></tr><tr><td>Sample</td><td>Serialize</td><td>269.2</td><td>562.6</td><td>339.6</td></tr><tr><td>Sample</td><td>Deserialize</td><td>175.6</td><td>1084.9</td><td>531.8</td></tr><tr><td>MediaContent</td><td>Serialize</td><td>306.3</td><td>434.7</td><td>351.5</td></tr><tr><td>MediaContent</td><td>Deserialize</td><td>379.4</td><td>718.8</td><td>676.9</td></tr><tr><td>StructList</td><td>Serialize</td><td>136.1</td><td>468.5</td><td>266.9</td></tr><tr><td>StructList</td><td>Deserialize</td><td>221.1</td><td>687.0</td><td>488.5</td></tr><tr><td>SampleList</td><td>Serialize</td><td>1198.9</td><td>2811.9</td><td>1635.7</td></tr><tr><td>SampleList</td><td>Deserialize</td><td>791.5</td><td>5174.5</td><td>2629.2</td></tr><tr><td>MediaContentList</td><td>Serialize</td><td>1393.9</td><td>2199.4</td><td>1710.9</td></tr><tr><td>MediaContentList</td><td>Deserialize</td><td>1719.5</td><td>3373.1</td><td>3401.2</td></tr></tbody></table>
<p>Serialized data sizes (bytes):</p>
<table><thead><tr><th>Data Type</th><th>Fory</th><th>Protobuf</th><th>Msgpack</th></tr></thead><tbody><tr><td>Struct</td><td>58</td><td>61</td><td>55</td></tr><tr><td>Sample</td><td>446</td><td>460</td><td>562</td></tr><tr><td>MediaContent</td><td>365</td><td>307</td><td>479</td></tr><tr><td>StructList</td><td>184</td><td>315</td><td>284</td></tr><tr><td>SampleList</td><td>1980</td><td>2315</td><td>2819</td></tr><tr><td>MediaContentList</td><td>1535</td><td>1550</td><td>2404</td></tr></tbody></table>
<p>Benchmark details: <a href="https://fory.apache.org/docs/benchmarks/csharp/" target="_blank" rel="noopener noreferrer">https://fory.apache.org/docs/benchmarks/csharp/</a></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="swift-serialization-first-release">Swift Serialization: First Release<a href="https://fory.apache.org/blog/fory_0_16_0_release#swift-serialization-first-release" class="hash-link" aria-label="Direct link to Swift Serialization: First Release" title="Direct link to Swift Serialization: First Release">​</a></h2>
<p>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.</p>
<p><strong>Key capabilities:</strong></p>
<ul>
<li>High-performance serialization for Swift value and reference types</li>
<li><code>@ForyObject</code> macro for zero-boilerplate model serialization</li>
<li>Cross-language protocol compatibility with Java, Python, C++, Go, Rust, and JavaScript</li>
<li>Compatible mode for schema evolution across versions</li>
<li>Dynamic value support for <code>Any</code>, <code>AnyObject</code>, <code>any Serializer</code>, and <code>AnyHashable</code></li>
<li>Reference tracking for shared/circular graphs, including weak references on classes</li>
<li>Swift target support in the Fory IDL/compiler workflow</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="quick-start-1">Quick Start<a href="https://fory.apache.org/blog/fory_0_16_0_release#quick-start-1" class="hash-link" aria-label="Direct link to Quick Start" title="Direct link to Quick Start">​</a></h3>
<div class="language-swift codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-swift codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token class-name">Fory</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token attribute atrule" style="color:#00a4db">@ForyObject</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token class-name">User</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">Equatable</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e3116c">""</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> age</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">Int32</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> fory </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Fory</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">xlang</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> trackRef</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> compatible</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">register</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">User</span><span class="token punctuation" style="color:#393A34">.</span><span class="token keyword" style="color:#00009f">self</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> input </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">User</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e3116c">"Alice"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> age</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">30</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> data </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">try</span><span class="token plain"> fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">serialize</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">input</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> output</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">User</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">try</span><span class="token plain"> fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">deserialize</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">data</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<ul>
<li>Swift guide: <a href="https://fory.apache.org/docs/guide/swift/" target="_blank" rel="noopener noreferrer">https://fory.apache.org/docs/guide/swift/</a></li>
<li>Compiler docs: <a href="https://fory.apache.org/docs/compiler/" target="_blank" rel="noopener noreferrer">https://fory.apache.org/docs/compiler/</a></li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="swift-benchmarks">Swift Benchmarks<a href="https://fory.apache.org/blog/fory_0_16_0_release#swift-benchmarks" class="hash-link" aria-label="Direct link to Swift Benchmarks" title="Direct link to Swift Benchmarks">​</a></h3>
<img src="https://fory.apache.org/img/blog/fory_0_16_0_release/swift_benchmark_combined.png" width="90%">
<p>Below are throughput results (ops/sec; higher is better) comparing Fory with
Protobuf and Msgpack across representative data structures.</p>
<table><thead><tr><th>Data Type</th><th>Operation</th><th>Fory</th><th>Protobuf</th><th>Msgpack</th><th>Fastest</th></tr></thead><tbody><tr><td>Struct</td><td>Serialize</td><td>9,727,950</td><td>6,572,406</td><td>141,248</td><td>fory (1.48x)</td></tr><tr><td>Struct</td><td>Deserialize</td><td>11,889,570</td><td>8,584,510</td><td>99,792</td><td>fory (1.39x)</td></tr><tr><td>Sample</td><td>Serialize</td><td>3,496,305</td><td>1,281,983</td><td>17,188</td><td>fory (2.73x)</td></tr><tr><td>Sample</td><td>Deserialize</td><td>1,045,018</td><td>765,706</td><td>12,767</td><td>fory (1.36x)</td></tr><tr><td>MediaContent</td><td>Serialize</td><td>1,425,354</td><td>678,542</td><td>29,048</td><td>fory (2.10x)</td></tr><tr><td>MediaContent</td><td>Deserialize</td><td>614,447</td><td>478,298</td><td>12,711</td><td>fory (1.28x)</td></tr><tr><td>StructList</td><td>Serialize</td><td>3,307,962</td><td>1,028,210</td><td>24,781</td><td>fory (3.22x)</td></tr><tr><td>StructList</td><td>Deserialize</td><td>2,788,200</td><td>708,596</td><td>8,160</td><td>fory (3.93x)</td></tr><tr><td>SampleList</td><td>Serialize</td><td>715,734</td><td>205,380</td><td>3,361</td><td>fory (3.48x)</td></tr><tr><td>SampleList</td><td>Deserialize</td><td>199,317</td><td>133,425</td><td>1,498</td><td>fory (1.49x)</td></tr><tr><td>MediaContentList</td><td>Serialize</td><td>364,097</td><td>103,721</td><td>5,538</td><td>fory (3.51x)</td></tr><tr><td>MediaContentList</td><td>Deserialize</td><td>103,421</td><td>86,331</td><td>1,529</td><td>fory (1.20x)</td></tr></tbody></table>
<p>Serialized data sizes (bytes):</p>
<table><thead><tr><th>Data Type</th><th>Fory</th><th>Protobuf</th><th>Msgpack</th></tr></thead><tbody><tr><td>MediaContent</td><td>365</td><td>301</td><td>524</td></tr><tr><td>MediaContentList</td><td>1535</td><td>1520</td><td>2639</td></tr><tr><td>Sample</td><td>446</td><td>375</td><td>737</td></tr><tr><td>SampleList</td><td>1980</td><td>1890</td><td>3698</td></tr><tr><td>Struct</td><td>58</td><td>61</td><td>65</td></tr><tr><td>StructList</td><td>184</td><td>315</td><td>338</td></tr></tbody></table>
<p>Benchmark details: <a href="https://fory.apache.org/docs/benchmarks/swift/" target="_blank" rel="noopener noreferrer">https://fory.apache.org/docs/benchmarks/swift/</a></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="features">Features<a href="https://fory.apache.org/blog/fory_0_16_0_release#features" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features">​</a></h2>
<ul>
<li>feat(grpc): update lexer/parser to support service and rpc definitions for idl compilers by @ayush00git in <a href="https://github.com/apache/fory/pull/3308" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3308</a></li>
<li>feat(JavaScript): Support EXT,NAMED_EXT by @theweipeng in <a href="https://github.com/apache/fory/pull/3312" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3312</a></li>
<li>feat(go): add missing type resolver for uint<!-- -->64<!-- -->slice by @BrianLii in <a href="https://github.com/apache/fory/pull/3311" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3311</a></li>
<li>feat(JavaScript): support ForyField by @theweipeng in <a href="https://github.com/apache/fory/pull/3314" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3314</a></li>
<li>feat(JavaScript): align xlang protocol by @theweipeng in <a href="https://github.com/apache/fory/pull/3316" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3316</a></li>
<li>feat(javascript): add float16 support by @ayush00git in <a href="https://github.com/apache/fory/pull/3253" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3253</a></li>
<li>feat(JavaScript): Align testcases by @theweipeng in <a href="https://github.com/apache/fory/pull/3319" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3319</a></li>
<li>feat(go): update float16 array/slice logic in createSerializer by @BrianLii in <a href="https://github.com/apache/fory/pull/3318" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3318</a></li>
<li>feat(JavaScript): Align testcase by @theweipeng in <a href="https://github.com/apache/fory/pull/3320" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3320</a></li>
<li>feat(JavaScript): Align testcases by @theweipeng in <a href="https://github.com/apache/fory/pull/3321" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3321</a></li>
<li>feat(dart): align dart xlang serialization by @chaokunyang in <a href="https://github.com/apache/fory/pull/3322" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3322</a></li>
<li>feat(go): improve test coverage for int slice primitive serializers by @BrianLii in <a href="https://github.com/apache/fory/pull/3313" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3313</a></li>
<li>refactor(dart): revamp runtime API and unify codegen naming by @chaokunyang in <a href="https://github.com/apache/fory/pull/3323" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3323</a></li>
<li>feat(JavaScript):  Align xlang protocol by @theweipeng in <a href="https://github.com/apache/fory/pull/3326" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3326</a></li>
<li>feat(JavaScript): fix test_polymorphic_map by @theweipeng in <a href="https://github.com/apache/fory/pull/3327" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3327</a></li>
<li>feat(dart): align dart with xlang serialization spec by @chaokunyang in <a href="https://github.com/apache/fory/pull/3325" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3325</a></li>
<li>feat(go): add support for bfloat16 by @BrianLii in <a href="https://github.com/apache/fory/pull/3310" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3310</a></li>
<li>feat(javascript): add bfloat16 and bfloat16_array support by @miantalha45 in <a href="https://github.com/apache/fory/pull/3328" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3328</a></li>
<li>feat(JavaScript): fix testcase by @theweipeng in <a href="https://github.com/apache/fory/pull/3334" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3334</a></li>
<li>refactor(dart): register xlang types by Type by @chaokunyang in <a href="https://github.com/apache/fory/pull/3332" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3332</a></li>
<li>feat(javascript): align buffer read/write API with Java naming by @miantalha45 in <a href="https://github.com/apache/fory/pull/3346" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3346</a></li>
<li>refactor(python): unify read/write api for python xlang and native mode by @chaokunyang in <a href="https://github.com/apache/fory/pull/3348" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3348</a></li>
<li>feat(dart): add float16 to dart by @ayush00git in <a href="https://github.com/apache/fory/pull/3336" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3336</a></li>
<li>feat(swift): implement fory serialization for swift language by @chaokunyang in <a href="https://github.com/apache/fory/pull/3359" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3359</a></li>
<li>feat(compiler): add gRPC flags to fory compiler by @ayush00git in <a href="https://github.com/apache/fory/pull/3361" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3361</a></li>
<li>feat(swift): implement schema evolution compatible mode for fory swift by @chaokunyang in <a href="https://github.com/apache/fory/pull/3363" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3363</a></li>
<li>feat(swift): dynamic any serializer for polymorphism by @chaokunyang in <a href="https://github.com/apache/fory/pull/3368" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3368</a></li>
<li>feat(swift): support enum/time serialization for swift by @chaokunyang in <a href="https://github.com/apache/fory/pull/3371" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3371</a></li>
<li>feat(c++): add msgpack cpp benchmark by @chaokunyang in <a href="https://github.com/apache/fory/pull/3365" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3365</a></li>
<li>feat(swift): add direct Fory initializer and update Swift docs by @chaokunyang in <a href="https://github.com/apache/fory/pull/3373" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3373</a></li>
<li>feat: Add IEEE 754 float16 (binary16) support to Rust runtime by @AshharAhmadKhan in <a href="https://github.com/apache/fory/pull/3252" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3252</a></li>
<li>feat(c#): c# serialization implementation by @chaokunyang in <a href="https://github.com/apache/fory/pull/3383" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3383</a></li>
<li>perf(csharp): add csharp benchmarks and optimize hot serialization paths by @chaokunyang in <a href="https://github.com/apache/fory/pull/3396" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3396</a></li>
<li>refactor(benchmarks): rename benchmark directories and update links by @chaokunyang in <a href="https://github.com/apache/fory/pull/3398" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3398</a></li>
<li>refactor(java): unify serializer write/read APIs and remove xwrite/xread by @chaokunyang in <a href="https://github.com/apache/fory/pull/3400" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3400</a></li>
<li>perf(swift): add fory swift serialization benchmark and optimize perf by @chaokunyang in <a href="https://github.com/apache/fory/pull/3395" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3395</a></li>
<li>refactor(c#): refactor serializer interface to minimize API surface by @chaokunyang in <a href="https://github.com/apache/fory/pull/3403" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3403</a></li>
<li>feat(compiler): add csharp target and idl integration tests by @chaokunyang in <a href="https://github.com/apache/fory/pull/3406" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3406</a></li>
<li>feat(swift): harden decode paths and add missing wire type support by @chaokunyang in <a href="https://github.com/apache/fory/pull/3427" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3427</a></li>
<li>feat(c#): add max depth and code lint support by @chaokunyang in <a href="https://github.com/apache/fory/pull/3428" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3428</a></li>
<li>feat(c++/python): support stream deserialization for c++ and python by @chaokunyang in <a href="https://github.com/apache/fory/pull/3307" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3307</a></li>
<li>feat(swift): fory swift schema idl codegen by @chaokunyang in <a href="https://github.com/apache/fory/pull/3433" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3433</a></li>
<li>feat(dart): add configurable deserialization size guardrails  by @yash-agarwa-l in <a href="https://github.com/apache/fory/pull/3434" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3434</a></li>
<li>refactor(dart): merge all runtime exceptions into single fory_exception.dart by @yash-agarwa-l in <a href="https://github.com/apache/fory/pull/3436" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3436</a></li>
<li>perf(python): optimize pyfory collection serialization performance by @chaokunyang in <a href="https://github.com/apache/fory/pull/3441" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3441</a></li>
<li>feat(python): fast cython struct serializer by @chaokunyang in <a href="https://github.com/apache/fory/pull/3443" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3443</a></li>
<li>perf(python): add python benchmark suite by @chaokunyang in <a href="https://github.com/apache/fory/pull/3448" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3448</a></li>
<li>feat(python/cpp): add streaming serialization support to python and c++ by @chaokunyang in <a href="https://github.com/apache/fory/pull/3449" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3449</a></li>
<li>feat(python/c++): shrink stream buffers after struct deserialization by @chaokunyang in <a href="https://github.com/apache/fory/pull/3453" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3453</a></li>
<li>perf(c#): add csharp benchmark results by @chaokunyang in <a href="https://github.com/apache/fory/pull/3451" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3451</a></li>
<li>refactor: clean java serialize api by @chaokunyang in <a href="https://github.com/apache/fory/pull/3454" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3454</a></li>
<li>feat(rust): forbid late type registration after resolver snapshot ini… by @Geethapranay1 in <a href="https://github.com/apache/fory/pull/3435" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3435</a></li>
<li>perf(ci): add Cargo caching to Rust CI jobs by @moon3482 in <a href="https://github.com/apache/fory/pull/3431" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3431</a></li>
<li>feat(python): add configurable size guardrails by @eyad-hazem-elmorsy in <a href="https://github.com/apache/fory/pull/3429" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3429</a></li>
<li>feat(go): add go desrialization support via io streams by @ayush00git in <a href="https://github.com/apache/fory/pull/3374" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3374</a></li>
<li>perf(go): remove //go<!-- -->:inline<!-- --> directives and mark cold paths as //go<!-- -->:noinline<!-- --> by @ayush00git in <a href="https://github.com/apache/fory/pull/3456" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3456</a></li>
<li>feat(c++): add configurable deserialization size guardrails by @shivendra-dev54 in <a href="https://github.com/apache/fory/pull/3455" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3455</a></li>
<li>perf(swift): optimize swift performance by @chaokunyang in <a href="https://github.com/apache/fory/pull/3457" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3457</a></li>
<li>feat(swift): make fory swift usable as deps by @chaokunyang in <a href="https://github.com/apache/fory/pull/3462" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3462</a></li>
<li>perf: add fory performance optimization skill by @chaokunyang in <a href="https://github.com/apache/fory/pull/3463" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3463</a></li>
<li>feat(xlang): support per-type evolution override by @chaokunyang in <a href="https://github.com/apache/fory/pull/3465" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3465</a></li>
<li>feat(javascript): limit the depth of deserialize &amp; serialize by @miantalha45 in <a href="https://github.com/apache/fory/pull/3382" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3382</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="bug-fix">Bug Fix<a href="https://fory.apache.org/blog/fory_0_16_0_release#bug-fix" class="hash-link" aria-label="Direct link to Bug Fix" title="Direct link to Bug Fix">​</a></h2>
<ul>
<li>fix(java): Fix EnumSetSerializer for enums with overriding methods by @NotLebedev in <a href="https://github.com/apache/fory/pull/3315" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3315</a></li>
<li>fix(java): Deserialize nested HashMap subclasses by @mandrean in <a href="https://github.com/apache/fory/pull/3342" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3342</a></li>
<li>fix(java): support TreeSet/TreeMap subclasses without Comparator constructor in SortedSet/SortedMapSerializer by @mandrean in <a href="https://github.com/apache/fory/pull/3344" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3344</a></li>
<li>fix(c++): fix buffer read/write bound check by @chaokunyang in <a href="https://github.com/apache/fory/pull/3418" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3418</a></li>
<li>fix: avoid NoClassDefFoundError in supportCodegenForJavaSerialization by @siy in <a href="https://github.com/apache/fory/pull/3424" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3424</a></li>
<li>fix(docs): updated the compiler guide by @ayush00git in <a href="https://github.com/apache/fory/pull/3420" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3420</a></li>
<li>fix(python): return UTC-aware datetime instead of naive datetime by @yuta4895 in <a href="https://github.com/apache/fory/pull/3439" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3439</a></li>
<li>fix(docs): adjusted sidebar position and fixed typos by @ayush00git in <a href="https://github.com/apache/fory/pull/3450" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3450</a></li>
<li>fix(python): support tuple dataclass fields and object instances by @chaokunyang in <a href="https://github.com/apache/fory/pull/3468" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3468</a></li>
<li>fix(python): fix python wheel build by @chaokunyang in <a href="https://github.com/apache/fory/pull/3469" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3469</a></li>
<li>fix(java): avoid deflater meta decompression hang on invalid input by @chaokunyang in <a href="https://github.com/apache/fory/pull/3472" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3472</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="other-improvements">Other Improvements<a href="https://fory.apache.org/blog/fory_0_16_0_release#other-improvements" class="hash-link" aria-label="Direct link to Other Improvements" title="Direct link to Other Improvements">​</a></h2>
<ul>
<li>docs: update guide and compiler docs by @chaokunyang in <a href="https://github.com/apache/fory/pull/3298" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3298</a></li>
<li>docs: fix broken docs links and add fory-site check ci by @chaokunyang in <a href="https://github.com/apache/fory/pull/3299" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3299</a></li>
<li>docs(java): fix benchmark images by @chaokunyang in <a href="https://github.com/apache/fory/pull/3304" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3304</a></li>
<li>docs(c++): update readme and benchmarks docs by @chaokunyang in <a href="https://github.com/apache/fory/pull/3305" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3305</a></li>
<li>docs: fix incorrect docs by @chaokunyang in <a href="https://github.com/apache/fory/pull/3309" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3309</a></li>
<li>chore: Bump release version to 0.15.0 by @chaokunyang in <a href="https://github.com/apache/fory/pull/3317" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3317</a></li>
<li>chore(deps): bump org.apache.avro<!-- -->:avro<!-- --> from 1.11.4 to 1.11.5 in /benchmarks/java_benchmark by @dependabot[bot] in <a href="https://github.com/apache/fory/pull/3338" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3338</a></li>
<li>chore(python): define dependencies for development environment by @yuta4895 in <a href="https://github.com/apache/fory/pull/3360" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3360</a></li>
<li>docs(java): update java benchmark plots by @chaokunyang in <a href="https://github.com/apache/fory/pull/3366" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3366</a></li>
<li>docs(swift): refine swift api and docs by @chaokunyang in <a href="https://github.com/apache/fory/pull/3372" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3372</a></li>
<li>chore: Bump MessagePack from 2.5.172 to 2.5.187 by @dependabot[bot] in <a href="https://github.com/apache/fory/pull/3401" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3401</a></li>
<li>docs(csharp): add csharp guide and update README by @chaokunyang in <a href="https://github.com/apache/fory/pull/3404" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3404</a></li>
<li>docs: adjust guide docs sidebar by @chaokunyang in <a href="https://github.com/apache/fory/pull/3407" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3407</a></li>
<li>chore(python): handle duplicate field names by @eyad-hazem-elmorsy in <a href="https://github.com/apache/fory/pull/3384" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3384</a></li>
<li>docs: Fix grammar: we follows to we follow by @04cb in <a href="https://github.com/apache/fory/pull/3442" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3442</a></li>
<li>chore(c#): prepare for c# release by @chaokunyang in <a href="https://github.com/apache/fory/pull/3464" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3464</a></li>
<li>docs: add ai contributing policy by @chaokunyang in <a href="https://github.com/apache/fory/pull/3437" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3437</a></li>
<li>docs: simplify PR AI checklist and rename AI policy file by @chaokunyang in <a href="https://github.com/apache/fory/pull/3470" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3470</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="new-contributors">New Contributors<a href="https://fory.apache.org/blog/fory_0_16_0_release#new-contributors" class="hash-link" aria-label="Direct link to New Contributors" title="Direct link to New Contributors">​</a></h2>
<ul>
<li>@BrianLii made their first contribution in <a href="https://github.com/apache/fory/pull/3311" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3311</a></li>
<li>@NotLebedev made their first contribution in <a href="https://github.com/apache/fory/pull/3315" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3315</a></li>
<li>@miantalha45 made their first contribution in <a href="https://github.com/apache/fory/pull/3328" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3328</a></li>
<li>@yuta4895 made their first contribution in <a href="https://github.com/apache/fory/pull/3360" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3360</a></li>
<li>@AshharAhmadKhan made their first contribution in <a href="https://github.com/apache/fory/pull/3252" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3252</a></li>
<li>@siy made their first contribution in <a href="https://github.com/apache/fory/pull/3424" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3424</a></li>
<li>@yash-agarwa-l made their first contribution in <a href="https://github.com/apache/fory/pull/3434" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3434</a></li>
<li>@eyad-hazem-elmorsy made their first contribution in <a href="https://github.com/apache/fory/pull/3384" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3384</a></li>
<li>@04cb made their first contribution in <a href="https://github.com/apache/fory/pull/3442" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3442</a></li>
<li>@Geethapranay1 made their first contribution in <a href="https://github.com/apache/fory/pull/3435" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3435</a></li>
<li>@moon3482 made their first contribution in <a href="https://github.com/apache/fory/pull/3431" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3431</a></li>
<li>@shivendra-dev54 made their first contribution in <a href="https://github.com/apache/fory/pull/3455" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3455</a>
<strong>Full Changelog</strong>: <a href="https://github.com/apache/fory/compare/v0.15.0...v0.16.0" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/compare/v0.15.0...v0.16.0</a></li>
</ul>]]></content>
        <author>
            <name>Shawn Yang</name>
            <uri>https://github.com/chaokunyang</uri>
        </author>
        <category label="fory" term="fory"/>
        <category label="c#" term="c#"/>
        <category label="swift" term="swift"/>
        <category label="java" term="java"/>
        <category label="python" term="python"/>
        <category label="compiler" term="compiler"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Extend Protobuf/FlatBuffers Schema IDL with Shared/Circular Reference Support]]></title>
        <id>https://fory.apache.org/blog/extend_protobuf_flatbuffers_with_shared_circular_refs</id>
        <link href="https://fory.apache.org/blog/extend_protobuf_flatbuffers_with_shared_circular_refs"/>
        <updated>2026-03-11T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[TL;DR: If you already have .proto or .fbs schemas and you want shared/circular reference support, with the Fory compiler you can keep those schemas, add a small set of Fory options, then foryc generates idiomatic native models across Fory-supported languages, so you can serialize object graphs without manual *_id link reconstruction or rewriting your entire schema into Fory Schema.]]></summary>
        <content type="html"><![CDATA[<p><strong>TL;DR</strong>: If you already have <code>.proto</code> or <code>.fbs</code> schemas and you want shared/circular reference support, with the Fory compiler you can keep those schemas, add a small set of Fory options, then <code>foryc</code> generates idiomatic native models across Fory-supported languages, so you can serialize object graphs without manual <code>*_id</code> link reconstruction or rewriting your entire schema into Fory Schema.</p>
<ul>
<li>GitHub: <a href="https://github.com/apache/fory" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory</a></li>
<li>Compiler docs: <a href="https://fory.apache.org/docs/compiler" target="_blank" rel="noopener noreferrer">https://fory.apache.org/docs/compiler</a></li>
<li>Install: <code>pip install fory-compiler</code></li>
</ul>
<img src="https://fory.apache.org/img/fory-logo-light.png" width="50%">
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-gap-in-protobuf-and-flatbuffers-schemas">The Gap in Protobuf and FlatBuffers Schemas<a href="https://fory.apache.org/blog/extend_protobuf_flatbuffers_with_shared_circular_refs#the-gap-in-protobuf-and-flatbuffers-schemas" class="hash-link" aria-label="Direct link to The Gap in Protobuf and FlatBuffers Schemas" title="Direct link to The Gap in Protobuf and FlatBuffers Schemas">​</a></h2>
<p>Many production models are object graphs, not pure value trees:</p>
<ul>
<li>Parent pointers (<code>child.parent</code>)</li>
<li>Shared nodes (two edges pointing to the same object)</li>
<li>Cycles (A -&gt; B -&gt; A)</li>
</ul>
<p>In plain protobuf or FlatBuffers schema design, these relationships are usually represented indirectly with manual ID links (<code>parent_id</code>, <code>child_ids</code>) and rebuilt in application code after decode.</p>
<p>Apache Fory adds schema-level reference tracking so these graph semantics can be declared directly in protobuf/FlatBuffers source via Fory options.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="keep-proto-and-fbs-add-graph-semantics">Keep <code>.proto</code> and <code>.fbs</code>, Add Graph Semantics<a href="https://fory.apache.org/blog/extend_protobuf_flatbuffers_with_shared_circular_refs#keep-proto-and-fbs-add-graph-semantics" class="hash-link" aria-label="Direct link to keep-proto-and-fbs-add-graph-semantics" title="Direct link to keep-proto-and-fbs-add-graph-semantics">​</a></h2>
<p>You do not need to rewrite everything into <code>.fdl</code> first.</p>
<ul>
<li>For protobuf input, use <code>(fory).ref</code>, <code>(fory).weak_ref</code>, and related options.</li>
<li>For FlatBuffers input, use <code>fory_ref:true</code>, <code>fory_weak_ref:true</code>, and related attributes.</li>
<li>Compile with <code>foryc</code>.</li>
<li>Get Fory-generated models and Fory wire format.</li>
</ul>
<p>Important: this path reuses schema syntax and structure, but serialization output is Fory binary protocol, not protobuf/FlatBuffers wire compatibility.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="protobuf-from-id-workarounds-to-ref">Protobuf: From ID Workarounds to <code>ref</code><a href="https://fory.apache.org/blog/extend_protobuf_flatbuffers_with_shared_circular_refs#protobuf-from-id-workarounds-to-ref" class="hash-link" aria-label="Direct link to protobuf-from-id-workarounds-to-ref" title="Direct link to protobuf-from-id-workarounds-to-ref">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="protobuf-style-workaround-value-tree-oriented">Protobuf-style workaround (value-tree oriented)<a href="https://fory.apache.org/blog/extend_protobuf_flatbuffers_with_shared_circular_refs#protobuf-style-workaround-value-tree-oriented" class="hash-link" aria-label="Direct link to Protobuf-style workaround (value-tree oriented)" title="Direct link to Protobuf-style workaround (value-tree oriented)">​</a></h3>
<div class="language-protobuf codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-protobuf codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">message</span><span class="token plain"> </span><span class="token class-name">TreeNode</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token builtin">string</span><span class="token plain"> id </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token builtin">string</span><span class="token plain"> parent_id </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">repeated</span><span class="token plain"> </span><span class="token builtin">string</span><span class="token plain"> child_ids </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="protobuf--fory-options-graph-semantics">Protobuf + Fory options (graph semantics)<a href="https://fory.apache.org/blog/extend_protobuf_flatbuffers_with_shared_circular_refs#protobuf--fory-options-graph-semantics" class="hash-link" aria-label="Direct link to Protobuf + Fory options (graph semantics)" title="Direct link to Protobuf + Fory options (graph semantics)">​</a></h3>
<div class="language-protobuf codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-protobuf codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">syntax</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"proto3"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">message</span><span class="token plain"> </span><span class="token class-name">TreeNode</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token positional-class-name class-name">TreeNode</span><span class="token plain"> parent </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">fory</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">weak_ref </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">repeated</span><span class="token plain"> </span><span class="token positional-class-name class-name">TreeNode</span><span class="token plain"> children </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">fory</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ref </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>What this means:</p>
<ul>
<li><code>weak_ref = true</code> implies ref tracking and generates weak-pointer semantics where relevant (for example C++/Rust).</li>
<li>For <code>repeated</code> fields, <code>(fory).ref = true</code> applies to list elements.</li>
<li>For <code>map&lt;K, V&gt;</code>, <code>(fory).ref = true</code> applies to map values.</li>
</ul>
<p>You can also tune Rust pointer flavor:</p>
<div class="language-protobuf codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-protobuf codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">message</span><span class="token plain"> </span><span class="token class-name">Graph</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token positional-class-name class-name">Node</span><span class="token plain"> root </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">fory</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ref </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">fory</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">thread_safe_pointer </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="flatbuffers-add-fory_ref-attributes">FlatBuffers: Add <code>fory_ref</code> Attributes<a href="https://fory.apache.org/blog/extend_protobuf_flatbuffers_with_shared_circular_refs#flatbuffers-add-fory_ref-attributes" class="hash-link" aria-label="Direct link to flatbuffers-add-fory_ref-attributes" title="Direct link to flatbuffers-add-fory_ref-attributes">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="flatbuffers-schema-with-fory-reference-attributes">FlatBuffers schema with Fory reference attributes<a href="https://fory.apache.org/blog/extend_protobuf_flatbuffers_with_shared_circular_refs#flatbuffers-schema-with-fory-reference-attributes" class="hash-link" aria-label="Direct link to FlatBuffers schema with Fory reference attributes" title="Direct link to FlatBuffers schema with Fory reference attributes">​</a></h3>
<div class="language-fbs codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-fbs codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">namespace demo;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">table Node {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  parent: Node (fory_weak_ref: true);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  children: [Node] (fory_ref: true);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  cached: Node (fory_ref: true, fory_thread_safe_pointer: false);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Semantics:</p>
<ul>
<li><code>fory_weak_ref:true</code> implies reference tracking.</li>
<li><code>fory_thread_safe_pointer</code> affects pointer flavor on ref-tracked fields.</li>
<li>For list fields, <code>fory_ref:true</code> applies to elements.</li>
</ul>
<p>FlatBuffers input is translated into Fory IR, then normal Fory codegen runs. The generated API surface is native objects (not FlatBuffers <code>ByteBuffer</code>-wrapper APIs).</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="inspect-before-you-commit">Inspect Before You Commit<a href="https://fory.apache.org/blog/extend_protobuf_flatbuffers_with_shared_circular_refs#inspect-before-you-commit" class="hash-link" aria-label="Direct link to Inspect Before You Commit" title="Direct link to Inspect Before You Commit">​</a></h2>
<p>You can inspect how <code>.proto</code> or <code>.fbs</code> is translated:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Protobuf to translated Fory schema</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">foryc schema.proto --emit-fdl</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># FlatBuffers to translated Fory schema</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">foryc schema.fbs --emit-fdl --emit-fdl-path ./translated</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Then generate code:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">foryc schema.proto </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">--java_out</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">./java/gen </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">--python_out</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">./python/gen </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">--go_out</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">./go/gen </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">--rust_out</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">./rust/gen </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">--cpp_out</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">./cpp/gen</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>This is the migration-friendly loop:</p>
<ol>
<li>Keep existing schema files.</li>
<li>Add only Fory reference options where graph semantics are required.</li>
<li>Inspect translated <code>.fdl</code>.</li>
<li>Generate and run roundtrip tests.</li>
</ol>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-you-get-after-generation">What You Get After Generation<a href="https://fory.apache.org/blog/extend_protobuf_flatbuffers_with_shared_circular_refs#what-you-get-after-generation" class="hash-link" aria-label="Direct link to What You Get After Generation" title="Direct link to What You Get After Generation">​</a></h2>
<p>With Fory codegen, you get native language models and reference-aware serialization behavior:</p>
<ul>
<li>Java: POJOs/records with Fory metadata</li>
<li>Python: dataclasses + registration helpers</li>
<li>Go: structs with tags</li>
<li>Rust: native structs with ref-pointer mapping</li>
<li>C++: native classes/structs with shared/weak pointer mapping</li>
<li>C#, Swift, and more: idiomatic generated models</li>
</ul>
<p>For object-graph-heavy workflows, this removes a common layer of manual ID-link hydration code.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="behavioral-boundaries-to-keep-in-mind">Behavioral Boundaries to Keep in Mind<a href="https://fory.apache.org/blog/extend_protobuf_flatbuffers_with_shared_circular_refs#behavioral-boundaries-to-keep-in-mind" class="hash-link" aria-label="Direct link to Behavioral Boundaries to Keep in Mind" title="Direct link to Behavioral Boundaries to Keep in Mind">​</a></h2>
<ol>
<li>
<p>This is not protobuf or FlatBuffers wire compatibility.
The schema frontend is reused, but bytes on the wire are Fory protocol.</p>
</li>
<li>
<p>Protobuf unknown-field behavior is different.
Protobuf preserves unknown fields; Fory does not preserve protobuf unknown-field payloads.</p>
</li>
<li>
<p>Reference tracking should be explicit and minimal.
Use <code>ref</code>/<code>weak_ref</code> for true shared/cyclic parts of the graph, not for all fields.</p>
</li>
</ol>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="practical-migration-pattern">Practical Migration Pattern<a href="https://fory.apache.org/blog/extend_protobuf_flatbuffers_with_shared_circular_refs#practical-migration-pattern" class="hash-link" aria-label="Direct link to Practical Migration Pattern" title="Direct link to Practical Migration Pattern">​</a></h2>
<p>If you already run protobuf or FlatBuffers in production:</p>
<ol>
<li>Keep package/namespace names stable.</li>
<li>Add Fory reference options only to graph-shaped fields.</li>
<li>Generate code with <code>foryc</code> and run roundtrip tests.</li>
<li>Migrate internal object-heavy paths first.</li>
<li>Keep external protobuf/gRPC boundaries as-is when needed.</li>
</ol>
<p>This lets you adopt graph semantics incrementally without a full schema rewrite.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="conclusion">Conclusion<a href="https://fory.apache.org/blog/extend_protobuf_flatbuffers_with_shared_circular_refs#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion">​</a></h2>
<p>Protobuf and FlatBuffers schema files can be a starting point for Fory graph-aware serialization, not a blocker.</p>
<p>By adding a small set of Fory extension options (<code>ref</code>, <code>weak_ref</code>, pointer-style hints), you can express shared identity and circular links directly in existing <code>.proto</code>/<code>.fbs</code> sources, generate native models, and remove manual object-link reconstruction code in object-graph-heavy systems.</p>
<p>If your data model is a graph, make that graph explicit in the schema.</p>
<p><strong>Get started:</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">pip </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> fory-compiler</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">foryc </span><span class="token parameter variable" style="color:#36acaa">--help</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><strong>References:</strong></p>
<ul>
<li>Object-graph Schema IDL reference article: <a href="https://fory.apache.org/blog/fory_schema_idl_for_object_graph" target="_blank" rel="noopener noreferrer">https://fory.apache.org/blog/fory_schema_idl_for_object_graph</a></li>
<li>Protobuf IDL support: <a href="https://fory.apache.org/docs/compiler/protobuf_idl_support" target="_blank" rel="noopener noreferrer">https://fory.apache.org/docs/compiler/protobuf_idl_support</a></li>
<li>FlatBuffers IDL support: <a href="https://fory.apache.org/docs/compiler/flatbuffers_idl" target="_blank" rel="noopener noreferrer">https://fory.apache.org/docs/compiler/flatbuffers_idl</a></li>
<li>Schema syntax (<code>ref</code>, <code>optional</code>, <code>union</code>): <a href="https://fory.apache.org/docs/compiler/syntax" target="_blank" rel="noopener noreferrer">https://fory.apache.org/docs/compiler/syntax</a></li>
<li>Generated code overview: <a href="https://fory.apache.org/docs/compiler/generated_code" target="_blank" rel="noopener noreferrer">https://fory.apache.org/docs/compiler/generated_code</a></li>
</ul>]]></content>
        <author>
            <name>Shawn Yang</name>
            <uri>https://github.com/chaokunyang</uri>
        </author>
        <category label="fory" term="fory"/>
        <category label="protobuf" term="protobuf"/>
        <category label="flatbuffers" term="flatbuffers"/>
        <category label="idl" term="idl"/>
        <category label="serialization" term="serialization"/>
        <category label="references" term="references"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Apache Fory™ Schema IDL: Serialization IDL for Object Graphs and Generated API Ergonomics]]></title>
        <id>https://fory.apache.org/blog/fory_schema_idl_for_object_graph</id>
        <link href="https://fory.apache.org/blog/fory_schema_idl_for_object_graph"/>
        <updated>2026-03-09T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[TL;DR: Apache Fory Schema IDL is the first cross-language serialization IDL for object graphs serialization. Define your types once in a .fdl file, and the compiler generates idiomatic domain objects for Java, Python, Go, Rust, C++, C#, Swift, and more — with shared refs, cycles, polymorphism, schema evolution, and optional types built into the schema model.]]></summary>
        <content type="html"><![CDATA[<p><strong>TL;DR</strong>: Apache Fory Schema IDL is the first cross-language serialization IDL for <strong>object graphs serialization</strong>. Define your types once in a <code>.fdl</code> file, and the compiler generates idiomatic domain objects for <strong>Java, Python, Go, Rust, C++, C#, Swift, and more</strong> — with shared refs, cycles, polymorphism, schema evolution, and optional types built into the schema model.</p>
<ul>
<li>GitHub: <a href="https://github.com/apache/fory" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory</a></li>
<li>Docs: <a href="https://fory.apache.org/docs/compiler" target="_blank" rel="noopener noreferrer">https://fory.apache.org/docs/compiler</a></li>
<li>Install: <code>pip install fory-compiler</code></li>
</ul>
<img src="https://fory.apache.org/img/fory-logo-light.png" width="50%">
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-object-graph-gap">The Object Graph Gap<a href="https://fory.apache.org/blog/fory_schema_idl_for_object_graph#the-object-graph-gap" class="hash-link" aria-label="Direct link to The Object Graph Gap" title="Direct link to The Object Graph Gap">​</a></h2>
<p>Most existing serialization IDLs model data as value trees: flat messages with no schema-level notion of shared identity, cycles, or reusable standalone polymorphic types. When the actual data is a graph, that gap usually shows up in three places:</p>
<ol>
<li>
<p><strong>Shared and Circular References</strong>: If two fields refer to the same logical object, Protocol Buffers and FlatBuffers do not preserve that shared identity in the schema or on the wire. Parent pointers, DAGs, and cycles have no schema-level representation, so they fall back to manual ID fields and application-side reconstruction.</p>
</li>
<li>
<p><strong>Polymorphism</strong>: Protobuf <code>oneof</code> and FlatBuffers <code>union</code> are inline alternatives embedded in an enclosing message, not reusable standalone schema types. Protobuf <code>Any</code> supports open-ended polymorphism, but only for messages and via a type URL. FlatBuffers has no equivalent.</p>
</li>
<li>
<p><strong>Generated Types as Domain Models</strong>: FlatBuffers APIs are primarily buffer-access wrappers. Protobuf generates transport-first types in many languages, so users often add a conversion layer to get back to idiomatic domain objects. The schema defines the wire format, but not the application model.</p>
</li>
</ol>
<p>Apache Fory Schema IDL closes that gap.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-makes-fory-idl-different">What Makes Fory IDL Different?<a href="https://fory.apache.org/blog/fory_schema_idl_for_object_graph#what-makes-fory-idl-different" class="hash-link" aria-label="Direct link to What Makes Fory IDL Different?" title="Direct link to What Makes Fory IDL Different?">​</a></h2>
<p>Apache Fory Schema IDL is built around object graphs as a first-class concept. You define your types once — including shared references, circular structures, standalone unions, and polymorphic fields — run the compiler, and get idiomatic code in every supported language on top of the same Fory wire format.</p>
<p>In this article, "serialization IDL for object graphs" means the schema itself can describe shared identity, cycles, and reusable polymorphic types directly, instead of forcing users to flatten everything into value trees and rebuild links with manual IDs or application-side conventions later.</p>
<p>That shows up in three places:</p>
<ul>
<li><code>ref</code> makes shared references and cycles part of the schema contract.</li>
<li><code>union</code> and <code>any</code> make polymorphism a reusable schema feature rather than only an inline transport detail.</li>
<li>The generated code stays usable as host-language application models instead of wrapper types that require another conversion layer.</li>
</ul>
<p>The sections below show how that works in practice.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="first-class-shared-references">First-Class Shared References<a href="https://fory.apache.org/blog/fory_schema_idl_for_object_graph#first-class-shared-references" class="hash-link" aria-label="Direct link to First-Class Shared References" title="Direct link to First-Class Shared References">​</a></h3>
<p>Fory IDL has a <code>ref</code> modifier that makes shared and circular reference tracking explicit in the schema:</p>
<div class="language-protobuf codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-protobuf codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">message</span><span class="token plain"> </span><span class="token class-name">TreeNode</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token builtin">string</span><span class="token plain"> value </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    ref </span><span class="token positional-class-name class-name">TreeNode</span><span class="token plain"> parent </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">          </span><span class="token comment" style="color:#999988;font-style:italic">// Shared reference — can point back</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    list</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">ref TreeNode</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> children </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Each child is reference-tracked</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>When you serialize a tree where children point back to their parent, Fory encodes each object exactly once and uses back-references for duplicates. No manual ID-link fields. No application-level reconstruction logic. The object graph contract lives in the schema itself.</p>
<p>For parent pointers where you want to break ownership cycles, <code>ref(weak=true)</code> generates weak pointer types (e.g., <code>ArcWeak&lt;Node&gt;</code> in Rust, <code>std::weak_ptr</code> in C++).</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="idiomatic-domain-objects-not-wrappers">Idiomatic Domain Objects, Not Wrappers<a href="https://fory.apache.org/blog/fory_schema_idl_for_object_graph#idiomatic-domain-objects-not-wrappers" class="hash-link" aria-label="Direct link to Idiomatic Domain Objects, Not Wrappers" title="Direct link to Idiomatic Domain Objects, Not Wrappers">​</a></h3>
<p>A key difference from Protocol Buffers and FlatBuffers is that compiling a Fory <code>.fdl</code> schema produces host-language models you can use directly:</p>
<ul>
<li><strong>Java</strong>: Plain POJOs with <code>@ForyField</code> annotations — usable directly in Spring, Hibernate, or any framework</li>
<li><strong>Python</strong>: <code>@dataclass</code> types with standard type hints</li>
<li><strong>Go</strong>: Structs with <code>fory:"id=..."</code> struct tags</li>
<li><strong>Rust</strong>: Structs with <code>#[derive(ForyObject)]</code></li>
<li><strong>C++</strong>: <code>final</code> classes with <code>FORY_STRUCT</code> macros — zero runtime reflection</li>
<li><strong>C#</strong>: Classes with <code>[ForyObject]</code> attributes</li>
<li><strong>Swift</strong>: <code>@ForyObject</code> models with <code>@ForyField</code> metadata</li>
</ul>
<p>In many applications, no adapter layer is needed. The generated types can be used directly as your domain objects.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="built-in-unions-sum-types">Built-In Unions (Sum Types)<a href="https://fory.apache.org/blog/fory_schema_idl_for_object_graph#built-in-unions-sum-types" class="hash-link" aria-label="Direct link to Built-In Unions (Sum Types)" title="Direct link to Built-In Unions (Sum Types)">​</a></h3>
<p>Fory IDL has a first-class <code>union</code> construct that maps to the most idiomatic sum type in each language:</p>
<div class="language-protobuf codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-protobuf codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">message</span><span class="token plain"> </span><span class="token class-name">Dog</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token builtin">string</span><span class="token plain"> name </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token builtin">int32</span><span class="token plain"> bark_volume </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">message</span><span class="token plain"> </span><span class="token class-name">Cat</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token builtin">string</span><span class="token plain"> name </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token builtin">int32</span><span class="token plain"> lives </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">union Animal </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token positional-class-name class-name">Dog</span><span class="token plain"> dog </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token positional-class-name class-name">Cat</span><span class="token plain"> cat </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>This generates:</p>
<ul>
<li><strong>Rust</strong>: <code>enum Animal { Dog(Dog), Cat(Cat) }</code></li>
<li><strong>C++</strong>: <code>std::variant</code>-based wrapper with <code>is_dog()</code>, <code>as_dog()</code>, <code>visit()</code> APIs</li>
<li><strong>Swift</strong>: Tagged enum with associated values</li>
<li><strong>Java</strong>: <code>Union</code> subclass with typed case accessors</li>
<li><strong>Python</strong>: <code>Union</code> subclass with <code>is_dog()</code> / <code>dog_value()</code> helpers</li>
<li><strong>Go</strong>: Typed case struct with <code>AsDog()</code> / visitor pattern</li>
<li><strong>C#</strong>: <code>Union</code> subclass with <code>IsDog</code> / <code>DogValue()</code> helpers</li>
</ul>
<p>Every language gets the same semantics, but expressed in each language's idiom.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="polymorphic-fields-with-any">Polymorphic Fields with <code>any</code><a href="https://fory.apache.org/blog/fory_schema_idl_for_object_graph#polymorphic-fields-with-any" class="hash-link" aria-label="Direct link to polymorphic-fields-with-any" title="Direct link to polymorphic-fields-with-any">​</a></h3>
<p>Sometimes you don't know the concrete type of a field at schema-definition time. An event bus carries heterogeneous payloads. A plugin system accepts user-defined message types. Fory IDL's <code>any</code> type handles this — it writes the runtime type identity into the binary stream and resolves it on the other side:</p>
<div class="language-protobuf codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-protobuf codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">message</span><span class="token plain"> </span><span class="token class-name">Envelope</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token builtin">string</span><span class="token plain"> event_type </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token positional-class-name class-name">any</span><span class="token plain"> payload </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">          </span><span class="token comment" style="color:#999988;font-style:italic">// Carries dynamic values supported by Fory</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>At runtime, <code>payload</code> can hold dynamic values supported by Fory — other generated messages, built-in scalars, or collection types. The serialized bytes include runtime type metadata, so the deserializer can reconstruct the concrete value on the other side:</p>
<table><thead><tr><th>Language</th><th>Generated Field Type</th></tr></thead><tbody><tr><td>Java</td><td><code>Object payload</code></td></tr><tr><td>Python</td><td><code>payload: Any</code></td></tr><tr><td>Go</td><td><code>Payload any</code></td></tr><tr><td>Rust</td><td><code>payload: Box&lt;dyn Any&gt;</code></td></tr><tr><td>C++</td><td><code>std::any payload</code></td></tr><tr><td>C#</td><td><code>object Payload</code></td></tr><tr><td>Swift</td><td><code>var payload: Any</code></td></tr></tbody></table>
<p>This gives you protobuf <code>Any</code>-like flexibility, but in the generated Fory model and without requiring protobuf-style type URLs in the schema surface.</p>
<p>The three features above — <code>ref</code>, <code>union</code>/<code>any</code>, and idiomatic generated code — make Fory IDL an object-graph-first schema language. Schema evolution is a separate concern, but it completes the production story:</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="schema-evolution-out-of-the-box">Schema Evolution Out of the Box<a href="https://fory.apache.org/blog/fory_schema_idl_for_object_graph#schema-evolution-out-of-the-box" class="hash-link" aria-label="Direct link to Schema Evolution Out of the Box" title="Direct link to Schema Evolution Out of the Box">​</a></h3>
<p>Add fields, remove fields, deploy independently. In compatible mode, fields are matched by field id, missing fields get defaults, and unknown fields are skipped:</p>
<div class="language-protobuf codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-protobuf codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Version 1 — deployed to production</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">message</span><span class="token plain"> </span><span class="token class-name">User</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token builtin">string</span><span class="token plain"> name </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token builtin">int32</span><span class="token plain"> age </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Version 2 — new field added by another team</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">message</span><span class="token plain"> </span><span class="token class-name">User</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token builtin">string</span><span class="token plain"> name </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token builtin">int32</span><span class="token plain"> age </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">optional</span><span class="token plain"> </span><span class="token builtin">string</span><span class="token plain"> email </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// New: safely ignored by V1 consumers</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>This still follows compatibility rules; it is not a license for arbitrary schema changes. But for normal additive and removal changes, you do not need coordinated big-bang deployments or a separate version-negotiation layer.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="a-complete-walkthrough">A Complete Walkthrough<a href="https://fory.apache.org/blog/fory_schema_idl_for_object_graph#a-complete-walkthrough" class="hash-link" aria-label="Direct link to A Complete Walkthrough" title="Direct link to A Complete Walkthrough">​</a></h2>
<p>Let's build a realistic e-commerce schema, see it work across current Fory-supported languages, and then make the object-graph part explicit with a shared-customer round trip.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="1-define-the-schema">1. Define the Schema<a href="https://fory.apache.org/blog/fory_schema_idl_for_object_graph#1-define-the-schema" class="hash-link" aria-label="Direct link to 1. Define the Schema" title="Direct link to 1. Define the Schema">​</a></h3>
<p>Create <code>ecommerce.fdl</code>:</p>
<div class="language-protobuf codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-protobuf codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">package</span><span class="token plain"> ecommerce</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">enum</span><span class="token plain"> </span><span class="token class-name">OrderStatus</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    PENDING </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    CONFIRMED </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    SHIPPED </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    DELIVERED </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">message</span><span class="token plain"> </span><span class="token class-name">Address</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token builtin">string</span><span class="token plain"> street </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token builtin">string</span><span class="token plain"> city </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token builtin">string</span><span class="token plain"> country </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">message</span><span class="token plain"> </span><span class="token class-name">Customer</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token builtin">string</span><span class="token plain"> id </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token builtin">string</span><span class="token plain"> name </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">optional</span><span class="token plain"> </span><span class="token builtin">string</span><span class="token plain"> email </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">optional</span><span class="token plain"> </span><span class="token positional-class-name class-name">Address</span><span class="token plain"> address </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">message</span><span class="token plain"> </span><span class="token class-name">OrderItem</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token builtin">string</span><span class="token plain"> sku </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token builtin">int32</span><span class="token plain"> quantity </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token positional-class-name class-name">float64</span><span class="token plain"> unit_price </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">message</span><span class="token plain"> </span><span class="token class-name">Order</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token builtin">string</span><span class="token plain"> order_id </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    ref </span><span class="token positional-class-name class-name">Customer</span><span class="token plain"> customer </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    list</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">OrderItem</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> items </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token positional-class-name class-name">OrderStatus</span><span class="token plain"> status </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token positional-class-name class-name">float64</span><span class="token plain"> total </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">optional</span><span class="token plain"> </span><span class="token builtin">string</span><span class="token plain"> notes </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">6</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token positional-class-name class-name">timestamp</span><span class="token plain"> created_at </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">7</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">message</span><span class="token plain"> </span><span class="token class-name">OrderBatch</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    list</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">Order</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> orders </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="2-install-the-compiler-and-generate-code">2. Install the Compiler and Generate Code<a href="https://fory.apache.org/blog/fory_schema_idl_for_object_graph#2-install-the-compiler-and-generate-code" class="hash-link" aria-label="Direct link to 2. Install the Compiler and Generate Code" title="Direct link to 2. Install the Compiler and Generate Code">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">pip </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> fory-compiler</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Generate code for all currently supported Fory IDL languages in one command</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">foryc ecommerce.fdl </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">--java_out</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">./java/src/main/java </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">--python_out</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">./python/gen </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">--go_out</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">./go/gen </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">--rust_out</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">./rust/gen </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">--cpp_out</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">./cpp/gen </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">--csharp_out</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">./csharp/gen </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#36acaa">--swift_out</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">./swift/gen</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>A single command can generate code for multiple languages. Registration helpers, byte helpers, and type IDs are generated automatically.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="3-use-the-generated-code">3. Use the Generated Code<a href="https://fory.apache.org/blog/fory_schema_idl_for_object_graph#3-use-the-generated-code" class="hash-link" aria-label="Direct link to 3. Use the Generated Code" title="Direct link to 3. Use the Generated Code">​</a></h3>
<p><strong>Java</strong> — serialize an order:</p>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token import namespace" style="opacity:0.7">ecommerce</span><span class="token import namespace punctuation" style="opacity:0.7;color:#393A34">.</span><span class="token import operator" style="color:#393A34">*</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token class-name">Order</span><span class="token plain"> order </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">Order</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">order</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">setOrderId</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"ORD-2026-001"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token class-name">Customer</span><span class="token plain"> customer </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">Customer</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">customer</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">setName</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Alice"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">customer</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">setEmail</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"alice@example.com"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">order</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">setCustomer</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">customer</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">order</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">setStatus</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">OrderStatus</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">CONFIRMED</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">order</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">setTotal</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">259.98</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// toBytes() / fromBytes() are generated — no Fory boilerplate</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">byte</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> bytes </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> order</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">toBytes</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token class-name">Order</span><span class="token plain"> restored </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Order</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">fromBytes</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">bytes</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><strong>Python</strong> — deserialize the same bytes:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> ecommerce </span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> Order</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># from_bytes() handles registration and deserialization</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">order </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Order</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">from_bytes</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">bytes_from_java</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-interpolation string" style="color:#e3116c">f"</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">order</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">.</span><span class="token string-interpolation interpolation">order_id</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">: </span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">order</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">.</span><span class="token string-interpolation interpolation">customer</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">.</span><span class="token string-interpolation interpolation">name</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c"> — $</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">order</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">.</span><span class="token string-interpolation interpolation">total</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># ORD-2026-001: Alice — $259.98</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><strong>Go</strong> — process the order:</p>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"gen/ecommerce"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> order ecommerce</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Order</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> order</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">FromBytes</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">bytesFromJava</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">panic</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">err</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">fmt</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Printf</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"%s: %s — $%.2f\n"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> order</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">OrderId</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> order</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Customer</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Name</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> order</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Total</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><strong>Rust</strong> — type-safe deserialization:</p>
<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">use</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">gen</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">::</span><span class="token namespace" style="opacity:0.7">ecommerce</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">::</span><span class="token class-name">Order</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> order </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Order</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">from_bytes</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">bytes_from_java</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">?</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token macro property" style="color:#36acaa">println!</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"{}: {} — ${:.2}"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> order</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">order_id</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> order</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">customer</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">name</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> order</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">total</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><strong>C++</strong> — zero-overhead access:</p>
<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token macro property directive-hash" style="color:#36acaa">#</span><span class="token macro property directive keyword" style="color:#00009f">include</span><span class="token macro property" style="color:#36acaa"> </span><span class="token macro property string" style="color:#e3116c">"gen/ecommerce.h"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">auto</span><span class="token plain"> order </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> ecommerce</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token class-name">Order</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">from_bytes</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">bytes_from_java</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">value</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">cout </span><span class="token operator" style="color:#393A34">&lt;&lt;</span><span class="token plain"> order</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">order_id</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;&lt;</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">": "</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;&lt;</span><span class="token plain"> order</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">customer</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">name</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token operator" style="color:#393A34">&lt;&lt;</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">" — $"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;&lt;</span><span class="token plain"> order</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">total</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;&lt;</span><span class="token plain"> std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">endl</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><strong>C#</strong> — strongly-typed deserialization:</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">using Ecommerce;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">var order = Order.FromBytes(bytesFromJava);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Console.WriteLine($"{order.OrderId}: {order.Customer.Name} — ${order.Total}");</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><strong>Swift</strong> — idiomatic model access:</p>
<div class="language-swift codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-swift codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token class-name">Ecommerce</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> order </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">try</span><span class="token plain"> </span><span class="token class-name">Order</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">fromBytes</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">bytesFromJava</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-literal string" style="color:#e3116c">"</span><span class="token string-literal interpolation-punctuation punctuation" style="color:#393A34">\(</span><span class="token string-literal interpolation">order</span><span class="token string-literal interpolation punctuation" style="color:#393A34">.</span><span class="token string-literal interpolation">orderId</span><span class="token string-literal interpolation-punctuation punctuation" style="color:#393A34">)</span><span class="token string-literal string" style="color:#e3116c">: </span><span class="token string-literal interpolation-punctuation punctuation" style="color:#393A34">\(</span><span class="token string-literal interpolation">order</span><span class="token string-literal interpolation punctuation" style="color:#393A34">.</span><span class="token string-literal interpolation">customer</span><span class="token string-literal interpolation punctuation" style="color:#393A34">.</span><span class="token string-literal interpolation">name</span><span class="token string-literal interpolation-punctuation punctuation" style="color:#393A34">)</span><span class="token string-literal string" style="color:#e3116c"> — $</span><span class="token string-literal interpolation-punctuation punctuation" style="color:#393A34">\(</span><span class="token string-literal interpolation">order</span><span class="token string-literal interpolation punctuation" style="color:#393A34">.</span><span class="token string-literal interpolation">total</span><span class="token string-literal interpolation-punctuation punctuation" style="color:#393A34">)</span><span class="token string-literal string" style="color:#e3116c">"</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>The same schema and generated code produce compatible bytes across supported languages with no hand-written conversion layer.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="4-preserve-shared-identity-not-just-values">4. Preserve Shared Identity, Not Just Values<a href="https://fory.apache.org/blog/fory_schema_idl_for_object_graph#4-preserve-shared-identity-not-just-values" class="hash-link" aria-label="Direct link to 4. Preserve Shared Identity, Not Just Values" title="Direct link to 4. Preserve Shared Identity, Not Just Values">​</a></h3>
<p>Because <code>Order.customer</code> is declared as <code>ref Customer</code>, shared identity is part of the schema contract:</p>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token class-name">Customer</span><span class="token plain"> customer </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">Customer</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">customer</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">setName</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Alice"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token class-name">Order</span><span class="token plain"> first </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">Order</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">first</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">setOrderId</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"ORD-1"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">first</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">setCustomer</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">customer</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token class-name">Order</span><span class="token plain"> second </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">Order</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">second</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">setOrderId</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"ORD-2"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">second</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">setCustomer</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">customer</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token class-name">OrderBatch</span><span class="token plain"> batch </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">OrderBatch</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">batch</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">setOrders</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name namespace" style="opacity:0.7">java</span><span class="token class-name namespace punctuation" style="opacity:0.7;color:#393A34">.</span><span class="token class-name namespace" style="opacity:0.7">util</span><span class="token class-name namespace punctuation" style="opacity:0.7;color:#393A34">.</span><span class="token class-name">Arrays</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">asList</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">first</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> second</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token class-name">OrderBatch</span><span class="token plain"> restored </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">OrderBatch</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">fromBytes</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">batch</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">toBytes</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">assert</span><span class="token plain"> restored</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getOrders</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getCustomer</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> restored</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getOrders</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getCustomer</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>With a value-tree serializer, you typically rebuild this identity yourself. With Fory IDL, the <code>ref</code> modifier makes it part of the schema and generated code.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-full-feature-set">The Full Feature Set<a href="https://fory.apache.org/blog/fory_schema_idl_for_object_graph#the-full-feature-set" class="hash-link" aria-label="Direct link to The Full Feature Set" title="Direct link to The Full Feature Set">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="nullable-fields-with-optional">Nullable Fields with <code>optional</code><a href="https://fory.apache.org/blog/fory_schema_idl_for_object_graph#nullable-fields-with-optional" class="hash-link" aria-label="Direct link to nullable-fields-with-optional" title="Direct link to nullable-fields-with-optional">​</a></h3>
<div class="language-protobuf codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-protobuf codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">message</span><span class="token plain"> </span><span class="token class-name">Profile</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token builtin">string</span><span class="token plain"> username </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">          </span><span class="token comment" style="color:#999988;font-style:italic">// Non-optional</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">optional</span><span class="token plain"> </span><span class="token builtin">string</span><span class="token plain"> bio </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">     </span><span class="token comment" style="color:#999988;font-style:italic">// Nullable</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">optional</span><span class="token plain"> </span><span class="token positional-class-name class-name">Address</span><span class="token plain"> home </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">   </span><span class="token comment" style="color:#999988;font-style:italic">// Nullable struct</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<table><thead><tr><th>Language</th><th>Non-optional</th><th>Optional</th></tr></thead><tbody><tr><td>Java</td><td><code>String username</code></td><td><code>String bio</code> (nullable)</td></tr><tr><td>Python</td><td><code>username: str</code></td><td><code>bio: Optional[str]</code></td></tr><tr><td>Go</td><td><code>Username string</code></td><td><code>Bio *string</code></td></tr><tr><td>Rust</td><td><code>username: String</code></td><td><code>bio: Option&lt;String&gt;</code></td></tr><tr><td>C++</td><td><code>std::string</code></td><td><code>std::optional&lt;std::string&gt;</code></td></tr><tr><td>C#</td><td><code>string Username</code></td><td><code>string? Bio</code></td></tr><tr><td>Swift</td><td><code>var username: String</code></td><td><code>var bio: String?</code></td></tr></tbody></table>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="nested-types">Nested Types<a href="https://fory.apache.org/blog/fory_schema_idl_for_object_graph#nested-types" class="hash-link" aria-label="Direct link to Nested Types" title="Direct link to Nested Types">​</a></h3>
<div class="language-protobuf codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-protobuf codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">message</span><span class="token plain"> </span><span class="token class-name">SearchResponse</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">message</span><span class="token plain"> </span><span class="token class-name">Result</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token builtin">string</span><span class="token plain"> url </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token builtin">string</span><span class="token plain"> title </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        list</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token builtin">string</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> snippets </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    list</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">Result</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> results </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Nested types are rendered naturally in each language: <code>SearchResponse.Result</code> in Java/Python/C#/Swift, <code>SearchResponse::Result</code> in C++, <code>search_response::Result</code> in Rust, <code>SearchResponse_Result</code> in Go.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="imports-for-multi-file-schemas">Imports for Multi-File Schemas<a href="https://fory.apache.org/blog/fory_schema_idl_for_object_graph#imports-for-multi-file-schemas" class="hash-link" aria-label="Direct link to Imports for Multi-File Schemas" title="Direct link to Imports for Multi-File Schemas">​</a></h3>
<div class="language-protobuf codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-protobuf codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// common/types.fdl</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">package</span><span class="token plain"> common</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">message</span><span class="token plain"> </span><span class="token class-name">Address</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token builtin">string</span><span class="token plain"> street </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token builtin">string</span><span class="token plain"> city </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// models/user.fdl</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">package</span><span class="token plain"> models</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"common/types.fdl"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">message</span><span class="token plain"> </span><span class="token class-name">User</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token builtin">string</span><span class="token plain"> name </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token positional-class-name class-name">Address</span><span class="token plain"> home </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Uses imported type</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">foryc models/user.fdl </span><span class="token parameter variable" style="color:#36acaa">-I</span><span class="token plain"> common/ </span><span class="token parameter variable" style="color:#36acaa">--java_out</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">./gen</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>The compiler resolves imports, catches import cycles, and keeps generated type registration consistent across imported schemas.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="language-specific-options">Language-Specific Options<a href="https://fory.apache.org/blog/fory_schema_idl_for_object_graph#language-specific-options" class="hash-link" aria-label="Direct link to Language-Specific Options" title="Direct link to Language-Specific Options">​</a></h3>
<p>Override output paths and naming conventions per language without affecting cross-language compatibility:</p>
<div class="language-protobuf codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-protobuf codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">package</span><span class="token plain"> payment</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">option</span><span class="token plain"> java_package </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"com.mycorp.payment.v1"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">option</span><span class="token plain"> go_package </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"github.com/mycorp/gen/payment;paymentv1"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">option</span><span class="token plain"> csharp_namespace </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"MyCorp.Payment.V1"</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>These options control <em>where</em> code is generated and how host-language names are shaped — not the underlying Fory wire format or cross-language type identity.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="rich-type-system">Rich Type System<a href="https://fory.apache.org/blog/fory_schema_idl_for_object_graph#rich-type-system" class="hash-link" aria-label="Direct link to Rich Type System" title="Direct link to Rich Type System">​</a></h3>
<p>Fory IDL covers the full range of types you need for production schemas:</p>
<table><thead><tr><th>Category</th><th>Types</th></tr></thead><tbody><tr><td>Integers</td><td><code>int8</code>, <code>int16</code>, <code>int32</code>, <code>int64</code>, <code>uint8</code>–<code>uint64</code>, <code>fixed_*</code>, <code>tagged_*</code></td></tr><tr><td>Floats</td><td><code>float32</code>, <code>float64</code></td></tr><tr><td>Strings</td><td><code>string</code>, <code>bytes</code></td></tr><tr><td>Temporal</td><td><code>date</code>, <code>timestamp</code>, <code>duration</code></td></tr><tr><td>Special</td><td><code>decimal</code>, <code>any</code>, <code>bool</code></td></tr><tr><td>Collections</td><td><code>list&lt;T&gt;</code>, <code>map&lt;K, V&gt;</code></td></tr><tr><td>Modifiers</td><td><code>optional</code>, <code>ref</code>, <code>ref(weak=true)</code></td></tr></tbody></table>
<p>Integer types use varint encoding by default for 32/64-bit values, with explicit <code>fixed_*</code> and <code>tagged_*</code> variants when you need specific encodings.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="migrating-from-protobuf-or-flatbuffers">Migrating from Protobuf or FlatBuffers<a href="https://fory.apache.org/blog/fory_schema_idl_for_object_graph#migrating-from-protobuf-or-flatbuffers" class="hash-link" aria-label="Direct link to Migrating from Protobuf or FlatBuffers" title="Direct link to Migrating from Protobuf or FlatBuffers">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="protobuf-migration">Protobuf Migration<a href="https://fory.apache.org/blog/fory_schema_idl_for_object_graph#protobuf-migration" class="hash-link" aria-label="Direct link to Protobuf Migration" title="Direct link to Protobuf Migration">​</a></h3>
<p>Already have <code>.proto</code> schemas? The Fory compiler can read them directly and generate Fory code from them:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">foryc existing_schema.proto </span><span class="token parameter variable" style="color:#36acaa">--java_out</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">./gen </span><span class="token parameter variable" style="color:#36acaa">--python_out</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">./gen</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>The output uses Fory-generated types and the Fory binary protocol. Reading <code>.proto</code> input does <strong>not</strong> mean protobuf wire compatibility.</p>
<p>Key mapping:</p>
<ul>
<li><code>repeated T</code> → <code>list&lt;T&gt;</code></li>
<li><code>oneof</code> → Fory <code>union</code> + optional field</li>
<li><code>google.protobuf.Timestamp</code> → <code>timestamp</code></li>
<li><code>google.protobuf.Any</code> → <code>any</code></li>
</ul>
<p>You can also add Fory-specific extensions in your <code>.proto</code> files:</p>
<div class="language-protobuf codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-protobuf codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">message</span><span class="token plain"> </span><span class="token class-name">TreeNode</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token positional-class-name class-name">TreeNode</span><span class="token plain"> parent </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">fory</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">weak_ref </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">repeated</span><span class="token plain"> </span><span class="token positional-class-name class-name">TreeNode</span><span class="token plain"> children </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">fory</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ref </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="flatbuffers-migration">FlatBuffers Migration<a href="https://fory.apache.org/blog/fory_schema_idl_for_object_graph#flatbuffers-migration" class="hash-link" aria-label="Direct link to FlatBuffers Migration" title="Direct link to FlatBuffers Migration">​</a></h3>
<p>FlatBuffers schemas work too:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">foryc existing_schema.fbs </span><span class="token parameter variable" style="color:#36acaa">--lang</span><span class="token plain"> java,python,go </span><span class="token parameter variable" style="color:#36acaa">--output</span><span class="token plain"> ./gen</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Tables become evolving messages, structs become non-evolving messages, and unions map directly to Fory unions. As with protobuf input, the generated output uses Fory types and Fory wire format rather than FlatBuffers binary compatibility. Add <code>fory_ref:true</code> or <code>fory_weak_ref:true</code> attributes where graph semantics matter.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="inspect-the-translation">Inspect the Translation<a href="https://fory.apache.org/blog/fory_schema_idl_for_object_graph#inspect-the-translation" class="hash-link" aria-label="Direct link to Inspect the Translation" title="Direct link to Inspect the Translation">​</a></h3>
<p>See exactly how your protobuf/FlatBuffers schema maps to Fory IDL:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">foryc schema.proto --emit-fdl</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>This prints the translated <code>.fdl</code> to stdout — useful for reviewing the mapping before committing to the migration.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="why-not-just-use-protobuf">Why Not Just Use Protobuf?<a href="https://fory.apache.org/blog/fory_schema_idl_for_object_graph#why-not-just-use-protobuf" class="hash-link" aria-label="Direct link to Why Not Just Use Protobuf?" title="Direct link to Why Not Just Use Protobuf?">​</a></h2>
<p>A direct comparison with Protocol Buffers is useful because it is the default reference point for many readers.</p>
<table><thead><tr><th>Aspect</th><th>Protocol Buffers</th><th>Fory IDL</th></tr></thead><tbody><tr><td>Generated types</td><td>Transport-model-first in many languages</td><td>Idiomatic language constructs</td></tr><tr><td>Object graphs</td><td>Application-level IDs / rebuilds</td><td>First-class <code>ref</code> / <code>ref(weak=true)</code></td></tr><tr><td>Circular references</td><td>Not built-in</td><td>Built into generated schemas</td></tr><tr><td>Variant fields</td><td><code>oneof</code> / <code>Any</code></td><td><code>union</code> / <code>any</code> in the generated model</td></tr><tr><td>Performance</td><td>Mature baseline</td><td>Often faster on object serialization workloads</td></tr><tr><td>gRPC ecosystem</td><td>Native, mature</td><td>In progress (active development)</td></tr><tr><td>Schema evolution</td><td>Field numbers + wire types</td><td>Compatible mode for generated schemas with field-id matching</td></tr><tr><td>Target languages</td><td>Many (via plugins)</td><td>Java, Python, Go, Rust, C++, C#, Swift (and growing)</td></tr></tbody></table>
<p><strong>Use protobuf</strong> when gRPC ecosystem integration is your primary concern. <strong>Use Fory IDL</strong> when you need idiomatic domain objects, object-graph semantics, reference tracking, or maximum serialization performance.</p>
<p>Benchmark details and methodology live in the repository's <a href="https://github.com/apache/fory/tree/main/docs/benchmarks" target="_blank" rel="noopener noreferrer">benchmark reports</a>.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="build-integration">Build Integration<a href="https://fory.apache.org/blog/fory_schema_idl_for_object_graph#build-integration" class="hash-link" aria-label="Direct link to Build Integration" title="Direct link to Build Integration">​</a></h2>
<p>The Fory compiler integrates into every major build system. Below are examples for a few common ones — the same pattern (invoke <code>foryc</code> as a pre-build step) applies to Cargo build scripts, Bazel rules, CMake custom commands, Swift Package Manager plugins, and others:</p>
<p><strong>Maven (Java):</strong></p>
<div class="language-xml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-xml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">execution</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">id</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">generate-fory-types</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">id</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">phase</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">generate-sources</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">phase</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">goals</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">goal</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">exec</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">goal</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">goals</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">configuration</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">executable</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">foryc</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">executable</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">arguments</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">argument</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">${basedir}/src/main/fdl/schema.fdl</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">argument</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">argument</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">--java_out</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">argument</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">argument</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">${project.build.directory}/generated-sources/fory</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">argument</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">arguments</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">configuration</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">execution</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><strong>Gradle (Kotlin/Java):</strong></p>
<div class="language-groovy codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-groovy codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">task generateForyTypes(type: Exec) {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    commandLine 'foryc', "${projectDir}/src/main/fdl/schema.fdl",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        '--java_out', "${buildDir}/generated/sources/fory"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">compileJava.dependsOn generateForyTypes</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><strong>Go Generate:</strong></p>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">//go:generate foryc ../schema.fdl --lang go --output .</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">package</span><span class="token plain"> models</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><strong>Python (setuptools):</strong></p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">BuildWithForyIdl</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">build_py</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">run</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">self</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        subprocess</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">run</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'foryc'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'schema.fdl'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'--python_out'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'src/generated'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> check</span><span class="token operator" style="color:#393A34">=</span><span class="token boolean" style="color:#36acaa">True</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token builtin">super</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">run</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="best-practices">Best Practices<a href="https://fory.apache.org/blog/fory_schema_idl_for_object_graph#best-practices" class="hash-link" aria-label="Direct link to Best Practices" title="Direct link to Best Practices">​</a></h2>
<ol>
<li>
<p><strong>Use meaningful package names</strong>: <code>com.myapp.models</code> groups types logically and drives namespace generation.</p>
</li>
<li>
<p><strong>Use <code>optional</code> explicitly</strong>: Don't rely on default nullability — make the intent clear in the schema.</p>
</li>
<li>
<p><strong>Use <code>ref</code> only when needed</strong>: Reference tracking has a per-object cost. Use it for shared objects and cycles; skip it for value-type payloads.</p>
</li>
<li>
<p><strong>Use imports for shared types</strong>: Put common types (Address, Timestamp, etc.) in a shared <code>.fdl</code> file and import them.</p>
</li>
<li>
<p><strong>Use <code>--emit-fdl</code> to review migrations</strong>: When consuming <code>.proto</code> or <code>.fbs</code> input, inspect the translated Fory IDL before committing.</p>
</li>
</ol>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="conclusion">Conclusion<a href="https://fory.apache.org/blog/fory_schema_idl_for_object_graph#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion">​</a></h2>
<p>Apache Fory Schema IDL puts object-graph semantics into the schema model instead of leaving them to ad-hoc application code. If you need shared refs, circular structures, polymorphic fields, schema evolution, and generated models that still look idiomatic in each language, it gives you one schema and one compiler workflow for all of that.</p>
<p>Define your types once. Generate everywhere. Serialize object graphs without giving up idiomatic models.</p>
<p><strong>Get started:</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">pip </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> fory-compiler</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">foryc </span><span class="token parameter variable" style="color:#36acaa">--help</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><strong>Documentation:</strong></p>
<ul>
<li>Fory IDL Syntax: <a href="https://fory.apache.org/docs/compiler/syntax" target="_blank" rel="noopener noreferrer">fory.apache.org/docs/compiler/syntax</a></li>
<li>Compiler CLI Guide: <a href="https://fory.apache.org/docs/compiler/compiler_guide" target="_blank" rel="noopener noreferrer">fory.apache.org/docs/compiler/compiler_guide</a></li>
<li>Generated Code Reference: <a href="https://fory.apache.org/docs/compiler/generated_code" target="_blank" rel="noopener noreferrer">fory.apache.org/docs/compiler/generated_code</a></li>
<li>Cross-Language Serialization: <a href="https://fory.apache.org/docs/guide/xlang/serialization_index" target="_blank" rel="noopener noreferrer">fory.apache.org/docs/guide/xlang</a></li>
<li>Protobuf Migration: <a href="https://fory.apache.org/docs/compiler/protobuf_idl_support" target="_blank" rel="noopener noreferrer">fory.apache.org/docs/compiler/protobuf_idl_support</a></li>
<li>Benchmark Reports: <a href="https://github.com/apache/fory/tree/main/docs/benchmarks" target="_blank" rel="noopener noreferrer">github.com/apache/fory/tree/main/docs/benchmarks</a></li>
</ul>
<p><strong>Community:</strong></p>
<ul>
<li>GitHub: <a href="https://github.com/apache/fory" target="_blank" rel="noopener noreferrer">apache/fory</a></li>
<li>Slack: <a href="https://join.slack.com/t/fory-project/shared_invite/zt-1u8soj4qc-ieYEu7ciHOqA2mo47llS8A" target="_blank" rel="noopener noreferrer">Join our community</a></li>
<li>License: Apache License 2.0</li>
</ul>]]></content>
        <author>
            <name>Shawn Yang</name>
            <uri>https://github.com/chaokunyang</uri>
        </author>
        <category label="fory" term="fory"/>
        <category label="idl" term="idl"/>
        <category label="schema" term="schema"/>
        <category label="serialization" term="serialization"/>
        <category label="cross-language" term="cross-language"/>
        <category label="codegen" term="codegen"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Introducing Apache Fory™ C++: Blazing-Fast, Type-Safe Serialization for Modern C++]]></title>
        <id>https://fory.apache.org/blog/fory_cpp_blazing_fast_serialization_framework</id>
        <link href="https://fory.apache.org/blog/fory_cpp_blazing_fast_serialization_framework"/>
        <updated>2026-02-19T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[TL;DR: Apache Fory C++ is a blazing-fast, cross-language serialization framework delivering exceptional binary performance with support for polymorphic types, circular references, schema evolution, and seamless interoperability with Java, Python, Go, Rust, and JavaScript — all via modern C++17 with zero runtime reflection overhead.]]></summary>
        <content type="html"><![CDATA[<p><strong>TL;DR</strong>: Apache Fory C++ is a blazing-fast, cross-language serialization framework delivering <strong>exceptional binary performance</strong> with support for <strong>polymorphic types, circular references, schema evolution, and seamless interoperability</strong> with Java, Python, Go, Rust, and JavaScript — all via modern C++17 with zero runtime reflection overhead.</p>
<ul>
<li>🐙 GitHub: <a href="https://github.com/apache/fory" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory</a></li>
<li>📚 Docs: <a href="https://fory.apache.org/docs/guide/cpp" target="_blank" rel="noopener noreferrer">https://fory.apache.org/docs/guide/cpp</a></li>
</ul>
<img src="https://fory.apache.org/img/fory-logo-light.png" width="50%">
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-c-serialization-problem">The C++ Serialization Problem<a href="https://fory.apache.org/blog/fory_cpp_blazing_fast_serialization_framework#the-c-serialization-problem" class="hash-link" aria-label="Direct link to The C++ Serialization Problem" title="Direct link to The C++ Serialization Problem">​</a></h2>
<p>Every C++ developer working in a polyglot environment eventually hits the same wall. Existing options force a painful choice:</p>
<ol>
<li><strong>IDL-first frameworks</strong> (Protocol Buffers, FlatBuffers): Require upfront schema compilation, lose native C++ type expressiveness, and carry significant integration friction. Every type change means regenerating code across all languages in lock-step.</li>
<li><strong>Reflection-based frameworks</strong> (Boost.Serialization, cereal): Limited cross-language support, no circular reference handling, no polymorphism without boilerplate. They work well within a single language but break down at system boundaries.</li>
<li><strong>Hand-rolled binary formats</strong>: Fast but brittle — any schema change risks silent corruption, and every new type requires manual encode/decode logic.</li>
</ol>
<p>Apache Fory C++ eliminates this trade-off. It delivers performance competitive with the fastest C++ serialization libraries while providing first-class support for polymorphism, shared/circular references, schema evolution, and <strong>binary compatibility with Java, Python, Go, Rust, and JavaScript</strong> — through a clean C++17 API.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-makes-apache-fory-c-different">What Makes Apache Fory C++ Different?<a href="https://fory.apache.org/blog/fory_cpp_blazing_fast_serialization_framework#what-makes-apache-fory-c-different" class="hash-link" aria-label="Direct link to What Makes Apache Fory C++ Different?" title="Direct link to What Makes Apache Fory C++ Different?">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="compile-time-code-generation">Compile-Time Code Generation<a href="https://fory.apache.org/blog/fory_cpp_blazing_fast_serialization_framework#compile-time-code-generation" class="hash-link" aria-label="Direct link to Compile-Time Code Generation" title="Direct link to Compile-Time Code Generation">​</a></h3>
<p>Most serialization frameworks pay a runtime cost for flexibility — inspecting type information through virtual dispatch or hash maps at every call. Apache Fory takes a different approach: the <code>FORY_STRUCT</code> macro uses C++ template metaprogramming to generate all serialization logic at compile time. The result is inlined, type-specific code with no virtual dispatch, no reflection, and no runtime overhead:</p>
<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token macro property directive-hash" style="color:#36acaa">#</span><span class="token macro property directive keyword" style="color:#00009f">include</span><span class="token macro property" style="color:#36acaa"> </span><span class="token macro property string" style="color:#e3116c">"fory/serialization/fory.h"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">using</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">namespace</span><span class="token plain"> fory</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">serialization</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token class-name">Person</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">string name</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">int32_t</span><span class="token plain"> age</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">vector</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">string</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> hobbies</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">map</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">string</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">string</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> metadata</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">optional</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">string</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> nickname</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">FORY_STRUCT</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Person</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> name</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> age</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> hobbies</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> metadata</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> nickname</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>That single macro generates compile-time field metadata, efficient serialization/deserialization code via ADL (Argument-Dependent Lookup), and type registration hooks. The macro can be placed inside the class body to access private fields, or at namespace scope for third-party types.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="cross-language-binary-protocol">Cross-Language Binary Protocol<a href="https://fory.apache.org/blog/fory_cpp_blazing_fast_serialization_framework#cross-language-binary-protocol" class="hash-link" aria-label="Direct link to Cross-Language Binary Protocol" title="Direct link to Cross-Language Binary Protocol">​</a></h3>
<p>Apache Fory C++ speaks the same binary wire format as Java, Python, Go, Rust, and JavaScript. Serialize a struct in C++, deserialize it in Python — no adaptation layer, no schema translation, no version negotiation needed. This is especially powerful for microservice architectures where different teams own different services in different languages:</p>
<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// C++: Serialize</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">auto</span><span class="token plain"> fory </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Fory</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">builder</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">xlang</span><span class="token punctuation" style="color:#393A34">(</span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">build</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token generic-function function" style="color:#d73a49">register_struct</span><span class="token generic-function generic class-name operator" style="color:#393A34">&lt;</span><span class="token generic-function generic class-name">Person</span><span class="token generic-function generic class-name operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">100</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">auto</span><span class="token plain"> bytes </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">serialize</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">person</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">value</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Python: Deserialize (same binary format, same type ID)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">fory </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> pyfory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Fory</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">xlang</span><span class="token operator" style="color:#393A34">=</span><span class="token boolean" style="color:#36acaa">True</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">register</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Person</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> type_id</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">100</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># Same ID as C++</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">person </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">deserialize</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">data</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>The core requirements for cross-language interoperability are consistent type IDs/Names across participating runtimes, matching canonical field names, and compatible field types for those names.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="polymorphism-via-smart-pointers">Polymorphism via Smart Pointers<a href="https://fory.apache.org/blog/fory_cpp_blazing_fast_serialization_framework#polymorphism-via-smart-pointers" class="hash-link" aria-label="Direct link to Polymorphism via Smart Pointers" title="Direct link to Polymorphism via Smart Pointers">​</a></h3>
<p>Serializing polymorphic objects is notoriously difficult in C++. Most frameworks require manual type tagging or generate large amounts of boilerplate. Apache Fory handles it automatically: it detects polymorphic types via <code>std::is_polymorphic&lt;T&gt;</code> and preserves the full runtime type identity through <code>std::shared_ptr</code> and <code>std::unique_ptr</code>. When you deserialize a <code>shared_ptr&lt;Animal&gt;</code> that holds a <code>Dog</code>, you get a <code>Dog</code> back — no extra code required:</p>
<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token class-name">Animal</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">virtual</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">~</span><span class="token function" style="color:#d73a49">Animal</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">default</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">int32_t</span><span class="token plain"> age </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">FORY_STRUCT</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Animal</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> age</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token class-name">Dog</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token base-clause class-name">Animal</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">string breed</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">FORY_STRUCT</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Dog</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">FORY_BASE</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Animal</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> breed</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token class-name">Cat</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token base-clause class-name">Animal</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">string color</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">FORY_STRUCT</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Cat</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">FORY_BASE</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Animal</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> color</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token class-name">Shelter</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">vector</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">shared_ptr</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">Animal</span><span class="token operator" style="color:#393A34">&gt;&gt;</span><span class="token plain"> animals</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">FORY_STRUCT</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Shelter</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> animals</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">auto</span><span class="token plain"> fory </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Fory</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">builder</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">track_ref</span><span class="token punctuation" style="color:#393A34">(</span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">build</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token generic-function function" style="color:#d73a49">register_struct</span><span class="token generic-function generic class-name operator" style="color:#393A34">&lt;</span><span class="token generic-function generic class-name">Shelter</span><span class="token generic-function generic class-name operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token generic-function function" style="color:#d73a49">register_struct</span><span class="token generic-function generic class-name operator" style="color:#393A34">&lt;</span><span class="token generic-function generic class-name">Dog</span><span class="token generic-function generic class-name operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">11</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token generic-function function" style="color:#d73a49">register_struct</span><span class="token generic-function generic class-name operator" style="color:#393A34">&lt;</span><span class="token generic-function generic class-name">Cat</span><span class="token generic-function generic class-name operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">12</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Shelter s</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">s</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">animals</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">push_back</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token generic-function function" style="color:#d73a49">make_shared</span><span class="token generic-function generic class-name operator" style="color:#393A34">&lt;</span><span class="token generic-function generic class-name">Dog</span><span class="token generic-function generic class-name operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// Dog at runtime</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">s</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">animals</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">push_back</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token generic-function function" style="color:#d73a49">make_shared</span><span class="token generic-function generic class-name operator" style="color:#393A34">&lt;</span><span class="token generic-function generic class-name">Cat</span><span class="token generic-function generic class-name operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// Cat at runtime</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">auto</span><span class="token plain"> decoded </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token generic-function function" style="color:#d73a49">deserialize</span><span class="token generic-function generic class-name operator" style="color:#393A34">&lt;</span><span class="token generic-function generic class-name">Shelter</span><span class="token generic-function generic class-name operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">serialize</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">s</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">value</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">value</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">assert</span><span class="token punctuation" style="color:#393A34">(</span><span class="token generic-function function" style="color:#d73a49">dynamic_cast</span><span class="token generic-function generic class-name operator" style="color:#393A34">&lt;</span><span class="token generic-function generic class-name">Dog</span><span class="token generic-function generic class-name operator" style="color:#393A34">*</span><span class="token generic-function generic class-name operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">decoded</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">animals</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">nullptr</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// Runtime type preserved!</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Fory also supports <code>std::unique_ptr</code> for exclusive-ownership polymorphic fields, and collections of smart pointers (<code>std::vector&lt;std::shared_ptr&lt;Base&gt;&gt;</code>, <code>std::map&lt;K, std::unique_ptr&lt;Base&gt;&gt;</code>).</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="sharedcircular-reference-tracking">Shared/Circular Reference Tracking<a href="https://fory.apache.org/blog/fory_cpp_blazing_fast_serialization_framework#sharedcircular-reference-tracking" class="hash-link" aria-label="Direct link to Shared/Circular Reference Tracking" title="Direct link to Shared/Circular Reference Tracking">​</a></h3>
<p>Many real-world data models contain shared objects or cycles: a parent node pointing to its children, which point back to the parent; an order referencing a customer who appears in multiple orders. Standard serialization frameworks either duplicate the data (wasting space) or crash with a stack overflow when they encounter a cycle.</p>
<p>With <code>track_ref(true)</code>, Fory tracks object identity across the entire graph. Shared objects are serialized exactly once; every subsequent reference is encoded as a back-reference. Cycles terminate naturally:</p>
<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token class-name">Node</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">virtual</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">~</span><span class="token function" style="color:#d73a49">Node</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">default</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">int32_t</span><span class="token plain"> id </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">vector</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">shared_ptr</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">Node</span><span class="token operator" style="color:#393A34">&gt;&gt;</span><span class="token plain"> neighbors</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">FORY_STRUCT</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Node</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> id</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> neighbors</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">auto</span><span class="token plain"> fory </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Fory</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">builder</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">track_ref</span><span class="token punctuation" style="color:#393A34">(</span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">build</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token generic-function function" style="color:#d73a49">register_struct</span><span class="token generic-function generic class-name operator" style="color:#393A34">&lt;</span><span class="token generic-function generic class-name">Node</span><span class="token generic-function generic class-name operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">200</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">auto</span><span class="token plain"> node1 </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token generic-function function" style="color:#d73a49">make_shared</span><span class="token generic-function generic class-name operator" style="color:#393A34">&lt;</span><span class="token generic-function generic class-name">Node</span><span class="token generic-function generic class-name operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> node1</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token plain">id </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">auto</span><span class="token plain"> node2 </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token generic-function function" style="color:#d73a49">make_shared</span><span class="token generic-function generic class-name operator" style="color:#393A34">&lt;</span><span class="token generic-function generic class-name">Node</span><span class="token generic-function generic class-name operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> node2</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token plain">id </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">node1</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token plain">neighbors</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">push_back</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">node2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">node2</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token plain">neighbors</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">push_back</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">node1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Cycle — handled correctly!</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">auto</span><span class="token plain"> bytes </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">serialize</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">node1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">value</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// No stack overflow, no duplicate data — the cycle is preserved faithfully</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">auto</span><span class="token plain"> decoded </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token generic-function function" style="color:#d73a49">deserialize</span><span class="token generic-function generic class-name operator" style="color:#393A34">&lt;</span><span class="token generic-function generic class-name">std</span><span class="token generic-function generic class-name double-colon punctuation" style="color:#393A34">::</span><span class="token generic-function generic class-name">shared_ptr</span><span class="token generic-function generic class-name operator" style="color:#393A34">&lt;</span><span class="token generic-function generic class-name">Node</span><span class="token generic-function generic class-name operator" style="color:#393A34">&gt;&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">bytes</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">value</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>This makes Fory a natural fit for graph databases, entity-component systems, and any domain model with bidirectional relationships.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="schema-evolution">Schema Evolution<a href="https://fory.apache.org/blog/fory_cpp_blazing_fast_serialization_framework#schema-evolution" class="hash-link" aria-label="Direct link to Schema Evolution" title="Direct link to Schema Evolution">​</a></h3>
<p>In a microservice deployment, services update independently. A new version of the user service may add a <code>phone</code> field while old consumers are still running. Without schema evolution support, this forces a coordinated, big-bang deployment. Apache Fory's <strong>compatible mode</strong> removes this constraint entirely:</p>
<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Version 1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token class-name">UserV1</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">string name</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">int32_t</span><span class="token plain"> age</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">FORY_STRUCT</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">UserV1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> name</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> age</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Version 2 — new fields added independently</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token class-name">UserV2</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">string name</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">int32_t</span><span class="token plain"> age</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">string email</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">FORY_STRUCT</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">UserV2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> name</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> age</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> email</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">auto</span><span class="token plain"> fory_v1 </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Fory</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">builder</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">compatible</span><span class="token punctuation" style="color:#393A34">(</span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">xlang</span><span class="token punctuation" style="color:#393A34">(</span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">build</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">auto</span><span class="token plain"> fory_v2 </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Fory</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">builder</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">compatible</span><span class="token punctuation" style="color:#393A34">(</span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">xlang</span><span class="token punctuation" style="color:#393A34">(</span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">build</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">fory_v1</span><span class="token punctuation" style="color:#393A34">.</span><span class="token generic-function function" style="color:#d73a49">register_struct</span><span class="token generic-function generic class-name operator" style="color:#393A34">&lt;</span><span class="token generic-function generic class-name">UserV1</span><span class="token generic-function generic class-name operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">100</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">fory_v2</span><span class="token punctuation" style="color:#393A34">.</span><span class="token generic-function function" style="color:#d73a49">register_struct</span><span class="token generic-function generic class-name operator" style="color:#393A34">&lt;</span><span class="token generic-function generic class-name">UserV2</span><span class="token generic-function generic class-name operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">100</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Same type ID enables evolution</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">auto</span><span class="token plain"> bytes </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> fory_v1</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">serialize</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">UserV1</span><span class="token punctuation" style="color:#393A34">{</span><span class="token string" style="color:#e3116c">"Alice"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">30</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">value</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">auto</span><span class="token plain"> v2 </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> fory_v2</span><span class="token punctuation" style="color:#393A34">.</span><span class="token generic-function function" style="color:#d73a49">deserialize</span><span class="token generic-function generic class-name operator" style="color:#393A34">&lt;</span><span class="token generic-function generic class-name">UserV2</span><span class="token generic-function generic class-name operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">bytes</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">value</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">assert</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">v2</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">name </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Alice"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> v2</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">email </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Default for missing field</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>In compatible mode, fields are matched by name rather than position. New fields receive C++ default values when missing; removed fields are safely skipped. This enables rolling upgrades and independent service deployments without any serialization errors.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="row-format-zero-copy-analytics">Row Format: Zero-Copy Analytics<a href="https://fory.apache.org/blog/fory_cpp_blazing_fast_serialization_framework#row-format-zero-copy-analytics" class="hash-link" aria-label="Direct link to Row Format: Zero-Copy Analytics" title="Direct link to Row Format: Zero-Copy Analytics">​</a></h3>
<p>Beyond object graph serialization, Apache Fory C++ implements a <strong>row-based binary format</strong> designed for analytics workloads. The row format stores data in a contiguous memory layout with a null bitmap, fixed-size slots for primitives, and a variable-length section for strings and nested objects. This enables <strong>O(1) random field access by index</strong> — you can read a single field from a large struct without touching the rest of the data.</p>
<p>This is particularly valuable in data pipelines and OLAP workloads where only a small subset of fields are queried per record:</p>
<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token macro property directive-hash" style="color:#36acaa">#</span><span class="token macro property directive keyword" style="color:#00009f">include</span><span class="token macro property" style="color:#36acaa"> </span><span class="token macro property string" style="color:#e3116c">"fory/encoder/row_encoder.h"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">using</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">namespace</span><span class="token plain"> fory</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">row</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">encoder</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token class-name">SensorReading</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">int32_t</span><span class="token plain"> sensor_id</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">double</span><span class="token plain"> temperature</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">string location</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">FORY_STRUCT</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">SensorReading</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> sensor_id</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> temperature</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> location</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">RowEncoder</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">SensorReading</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> encoder</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">encoder</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">encode</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token number" style="color:#36acaa">42</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">23.5</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"rack-B"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">auto</span><span class="token plain"> row </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> encoder</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">get_writer</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">to_row</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Read any field in O(1) — no deserialization of unused fields</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">int32_t</span><span class="token plain"> id    </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> row</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">get_int32</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">double</span><span class="token plain">  temp  </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> row</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">get_double</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">auto</span><span class="token plain">    loc   </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> row</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">get_string</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>For zero-copy access into an existing buffer (e.g., from a memory-mapped file or network receive buffer), Fory can point a <code>Row</code> directly at the memory without copying:</p>
<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">auto</span><span class="token plain"> src </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> encoder</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">get_writer</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">to_row</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">fory</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">row</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">Row </span><span class="token function" style="color:#d73a49">view</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">src</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">schema</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">view</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">point_to</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">src</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">buffer</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> src</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">base_offset</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> src</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">size_bytes</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Zero-copy view</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">int32_t</span><span class="token plain"> id </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> view</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">get_int32</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Reads directly from the original buffer</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Use the row format for analytics, OLAP-style workloads, and partial field access. Use object graph serialization for full object round-trips with references and polymorphism.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="installation">Installation<a href="https://fory.apache.org/blog/fory_cpp_blazing_fast_serialization_framework#installation" class="hash-link" aria-label="Direct link to Installation" title="Direct link to Installation">​</a></h2>
<p>Fory C++ requires a C++17-compatible compiler (GCC 7+, Clang 5+, MSVC 2017+) and supports both CMake and Bazel build systems.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="cmake-fetchcontent">CMake (FetchContent)<a href="https://fory.apache.org/blog/fory_cpp_blazing_fast_serialization_framework#cmake-fetchcontent" class="hash-link" aria-label="Direct link to CMake (FetchContent)" title="Direct link to CMake (FetchContent)">​</a></h3>
<p>The simplest integration is via CMake's <code>FetchContent</code> module, which fetches and builds Fory as part of your project:</p>
<div class="language-cmake codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-cmake codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">cmake_minimum_required(VERSION 3.16)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">project(my_project LANGUAGES CXX)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">set(CMAKE_CXX_STANDARD 17)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">include(FetchContent)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">FetchContent_Declare(fory</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    GIT_REPOSITORY https://github.com/apache/fory.git</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    GIT_TAG v0.15.0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    SOURCE_SUBDIR cpp)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">FetchContent_MakeAvailable(fory)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">add_executable(my_app main.cc)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">target_link_libraries(my_app PRIVATE fory::serialization)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="bazel">Bazel<a href="https://fory.apache.org/blog/fory_cpp_blazing_fast_serialization_framework#bazel" class="hash-link" aria-label="Direct link to Bazel" title="Direct link to Bazel">​</a></h3>
<p>For Bazel-based projects, add Fory as a module dependency:</p>
<div class="language-bazel codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bazel codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">bazel_dep(name = "fory", version = "0.15.0")</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">git_override(module_name = "fory",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    remote = "https://github.com/apache/fory.git",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    commit = "v0.15.0")</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-bazel codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bazel codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">cc_binary(name = "my_app", srcs = ["main.cc"],</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    deps = ["@fory//cpp/fory/serialization:fory_serialization"])</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="native-serialization">Native Serialization<a href="https://fory.apache.org/blog/fory_cpp_blazing_fast_serialization_framework#native-serialization" class="hash-link" aria-label="Direct link to Native Serialization" title="Direct link to Native Serialization">​</a></h2>
<p>For pure C++ applications without cross-language requirements, disabling <code>xlang</code> produces a more compact binary encoding because no cross-language type metadata is emitted. This is the fastest possible path:</p>
<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">auto</span><span class="token plain"> fory </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Fory</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">builder</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">xlang</span><span class="token punctuation" style="color:#393A34">(</span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">// Native C++ mode — tighter encoding</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">track_ref</span><span class="token punctuation" style="color:#393A34">(</span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Disable if no shared/circular refs</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">build</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token generic-function function" style="color:#d73a49">register_struct</span><span class="token generic-function generic class-name operator" style="color:#393A34">&lt;</span><span class="token generic-function generic class-name">Address</span><span class="token generic-function generic class-name operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token generic-function function" style="color:#d73a49">register_struct</span><span class="token generic-function generic class-name operator" style="color:#393A34">&lt;</span><span class="token generic-function generic class-name">Person</span><span class="token generic-function generic class-name operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Serialize</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">auto</span><span class="token plain"> result </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">serialize</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">person</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token plain">result</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">ok</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">cerr </span><span class="token operator" style="color:#393A34">&lt;&lt;</span><span class="token plain"> result</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">error</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">to_string</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">vector</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token keyword" style="color:#00009f">uint8_t</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> bytes </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">move</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">result</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">value</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Deserialize</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">auto</span><span class="token plain"> decoded </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token generic-function function" style="color:#d73a49">deserialize</span><span class="token generic-function generic class-name operator" style="color:#393A34">&lt;</span><span class="token generic-function generic class-name">Person</span><span class="token generic-function generic class-name operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">bytes</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">assert</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">decoded</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">ok</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> person </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> decoded</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">value</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><code>FORY_STRUCT</code> handles several important C++ patterns that commonly arise in production codebases:</p>
<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Private fields — place macro in public: section</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">Secure</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">int32_t</span><span class="token plain"> secret_</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">string token_</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">public</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">FORY_STRUCT</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Secure</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> secret_</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> token_</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Inheritance — FORY_BASE includes base class fields</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token class-name">Derived</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token base-clause class-name">Base</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">string extra</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">FORY_STRUCT</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Derived</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">FORY_BASE</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Base</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> extra</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// External/third-party types — use at namespace scope (public fields only)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">namespace</span><span class="token plain"> ext </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token class-name">Coord</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">double</span><span class="token plain"> lat</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> lon</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">FORY_STRUCT</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ext</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">Coord</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> lat</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> lon</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="error-handling">Error Handling<a href="https://fory.apache.org/blog/fory_cpp_blazing_fast_serialization_framework#error-handling" class="hash-link" aria-label="Direct link to Error Handling" title="Direct link to Error Handling">​</a></h3>
<p>All Fory operations return <code>Result&lt;T, Error&gt;</code>, making error handling explicit and composable. The <code>FORY_TRY</code> macro provides a concise early-return pattern for functions that propagate errors:</p>
<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Option 1: Conditional check</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">auto</span><span class="token plain"> r </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">serialize</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">obj</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">r</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">ok</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">auto</span><span class="token plain"> bytes </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">move</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">r</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">value</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">else</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">cerr </span><span class="token operator" style="color:#393A34">&lt;&lt;</span><span class="token plain"> r</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">error</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">to_string</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Option 2: FORY_TRY macro for early return</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">FORY_TRY</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">bytes</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">serialize</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">obj</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Use bytes directly — any error propagates automatically</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="thread-safety">Thread Safety<a href="https://fory.apache.org/blog/fory_cpp_blazing_fast_serialization_framework#thread-safety" class="hash-link" aria-label="Direct link to Thread Safety" title="Direct link to Thread Safety">​</a></h3>
<p>Fory provides two variants with different threading guarantees. Choose based on whether your serialization is centralized (shared instance) or distributed across threads:</p>
<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Single-threaded (fastest) — one instance per thread, no synchronization overhead</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">auto</span><span class="token plain"> fory </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Fory</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">builder</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">build</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Thread-safe — shared across threads via an internal instance pool</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">auto</span><span class="token plain"> fory </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Fory</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">builder</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">build_thread_safe</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token generic-function function" style="color:#d73a49">register_struct</span><span class="token generic-function generic class-name operator" style="color:#393A34">&lt;</span><span class="token generic-function generic class-name">MyType</span><span class="token generic-function generic class-name operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Register all types before sharing</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">thread </span><span class="token function" style="color:#d73a49">t</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">[</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">serialize</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">obj</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Safe to call concurrently</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="cross-language-serialization">Cross-Language Serialization<a href="https://fory.apache.org/blog/fory_cpp_blazing_fast_serialization_framework#cross-language-serialization" class="hash-link" aria-label="Direct link to Cross-Language Serialization" title="Direct link to Cross-Language Serialization">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="without-idl">Without IDL<a href="https://fory.apache.org/blog/fory_cpp_blazing_fast_serialization_framework#without-idl" class="hash-link" aria-label="Direct link to Without IDL" title="Direct link to Without IDL">​</a></h3>
<p>When you control both sides of the wire and can coordinate type definitions manually, the simplest approach is to register types with matching numeric IDs in each language. This requires no additional tooling and works well for small, stable schemas:</p>
<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// C++</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">auto</span><span class="token plain"> fory </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Fory</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">builder</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">xlang</span><span class="token punctuation" style="color:#393A34">(</span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">build</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token generic-function function" style="color:#d73a49">register_struct</span><span class="token generic-function generic class-name operator" style="color:#393A34">&lt;</span><span class="token generic-function generic class-name">Order</span><span class="token generic-function generic class-name operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">201</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">auto</span><span class="token plain"> bytes </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">serialize</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">order</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">value</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Java — same binary format, same type ID</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token class-name">Fory</span><span class="token plain"> fory </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">builder</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">withLanguage</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Language</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">XLANG</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">build</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">register</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Order</span><span class="token punctuation" style="color:#393A34">.</span><span class="token keyword" style="color:#00009f">class</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">201</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token class-name">Order</span><span class="token plain"> order </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Order</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">deserialize</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">bytes</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Python — same binary format, same type ID</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">fory </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> pyfory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Fory</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">xlang</span><span class="token operator" style="color:#393A34">=</span><span class="token boolean" style="color:#36acaa">True</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">register</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Order</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> type_id</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">201</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">order </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">deserialize</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">data</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><strong>Field matching</strong>: In cross-language mode, field names are normalized to snake_case and matched by that canonical name. Ordering follows Fory's xlang field-order rules (not simple alphabetical ordering), so keep names semantically consistent across languages.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="with-the-fory-schema-idl-compiler">With the Fory Schema IDL Compiler<a href="https://fory.apache.org/blog/fory_cpp_blazing_fast_serialization_framework#with-the-fory-schema-idl-compiler" class="hash-link" aria-label="Direct link to With the Fory Schema IDL Compiler" title="Direct link to With the Fory Schema IDL Compiler">​</a></h3>
<p>As schemas grow and span more services and teams, manually maintaining consistent field names, type IDs, and type definitions across five languages becomes error-prone. The <strong>Fory Schema IDL Compiler</strong> (<code>foryc</code>) solves this by letting you define types once in a <code>.fdl</code> file and generating idiomatic, production-ready code for every target language. The generated code includes typed accessors, serialization macros, registration helpers, and <code>to_bytes()</code>/<code>from_bytes()</code> helpers — so you never write serialization plumbing by hand.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="1-install-the-compiler">1. Install the compiler<a href="https://fory.apache.org/blog/fory_cpp_blazing_fast_serialization_framework#1-install-the-compiler" class="hash-link" aria-label="Direct link to 1. Install the compiler" title="Direct link to 1. Install the compiler">​</a></h4>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">pip </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> fory-compiler</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">foryc </span><span class="token parameter variable" style="color:#36acaa">--help</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="2-write-a-schema-ecommercefdl">2. Write a schema (<code>ecommerce.fdl</code>)<a href="https://fory.apache.org/blog/fory_cpp_blazing_fast_serialization_framework#2-write-a-schema-ecommercefdl" class="hash-link" aria-label="Direct link to 2-write-a-schema-ecommercefdl" title="Direct link to 2-write-a-schema-ecommercefdl">​</a></h4>
<p>Fory IDL syntax is concise and deliberately close to protobuf, so it is easy to pick up. Field modifiers like <code>optional</code>, <code>ref</code>, and <code>list</code> map directly to idiomatic C++ types:</p>
<div class="language-protobuf codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-protobuf codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">package</span><span class="token plain"> ecommerce</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">enum</span><span class="token plain"> </span><span class="token class-name">OrderStatus</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    PENDING </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> CONFIRMED </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> SHIPPED </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> DELIVERED </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">message</span><span class="token plain"> </span><span class="token class-name">Address</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token builtin">string</span><span class="token plain"> street </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token builtin">string</span><span class="token plain"> city </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token builtin">string</span><span class="token plain"> country </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">message</span><span class="token plain"> </span><span class="token class-name">Customer</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token builtin">string</span><span class="token plain">           id      </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token builtin">string</span><span class="token plain">           name    </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">optional</span><span class="token plain"> </span><span class="token builtin">string</span><span class="token plain">  email   </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">   </span><span class="token comment" style="color:#999988;font-style:italic">// Nullable: maps to std::optional&lt;std::string&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">optional</span><span class="token plain"> </span><span class="token positional-class-name class-name">Address</span><span class="token plain"> address </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">message</span><span class="token plain"> </span><span class="token class-name">OrderItem</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token builtin">string</span><span class="token plain">  sku        </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token builtin">int32</span><span class="token plain">   quantity   </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token positional-class-name class-name">float64</span><span class="token plain"> unit_price </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Discount can be either a fixed amount or a percentage — modelled as a union</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">message</span><span class="token plain"> </span><span class="token class-name">FixedDiscount</span><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token positional-class-name class-name">float64</span><span class="token plain"> amount     </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">message</span><span class="token plain"> </span><span class="token class-name">PercentDiscount</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token positional-class-name class-name">float64</span><span class="token plain"> percentage </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// union maps to std::variant&lt;FixedDiscount, PercentDiscount&gt; in C++</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">union Discount </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token positional-class-name class-name">FixedDiscount</span><span class="token plain">   fixed   </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token positional-class-name class-name">PercentDiscount</span><span class="token plain"> percent </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">message</span><span class="token plain"> </span><span class="token class-name">Order</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token builtin">string</span><span class="token plain">            order_id   </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    ref </span><span class="token positional-class-name class-name">Customer</span><span class="token plain">      customer   </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// ref: std::shared_ptr + reference tracking</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    list</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">OrderItem</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain">   items      </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// list: std::vector&lt;OrderItem&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token positional-class-name class-name">OrderStatus</span><span class="token plain">       status     </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token positional-class-name class-name">float64</span><span class="token plain">           total      </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">optional</span><span class="token plain"> </span><span class="token builtin">string</span><span class="token plain">   notes      </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">6</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token positional-class-name class-name">timestamp</span><span class="token plain">         created_at </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">7</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">optional</span><span class="token plain"> </span><span class="token positional-class-name class-name">Discount</span><span class="token plain"> discount   </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">8</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// optional union field</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>The IDL type system maps cleanly to native C++ constructs. <code>union</code> is a first-class IDL construct that generates a <code>std::variant</code>-based wrapper class in C++, with typed case accessors (<code>is_fixed()</code>, <code>as_fixed()</code>, etc.) and a <code>visit()</code> method. Here is the full set of field modifiers and their C++ equivalents:</p>
<table><thead><tr><th>Modifier</th><th>C++ type</th><th>Purpose</th></tr></thead><tbody><tr><td><code>optional T</code></td><td><code>std::optional&lt;T&gt;</code></td><td>Nullable field</td></tr><tr><td><code>ref T</code></td><td><code>std::shared_ptr&lt;T&gt;</code></td><td>Shared / circular reference</td></tr><tr><td><code>ref(weak=true) T</code></td><td><code>fory::serialization::SharedWeak&lt;T&gt;</code></td><td>Weak reference (breaks cycles)</td></tr><tr><td><code>list&lt;T&gt;</code></td><td><code>std::vector&lt;T&gt;</code></td><td>Ordered list</td></tr><tr><td><code>map&lt;K,V&gt;</code></td><td><code>std::map&lt;K,V&gt;</code></td><td>Key-value map</td></tr></tbody></table>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="3-generate-code">3. Generate code<a href="https://fory.apache.org/blog/fory_cpp_blazing_fast_serialization_framework#3-generate-code" class="hash-link" aria-label="Direct link to 3. Generate code" title="Direct link to 3. Generate code">​</a></h4>
<p><code>foryc</code> generates a single header file per schema for C++, and equivalent files for every other target language. All generated files use the same type IDs derived from the package and type names, guaranteeing binary compatibility without any manual coordination:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Generate C++ header directly under ./generated</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">foryc ecommerce.fdl </span><span class="token parameter variable" style="color:#36acaa">--cpp_out</span><span class="token plain"> ./generated</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Generate multiple languages with explicit output directories</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">foryc ecommerce.fdl </span><span class="token parameter variable" style="color:#36acaa">--cpp_out</span><span class="token plain"> ./generated </span><span class="token parameter variable" style="color:#36acaa">--java_out</span><span class="token plain"> ./java/src/main/java </span><span class="token parameter variable" style="color:#36acaa">--python_out</span><span class="token plain"> ./python/gen </span><span class="token parameter variable" style="color:#36acaa">--go_out</span><span class="token plain"> ./go/gen </span><span class="token parameter variable" style="color:#36acaa">--rust_out</span><span class="token plain"> ./rust/gen</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>The output structure for C++ is one header per schema file under the directory passed to <code>--cpp_out</code>. For example, <code>--cpp_out ./generated</code> produces <code>generated/ecommerce.h</code>. The header contains all types under the <code>ecommerce::</code> namespace, with <code>FORY_STRUCT</code> macros and a <code>register_types()</code> helper already wired up.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="4-use-the-generated-c-code">4. Use the generated C++ code<a href="https://fory.apache.org/blog/fory_cpp_blazing_fast_serialization_framework#4-use-the-generated-c-code" class="hash-link" aria-label="Direct link to 4. Use the generated C++ code" title="Direct link to 4. Use the generated C++ code">​</a></h4>
<p>The generated header provides <code>final</code> classes with typed accessors and <code>to_bytes()</code>/<code>from_bytes()</code> helpers. There is no manual Fory instance setup required — the helpers manage it internally:</p>
<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token macro property directive-hash" style="color:#36acaa">#</span><span class="token macro property directive keyword" style="color:#00009f">include</span><span class="token macro property" style="color:#36acaa"> </span><span class="token macro property string" style="color:#e3116c">"generated/ecommerce.h"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ecommerce</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">Order order</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">order</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">set_order_id</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"ORD-2025-001"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">order</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">mutable_customer</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">set_name</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Alice"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">order</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">set_status</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ecommerce</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">OrderStatus</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">CONFIRMED</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">order</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">set_total</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">159.98</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// to_bytes()/from_bytes() are generated — no Fory boilerplate needed</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">auto</span><span class="token plain"> bytes </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> order</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">to_bytes</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">value</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">auto</span><span class="token plain"> restored </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> ecommerce</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token class-name">Order</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">from_bytes</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">bytes</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">value</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">assert</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">restored</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">order_id</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ORD-2025-001"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Because the generated Java, Python, and Go code uses the same type IDs, bytes serialized by the C++ <code>to_bytes()</code> helper can be deserialized by the Java <code>fromBytes()</code> or Python <code>from_bytes()</code> helpers out of the box — no extra configuration required.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="supported-types">Supported Types<a href="https://fory.apache.org/blog/fory_cpp_blazing_fast_serialization_framework#supported-types" class="hash-link" aria-label="Direct link to Supported Types" title="Direct link to Supported Types">​</a></h2>
<p>Apache Fory C++ supports a comprehensive set of types covering all common C++ data structures and cross-language primitives:</p>
<table><thead><tr><th>Category</th><th>C++ Types</th></tr></thead><tbody><tr><td>Primitives</td><td><code>bool</code>, <code>int8_t</code>…<code>int64_t</code>, <code>uint8_t</code>…<code>uint64_t</code>, <code>float</code>, <code>double</code></td></tr><tr><td>Strings</td><td><code>std::string</code>, <code>std::string_view</code>, <code>std::u16string</code></td></tr><tr><td>Collections</td><td><code>std::vector&lt;T&gt;</code>, <code>std::set&lt;T&gt;</code>, <code>std::unordered_set&lt;T&gt;</code>, <code>std::map&lt;K,V&gt;</code>, <code>std::unordered_map&lt;K,V&gt;</code></td></tr><tr><td>Optional/Union</td><td><code>std::optional&lt;T&gt;</code>, <code>std::variant&lt;Ts...&gt;</code></td></tr><tr><td>Smart Pointers</td><td><code>std::shared_ptr&lt;T&gt;</code> (ref tracking + polymorphism), <code>std::unique_ptr&lt;T&gt;</code>, <code>fory::serialization::SharedWeak&lt;T&gt;</code></td></tr><tr><td>Temporal</td><td><code>std::chrono::nanoseconds</code>, <code>fory::serialization::Timestamp</code>, <code>fory::serialization::Date</code></td></tr><tr><td>Enums</td><td>Scoped/unscoped enums; use <code>FORY_ENUM</code> for non-continuous values</td></tr><tr><td>User structs</td><td>Any type annotated with <code>FORY_STRUCT</code></td></tr></tbody></table>
<p>All collection element and map value types can be arbitrarily nested, including structs, smart pointers, and <code>std::optional</code>.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="configuration-reference">Configuration Reference<a href="https://fory.apache.org/blog/fory_cpp_blazing_fast_serialization_framework#configuration-reference" class="hash-link" aria-label="Direct link to Configuration Reference" title="Direct link to Configuration Reference">​</a></h2>
<p>Fory instances are constructed through a fluent builder API. All options have sensible defaults, so most applications only need to set one or two:</p>
<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">auto</span><span class="token plain"> fory </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Fory</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">builder</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">xlang</span><span class="token punctuation" style="color:#393A34">(</span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">                </span><span class="token comment" style="color:#999988;font-style:italic">// Cross-language binary protocol (default: true)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">compatible</span><span class="token punctuation" style="color:#393A34">(</span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">           </span><span class="token comment" style="color:#999988;font-style:italic">// Schema evolution / compatible mode (default: false)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">track_ref</span><span class="token punctuation" style="color:#393A34">(</span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">            </span><span class="token comment" style="color:#999988;font-style:italic">// Shared/circular reference tracking (default: true)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">max_dyn_depth</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">          </span><span class="token comment" style="color:#999988;font-style:italic">// Max polymorphic nesting depth (default: 5)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">check_struct_version</span><span class="token punctuation" style="color:#393A34">(</span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// Validate struct hash on deserialization (default: false)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">build</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">                   </span><span class="token comment" style="color:#999988;font-style:italic">// Single-threaded; use build_thread_safe() for multi-thread</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><strong>Tuning guide</strong>: Disable <code>compatible</code> for maximum throughput when schema changes are coordinated (same binary deployed together). Disable <code>track_ref</code> for pure value types with no sharing or cycles — it eliminates per-object reference bookkeeping. Use <code>xlang(false)</code> for C++-only deployments to get a more compact binary encoding.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="benchmarks">Benchmarks<a href="https://fory.apache.org/blog/fory_cpp_blazing_fast_serialization_framework#benchmarks" class="hash-link" aria-label="Direct link to Benchmarks" title="Direct link to Benchmarks">​</a></h2>
<p>Apache Fory delivers exceptional performance across diverse data shapes. The combination of compile-time code generation, variable-length integer encoding, and a carefully designed binary protocol yields major gains versus text formats and strong results versus Protocol Buffers. In the current C++ benchmark report, Fory throughput vs Protobuf ranges from about <strong>1.1x to 12.2x</strong> depending on workload and operation:</p>
<img src="https://fory.apache.org/img/benchmarks/cpp/throughput.png" width="90%">
<p>The C++ implementation achieves similar relative speedups to the Java implementation. Because both share the same binary protocol design, and C++ serialization code is generated at compile time (eliminating the JIT warm-up cost), C++ performance is competitive or superior for latency-sensitive workloads.</p>
<p>Serialized Data Sizes (bytes)</p>
<table><thead><tr><th>Datatype</th><th>Fory</th><th>Protobuf</th></tr></thead><tbody><tr><td>Struct</td><td>58</td><td>61</td></tr><tr><td>Sample</td><td>446</td><td>375</td></tr><tr><td>MediaContent</td><td>365</td><td>301</td></tr><tr><td>StructList</td><td>184</td><td>315</td></tr><tr><td>SampleList</td><td>1980</td><td>1890</td></tr><tr><td>MediaContentList</td><td>1535</td><td>1520</td></tr></tbody></table>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="conclusion">Conclusion<a href="https://fory.apache.org/blog/fory_cpp_blazing_fast_serialization_framework#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion">​</a></h2>
<p>Apache Fory C++ brings together a set of capabilities that no other C++ serialization library delivers as a cohesive package:</p>
<ul>
<li><strong>Performance</strong>: Template-based compile-time codegen eliminates all runtime reflection overhead; a highly efficient binary protocol minimizes both serialized size and CPU cycles</li>
<li><strong>Cross-language</strong>: The same binary format works natively with Java, Python, Go, Rust, and JavaScript</li>
<li><strong>Native C++ idioms</strong>: <code>std::shared_ptr</code>, <code>std::optional</code>, <code>std::variant</code>, <code>fory::serialization::SharedWeak</code> — all handled naturally</li>
<li><strong>Production-ready features</strong>: Polymorphism, circular references, schema evolution, thread safety out of the box</li>
<li><strong>Schema-first option</strong>: The Fory IDL Compiler generates consistent, idiomatic code across all languages from a single <code>.fdl</code> definition — no more manually synchronizing type IDs across codebases</li>
</ul>
<p>Whether you are building a high-performance game server, a polyglot microservice backend, a real-time analytics pipeline, or an embedded system serializing complex domain models, Apache Fory C++ has you covered.</p>
<p><strong>Get started:</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">git</span><span class="token plain"> clone https://github.com/apache/fory.git</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">cd</span><span class="token plain"> fory/examples/cpp/hello_world</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">cmake </span><span class="token parameter variable" style="color:#36acaa">-B</span><span class="token plain"> build </span><span class="token parameter variable" style="color:#36acaa">-DCMAKE_BUILD_TYPE</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">Release </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> cmake </span><span class="token parameter variable" style="color:#36acaa">--build</span><span class="token plain"> build</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">./build/hello_world</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><strong>Documentation:</strong></p>
<ul>
<li>C++ Serialization Guide: <a href="https://fory.apache.org/docs/guide/cpp" target="_blank" rel="noopener noreferrer">fory.apache.org/docs/guide/cpp</a></li>
<li>Fory Schema IDL Compiler: <a href="https://fory.apache.org/docs/compiler" target="_blank" rel="noopener noreferrer">fory.apache.org/docs/compiler</a></li>
<li>Xlang Serialization Spec: <a href="https://fory.apache.org/docs/specification/xlang_serialization_spec/" target="_blank" rel="noopener noreferrer">fory.apache.org/docs/specification</a></li>
</ul>
<p><strong>Community:</strong></p>
<ul>
<li>GitHub: <a href="https://github.com/apache/fory" target="_blank" rel="noopener noreferrer">apache/fory</a></li>
<li>Slack: <a href="https://join.slack.com/t/fory-project/shared_invite/zt-1u8soj4qc-ieYEu7ciHOqA2mo47llS8A" target="_blank" rel="noopener noreferrer">Join our community</a></li>
<li>License: Apache License 2.0</li>
</ul>]]></content>
        <author>
            <name>Shawn Yang</name>
            <uri>https://github.com/chaokunyang</uri>
        </author>
        <category label="fory" term="fory"/>
        <category label="cpp" term="cpp"/>
        <category label="serialization" term="serialization"/>
        <category label="cross-language" term="cross-language"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Fory v0.15.0 Released]]></title>
        <id>https://fory.apache.org/blog/fory_0_15_0_release</id>
        <link href="https://fory.apache.org/blog/fory_0_15_0_release"/>
        <updated>2026-02-10T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[The Apache Fory team is pleased to announce the 0.15.0 release. This is a major release that includes 144 PR from 17 distinct contributors. See the Install Page to learn how to get the libraries for your platform.]]></summary>
        <content type="html"><![CDATA[<p>The Apache Fory team is pleased to announce the 0.15.0 release. This is a major release that includes <a href="https://github.com/apache/fory/compare/v0.14.1...v0.15.0" target="_blank" rel="noopener noreferrer">144 PR</a> from 17 distinct contributors. See the <a href="https://fory.apache.org/docs/start/install" target="_blank" rel="noopener noreferrer">Install</a> Page to learn how to get the libraries for your platform.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="highlights">Highlights<a href="https://fory.apache.org/blog/fory_0_15_0_release#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights">​</a></h2>
<ul>
<li>feat(go): new golang xlang serialization implementation by @chaokunyang in <a href="https://github.com/apache/fory/pull/3063" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3063</a></li>
<li>feat(rust): add tuple struct support and improve generic type handling by @ariesdevil in <a href="https://github.com/apache/fory/pull/3087" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3087</a></li>
<li>refactor(rust): unify tuple struct and named struct protocol, and make schema evolution happy by @ariesdevil in <a href="https://github.com/apache/fory/pull/3092" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3092</a>
feat(java/python/rust/go/cpp): align nullable meta for xlang struct fields serialization by @chaokunyang in <a href="https://github.com/apache/fory/pull/3093" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3093</a></li>
<li>feat(java/python/rust/go/cpp): xlang fields reference and typeinfo alignment by @chaokunyang in <a href="https://github.com/apache/fory/pull/3107" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3107</a></li>
<li>feat(cpp): add <code>SharedWeak&lt;T&gt;</code> for circular reference support by @chaokunyang in <a href="https://github.com/apache/fory/pull/3109" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3109</a></li>
<li>feat(xlang): support unsigned int for xlang by @chaokunyang in <a href="https://github.com/apache/fory/pull/3111" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3111</a> and <a href="https://github.com/apache/fory/pull/3113" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3113</a></li>
<li>feat(xlang/java): refactor java native serialization type system and streaming type info for xlang by @chaokunyang in <a href="https://github.com/apache/fory/pull/3153" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3153</a></li>
<li>feat(xlang): fory schema idl and compiler by @chaokunyang in <a href="https://github.com/apache/fory/pull/3106" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3106</a></li>
<li>feat(compiler): add flatbuffers idl support by @chaokunyang in <a href="https://github.com/apache/fory/pull/3184" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3184</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="go-serialization-first-release">Go Serialization: First Release<a href="https://fory.apache.org/blog/fory_0_15_0_release#go-serialization-first-release" class="hash-link" aria-label="Direct link to Go Serialization: First Release" title="Direct link to Go Serialization: First Release">​</a></h2>
<p>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.</p>
<p><strong>Key capabilities:</strong></p>
<ul>
<li>Cross-language mode with Java, Python, <code>cpp</code>, Rust, and JavaScript (<code>fory.WithXlang(true)</code>)</li>
<li>Reflection-based serialization by default, plus optional experimental AOT code generation for hot paths</li>
<li>Reference tracking for shared/circular object graphs (<code>fory.WithTrackRef(true)</code> + <code>fory:"ref"</code> tags)</li>
<li>Compatible mode for schema evolution (<code>fory.WithCompatible(true)</code>) supporting add/remove/reorder field changes</li>
<li>Thread-safe wrapper (<code>github.com/apache/fory/go/fory/threadsafe</code>) for concurrent workloads</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="quick-start">Quick Start<a href="https://fory.apache.org/blog/fory_0_15_0_release#quick-start" class="hash-link" aria-label="Direct link to Quick Start" title="Direct link to Quick Start">​</a></h3>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">package</span><span class="token plain"> main</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"github.com/apache/fory/go/fory"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">type</span><span class="token plain"> User </span><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    ID   </span><span class="token builtin">int64</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Name </span><span class="token builtin">string</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">main</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    f </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">New</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">WithXlang</span><span class="token punctuation" style="color:#393A34">(</span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">WithCompatible</span><span class="token punctuation" style="color:#393A34">(</span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token boolean" style="color:#36acaa">_</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> f</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">RegisterStruct</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">User</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    data</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">_</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> f</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Serialize</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">User</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">ID</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Alice"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> out User</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token boolean" style="color:#36acaa">_</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> f</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Deserialize</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">data</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">out</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<ul>
<li>Go guide: <a href="https://fory.apache.org/docs/guide/go/" target="_blank" rel="noopener noreferrer">https://fory.apache.org/docs/guide/go/</a></li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="go-benchmarks">Go Benchmarks<a href="https://fory.apache.org/blog/fory_0_15_0_release#go-benchmarks" class="hash-link" aria-label="Direct link to Go Benchmarks" title="Direct link to Go Benchmarks">​</a></h3>
<img src="https://fory.apache.org/img/blog/fory_0_15_0_release/go_benchmark_combined.png" width="90%">
<p>Below are timing results (ns/op; lower is better) comparing Fory with Protobuf and Msgpack across representative data structures.</p>
<table><thead><tr><th>Data Type</th><th>Operation</th><th>Fory</th><th>Protobuf</th><th>Msgpack</th></tr></thead><tbody><tr><td>Struct</td><td>Serialize</td><td>66.0</td><td>97.8</td><td>184.9</td></tr><tr><td>Struct</td><td>Deserialize</td><td>82.7</td><td>90.9</td><td>309.6</td></tr><tr><td>Structlist</td><td>Serialize</td><td>632.8</td><td>1783.0</td><td>3340.0</td></tr><tr><td>Structlist</td><td>Deserialize</td><td>906.4</td><td>1891.0</td><td>5709.0</td></tr><tr><td>Sample</td><td>Serialize</td><td>137.3</td><td>367.3</td><td>1492.0</td></tr><tr><td>Sample</td><td>Deserialize</td><td>263.6</td><td>422.2</td><td>2661.0</td></tr><tr><td>Samplelist</td><td>Serialize</td><td>1962.0</td><td>7087.0</td><td>26169.0</td></tr><tr><td>Samplelist</td><td>Deserialize</td><td>4234.0</td><td>9321.0</td><td>53615.0</td></tr><tr><td>Mediacontent</td><td>Serialize</td><td>268.8</td><td>471.1</td><td>773.7</td></tr><tr><td>Mediacontent</td><td>Deserialize</td><td>426.9</td><td>553.1</td><td>1432.0</td></tr><tr><td>Mediacontentlist</td><td>Serialize</td><td>3736.0</td><td>9107.0</td><td>13911.0</td></tr><tr><td>Mediacontentlist</td><td>Deserialize</td><td>7247.0</td><td>11435.0</td><td>27975.0</td></tr></tbody></table>
<p>Serialized data sizes (bytes):</p>
<table><thead><tr><th>Data Type</th><th>Fory</th><th>Protobuf</th><th>Msgpack</th></tr></thead><tbody><tr><td>Struct</td><td>58</td><td>61</td><td>57</td></tr><tr><td>Sample</td><td>446</td><td>375</td><td>524</td></tr><tr><td>MediaContent</td><td>342</td><td>301</td><td>400</td></tr><tr><td>StructList</td><td>560</td><td>1260</td><td>1146</td></tr><tr><td>SampleList</td><td>7600</td><td>7560</td><td>10486</td></tr><tr><td>MediaContentList</td><td>5776</td><td>6080</td><td>8006</td></tr></tbody></table>
<p>Note: Results depend on hardware and implementation versions. See the Go benchmark docs for details: <a href="https://fory.apache.org/docs/benchmarks/go/" target="_blank" rel="noopener noreferrer">https://fory.apache.org/docs/benchmarks/go/</a></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="fory-schema-idl-and-compiler-first-release">Fory Schema IDL and Compiler: First Release<a href="https://fory.apache.org/blog/fory_0_15_0_release#fory-schema-idl-and-compiler-first-release" class="hash-link" aria-label="Direct link to Fory Schema IDL and Compiler: First Release" title="Direct link to Fory Schema IDL and Compiler: First Release">​</a></h2>
<p>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.</p>
<p><strong>Key capabilities:</strong></p>
<ul>
<li>Schema-first development with <code>enum</code>, <code>message</code>, and <code>union</code></li>
<li>Fory-native field semantics: <code>optional</code> (nullability), <code>ref</code> (shared/circular references), <code>list</code>, and <code>map</code></li>
<li>Multi-language code generation for Java, Python, Go, Rust, and <code>cpp</code></li>
<li>Protobuf (<code>.proto</code>) and FlatBuffers (<code>.fbs</code>) frontend support, translated into Fory IR/codegen</li>
<li>Idiomatic generated APIs with <code>to/from bytes</code> helpers</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="quick-start-1">Quick Start<a href="https://fory.apache.org/blog/fory_0_15_0_release#quick-start-1" class="hash-link" aria-label="Direct link to Quick Start" title="Direct link to Quick Start">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">pip </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> fory-compiler</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">foryc example.fdl </span><span class="token parameter variable" style="color:#36acaa">--lang</span><span class="token plain"> java,python,go,rust,cpp </span><span class="token parameter variable" style="color:#36acaa">--output</span><span class="token plain"> ./generated</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-protobuf codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-protobuf codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">package</span><span class="token plain"> example</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">message</span><span class="token plain"> Person </span><span class="token punctuation" style="color:#393A34">[</span><span class="token annotation">id</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">101</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token builtin">string</span><span class="token plain"> name </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">optional</span><span class="token plain"> </span><span class="token builtin">string</span><span class="token plain"> email </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="generated-code-example">Generated Code Example<a href="https://fory.apache.org/blog/fory_0_15_0_release#generated-code-example" class="hash-link" aria-label="Direct link to Generated Code Example" title="Direct link to Generated Code Example">​</a></h3>
<p><code>foryc</code> generates idiomatic native types plus registration/byte helpers. For the
schema above, generated code looks like:</p>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Go (excerpt)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">type</span><span class="token plain"> Person </span><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Name  </span><span class="token builtin">string</span><span class="token plain">                    </span><span class="token string" style="color:#e3116c">`fory:"id=1"`</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Email optional</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Optional</span><span class="token punctuation" style="color:#393A34">[</span><span class="token builtin">string</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">`fory:"id=2"`</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">m </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">Person</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">ToBytes</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token builtin">byte</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token builtin">error</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">...</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">m </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">Person</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">FromBytes</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">data </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token builtin">byte</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token builtin">error</span><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">...</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">RegisterTypes</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">f </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Fory</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token builtin">error</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> f</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">RegisterStruct</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Person</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">101</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Java (excerpt)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">Person</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token annotation punctuation" style="color:#393A34">@ForyField</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">id </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">private</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token plain"> name</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token annotation punctuation" style="color:#393A34">@ForyField</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">id </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> nullable </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">private</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token plain"> email</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">byte</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">toBytes</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token punctuation" style="color:#393A34">.</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">static</span><span class="token plain"> </span><span class="token class-name">Person</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">fromBytes</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">byte</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> bytes</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token punctuation" style="color:#393A34">.</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Python (excerpt)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token decorator annotation punctuation" style="color:#393A34">@pyfory</span><span class="token decorator annotation punctuation" style="color:#393A34">.</span><span class="token decorator annotation punctuation" style="color:#393A34">dataclass</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">Person</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token builtin">str</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> pyfory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">field</span><span class="token punctuation" style="color:#393A34">(</span><span class="token builtin">id</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> default</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">""</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    email</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Optional</span><span class="token punctuation" style="color:#393A34">[</span><span class="token builtin">str</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> pyfory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">field</span><span class="token punctuation" style="color:#393A34">(</span><span class="token builtin">id</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> default</span><span class="token operator" style="color:#393A34">=</span><span class="token boolean" style="color:#36acaa">None</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">to_bytes</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">self</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token builtin">bytes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token punctuation" style="color:#393A34">.</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token decorator annotation punctuation" style="color:#393A34">@classmethod</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">from_bytes</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">cls</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> data</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token builtin">bytes</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Person"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token punctuation" style="color:#393A34">.</span><span class="token punctuation" style="color:#393A34">.</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<ul>
<li>Compiler docs: <a href="https://fory.apache.org/docs/compiler/" target="_blank" rel="noopener noreferrer">https://fory.apache.org/docs/compiler/</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="features">Features<a href="https://fory.apache.org/blog/fory_0_15_0_release#features" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features">​</a></h2>
<ul>
<li>feat(java): add config params for IdentityObjectIntMap by @jim-parsons in <a href="https://github.com/apache/fory/pull/3048" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3048</a></li>
<li>perf: add cpp benchmark report by @chaokunyang in <a href="https://github.com/apache/fory/pull/3051" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3051</a></li>
<li>feat(python): add Union type support for xlang serialization by @zhan7236 in <a href="https://github.com/apache/fory/pull/3059" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3059</a></li>
<li>feat(go): new golang xlang serialization implementation by @chaokunyang in <a href="https://github.com/apache/fory/pull/3063" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3063</a></li>
<li>feat(java): enhance ForyField annotation with tag ID support for optimized serialization by @mchernyakov in <a href="https://github.com/apache/fory/pull/3021" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3021</a></li>
<li>feat(cpp): add iterator container serialization support by @zhan7236 in <a href="https://github.com/apache/fory/pull/3068" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3068</a></li>
<li>refactor(go): refactor go error processing by @chaokunyang in <a href="https://github.com/apache/fory/pull/3069" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3069</a></li>
<li>feat(rust): add generate_default attr, no longer generate <code>Default</code> trait impl by default by @ariesdevil in <a href="https://github.com/apache/fory/pull/3074" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3074</a></li>
<li>feat(java): implement Union type support for cross-language serialization by @zhan7236 in <a href="https://github.com/apache/fory/pull/3062" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3062</a></li>
<li>perf(go): add go benchmarks and optimize performance by @chaokunyang in <a href="https://github.com/apache/fory/pull/3071" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3071</a></li>
<li>feat(python): add java python xlang tests and align protocol by @chaokunyang in <a href="https://github.com/apache/fory/pull/3077" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3077</a></li>
<li>feat(rust): add i128 and isize type support by @ariesdevil in <a href="https://github.com/apache/fory/pull/3080" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3080</a></li>
<li>feat(rust): add unit type and PhantomData serializer support by @ariesdevil in <a href="https://github.com/apache/fory/pull/3081" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3081</a></li>
<li>refactor(python): refactor pyfory serializers code structure by @chaokunyang in <a href="https://github.com/apache/fory/pull/3083" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3083</a></li>
<li>feat(rust): add union and none type support by @ariesdevil in <a href="https://github.com/apache/fory/pull/3084" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3084</a></li>
<li>feat(go): add go struct field tag support by @chaokunyang in <a href="https://github.com/apache/fory/pull/3082" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3082</a></li>
<li>feat(rust): add tuple struct support and improve generic type handling by @ariesdevil in <a href="https://github.com/apache/fory/pull/3087" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3087</a></li>
<li>feat(rust): support configure rust field meta to reduce cost by @chaokunyang in <a href="https://github.com/apache/fory/pull/3089" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3089</a></li>
<li>feat(cpp): support customize cpp field meta by @chaokunyang in <a href="https://github.com/apache/fory/pull/3088" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3088</a></li>
<li>feat(ci): make rust xlang ci run separately to make ci faster by @chaokunyang in <a href="https://github.com/apache/fory/pull/3090" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3090</a></li>
<li>feat(python): support configure field meta for python by @chaokunyang in <a href="https://github.com/apache/fory/pull/3091" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3091</a></li>
<li>refactor(rust): unify tuple struct and named struct protocol, and make schema evolution happy by @ariesdevil in <a href="https://github.com/apache/fory/pull/3092" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3092</a></li>
<li>feat(java): build Descriptors with final ref_tracking flags by @chaokunyang in <a href="https://github.com/apache/fory/pull/3070" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3070</a></li>
<li>feat(java/python/rust/go/cpp): align nullable meta for xlang struct fields serialization by @chaokunyang in <a href="https://github.com/apache/fory/pull/3093" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3093</a></li>
<li>feat(rust): implement fine-grained ref tracking for rust by @chaokunyang in <a href="https://github.com/apache/fory/pull/3101" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3101</a></li>
<li>feat(cpp): fine-grained ref tracking for cpp by @chaokunyang in <a href="https://github.com/apache/fory/pull/3103" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3103</a></li>
<li>feat(java/python/rust/go/cpp): xlang nullable/ref alignment by @chaokunyang in <a href="https://github.com/apache/fory/pull/3104" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3104</a></li>
<li>feat(java/python/rust/go/cpp): xlang fields reference and typeinfo alignment by @chaokunyang in <a href="https://github.com/apache/fory/pull/3107" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3107</a></li>
<li>feat(java/python/go/rust): add circular reference xlang tests by @chaokunyang in <a href="https://github.com/apache/fory/pull/3108" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3108</a></li>
<li>feat(cpp): add <code>SharedWeak&lt;T&gt;</code> for circular reference support by @chaokunyang in <a href="https://github.com/apache/fory/pull/3109" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3109</a></li>
<li>feat(js): add schema-based per-field nullable support for xlang by @theharsh999 in <a href="https://github.com/apache/fory/pull/3100" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3100</a></li>
<li>feat(xlang): support unsigned int for xlang by @chaokunyang in <a href="https://github.com/apache/fory/pull/3111" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3111</a></li>
<li>feat(java): long array serializer support varint encoding by @Pigsy-Monk in <a href="https://github.com/apache/fory/pull/3115" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3115</a></li>
<li>feat(xlang): support serialization for unsigned types and field encoding config by @chaokunyang in <a href="https://github.com/apache/fory/pull/3113" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3113</a></li>
<li>perf(go): optimize go struct fields serialization perf by @chaokunyang in <a href="https://github.com/apache/fory/pull/3120" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3120</a></li>
<li>feat(java): int array serializer support varint encoding by @Pigsy-Monk in <a href="https://github.com/apache/fory/pull/3124" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3124</a></li>
<li>feat(java): support xlang serialization for GraalVM native image by @chaokunyang in <a href="https://github.com/apache/fory/pull/3126" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3126</a></li>
<li>refactor(go): rename go interface<!-- --> to any by @chaokunyang in <a href="https://github.com/apache/fory/pull/3128" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3128</a></li>
<li>refactor(xlang): remove magic number from protocol by @chaokunyang in <a href="https://github.com/apache/fory/pull/3137" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3137</a></li>
<li>feat(xlang): use little endian when serializing array of multiple byte element size by @chaokunyang in <a href="https://github.com/apache/fory/pull/3140" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3140</a></li>
<li>refactor(java/cpp): rename morphic to dynamic by @chaokunyang in <a href="https://github.com/apache/fory/pull/3142" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3142</a></li>
<li>feat(xlang): add unsigned integer type support for JavaScript by @ayush00git in <a href="https://github.com/apache/fory/pull/3139" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3139</a></li>
<li>feat: add unsigned number for dart by @ayush00git in <a href="https://github.com/apache/fory/pull/3144" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3144</a></li>
<li>feat(xlang/java): refactor java native serialization type system and streaming type info for xlang by @chaokunyang in <a href="https://github.com/apache/fory/pull/3153" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3153</a></li>
<li>feat(dart): add struct serializer support for unsigned integer types by @ayush00git in <a href="https://github.com/apache/fory/pull/3155" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3155</a></li>
<li>feat(xlang): fory schema idl and compiler by @chaokunyang in <a href="https://github.com/apache/fory/pull/3106" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3106</a></li>
<li>refactor(java): use <code>Types.NONE + 1</code> as base java native id by @chaokunyang in <a href="https://github.com/apache/fory/pull/3180" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3180</a></li>
<li>refactor(compiler): refactor fory compiler into hierarchical architecture by @chaokunyang in <a href="https://github.com/apache/fory/pull/3179" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3179</a></li>
<li>feat(JavaScript): Add cross language test for JavaScript by @theweipeng in <a href="https://github.com/apache/fory/pull/3161" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3161</a></li>
<li>feat(dart): add dart ci by @chaokunyang in <a href="https://github.com/apache/fory/pull/3189" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3189</a></li>
<li>feat(compiler): add flatbuffers idl support by @chaokunyang in <a href="https://github.com/apache/fory/pull/3184" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3184</a></li>
<li>feat(java): enhance java unsigned int/array type system by @chaokunyang in <a href="https://github.com/apache/fory/pull/3190" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3190</a></li>
<li>feat(dart): add uint annotation types to the fory's codegen system by @ayush00git in <a href="https://github.com/apache/fory/pull/3181" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3181</a></li>
<li>feat(dart): add uint struct support to the codegen system by @ayush00git in <a href="https://github.com/apache/fory/pull/3192" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3192</a></li>
<li>feat(compiler): add union support to fory compiler and runtime by @chaokunyang in <a href="https://github.com/apache/fory/pull/3195" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3195</a></li>
<li>feat(cpp): support private fields of cpp class by @chaokunyang in <a href="https://github.com/apache/fory/pull/3193" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3193</a></li>
<li>feat(compiler): generate getter/setter/has/clear methods for cpp by @chaokunyang in <a href="https://github.com/apache/fory/pull/3199" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3199</a></li>
<li>feat(JavaScript): impl the xlang string by @theweipeng in <a href="https://github.com/apache/fory/pull/3197" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3197</a></li>
<li>feat(cpp): make fory enum/nuion macro in user namespace by @chaokunyang in <a href="https://github.com/apache/fory/pull/3200" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3200</a></li>
<li>feat(go): use option for optional fields by @chaokunyang in <a href="https://github.com/apache/fory/pull/3202" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3202</a></li>
<li>feat(cpp): make shared_ptr track ref by default by @chaokunyang in <a href="https://github.com/apache/fory/pull/3214" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3214</a></li>
<li>feat(go): support [N]uint types array serializers by @ayush00git in <a href="https://github.com/apache/fory/pull/3201" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3201</a></li>
<li>feat(xlang): reserve 4 bits for type meta by @chaokunyang in <a href="https://github.com/apache/fory/pull/3204" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3204</a></li>
<li>feat(go): remove murmur hash go deps by @chaokunyang in <a href="https://github.com/apache/fory/pull/3217" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3217</a></li>
<li>feat(compiler): refine generated cpp API by @chaokunyang in <a href="https://github.com/apache/fory/pull/3221" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3221</a></li>
<li>feat(python): refactor cython buffer to use cpp buffer by @chaokunyang in <a href="https://github.com/apache/fory/pull/3219" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3219</a></li>
<li>ci: speed up setup-python on windows by @chaokunyang in <a href="https://github.com/apache/fory/pull/3222" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3222</a></li>
<li>feat(python): add buffer index accessors by @chaokunyang in <a href="https://github.com/apache/fory/pull/3223" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3223</a></li>
<li>feat(xlang/compiler): support shared/circular reference serialization for fory/protobuf/flatbuffer idl by @chaokunyang in <a href="https://github.com/apache/fory/pull/3226" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3226</a></li>
<li>feat(cpp): add polymorphic serialization support for <code>any</code> to compiler by @chaokunyang in <a href="https://github.com/apache/fory/pull/3232" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3232</a></li>
<li>feat(JavaScript): impl xlang writer by @theweipeng in <a href="https://github.com/apache/fory/pull/3234" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3234</a></li>
<li>feat(xlang): support control ref tracking for nested list map elements by @chaokunyang in <a href="https://github.com/apache/fory/pull/3236" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3236</a></li>
<li>feat(compiler): add generated <code>to_bytes/from_bytes</code> methods to generated message/union by @chaokunyang in <a href="https://github.com/apache/fory/pull/3238" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3238</a></li>
<li>refactor(cpp): use snake_case namestyle for cpp by @chaokunyang in <a href="https://github.com/apache/fory/pull/3240" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3240</a></li>
<li>perf(go): optimize go perf by @chaokunyang in <a href="https://github.com/apache/fory/pull/3241" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3241</a></li>
<li>refactor(go): adjust go buffer uint32/64 write/read name style by @chaokunyang in <a href="https://github.com/apache/fory/pull/3242" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3242</a></li>
<li>refactor(compiler): refactor fory compiler command line by @chaokunyang in <a href="https://github.com/apache/fory/pull/3243" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3243</a></li>
<li>feat(compiler): add compatible mode for idl by @chaokunyang in <a href="https://github.com/apache/fory/pull/3245" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3245</a></li>
<li>feat(go): add float16 support to go by @ayush00git in <a href="https://github.com/apache/fory/pull/3235" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3235</a></li>
<li>feat(java): generate java List for primitive array by @chaokunyang in <a href="https://github.com/apache/fory/pull/3247" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3247</a></li>
<li>feat(JavaScript): Impl xlang Map and Collection by @theweipeng in <a href="https://github.com/apache/fory/pull/3249" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3249</a></li>
<li>feat(compiler/runtime): use hash for generated class as id and refactor user type id encoding by @chaokunyang in <a href="https://github.com/apache/fory/pull/3248" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3248</a></li>
<li>refactor(spec): remove language byte from xlang in protocol by @chaokunyang in <a href="https://github.com/apache/fory/pull/3256" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3256</a></li>
<li>refactor(go): move go struct serializer init to struct_init.go by @chaokunyang in <a href="https://github.com/apache/fory/pull/3255" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3255</a></li>
<li>feat(protocol): add float8 and bfloat16 to protocol spec by @chaokunyang in <a href="https://github.com/apache/fory/pull/3259" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3259</a></li>
<li>feat(compiler): add evolution option support by @chaokunyang in <a href="https://github.com/apache/fory/pull/3262" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3262</a></li>
<li>feat(compiler): update toString/<strong>repr</strong>/std::fmt::Debug for generated ref code by @chaokunyang in <a href="https://github.com/apache/fory/pull/3264" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3264</a></li>
<li>perf: optimize schema evolution mode performance by @chaokunyang in <a href="https://github.com/apache/fory/pull/3260" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3260</a></li>
<li>feat(JavaScript): Impl xlang JavaScript testcase by @theweipeng in <a href="https://github.com/apache/fory/pull/3263" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3263</a></li>
<li>feat(compiler): add list keyword for list fields by @chaokunyang in <a href="https://github.com/apache/fory/pull/3295" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3295</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="bug-fix">Bug Fix<a href="https://fory.apache.org/blog/fory_0_15_0_release#bug-fix" class="hash-link" aria-label="Direct link to Bug Fix" title="Direct link to Bug Fix">​</a></h2>
<ul>
<li>fix(docs): fix graalvm link by @chaokunyang in <a href="https://github.com/apache/fory/pull/3056" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3056</a></li>
<li>fix(Rust): prevent obtaining generic type metadata on custom types(struct/enum) by @urlyy in <a href="https://github.com/apache/fory/pull/3057" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3057</a></li>
<li>fix(Rust): Move the calculating of TypeMeta::bytes and TypeMeta::hash ahead of serialization by @urlyy in <a href="https://github.com/apache/fory/pull/3060" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3060</a></li>
<li>fix(java): Better ergonomics for AllowListChecker by @Asuka-star in <a href="https://github.com/apache/fory/pull/3061" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3061</a></li>
<li>fix(rust): output original registered ID in type mismatch error log by @userzhy in <a href="https://github.com/apache/fory/pull/3067" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3067</a></li>
<li>fix(java): Fix CopyOnWriteArrayList field serialization by @vybhavjs in <a href="https://github.com/apache/fory/pull/3079" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3079</a></li>
<li>fix(go): reference tracking fails when &gt;127 objects serialized by @jonyoder in <a href="https://github.com/apache/fory/pull/3086" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3086</a></li>
<li>fix(java): fix abstract enum and abstract array serialization for GraalVM by @chaokunyang in <a href="https://github.com/apache/fory/pull/3095" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3095</a></li>
<li>fix(rust): enable Union type cross-language serialization between Rust and Java by @ariesdevil in <a href="https://github.com/apache/fory/pull/3094" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3094</a></li>
<li>fix: x86 architecture missing from universal2 macOS wheel by @madhavajay in <a href="https://github.com/apache/fory/pull/3114" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3114</a></li>
<li>fix(java): optimize type resolver calls for xlang mode on graalvm by @chaokunyang in <a href="https://github.com/apache/fory/pull/3129" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3129</a></li>
<li>fix(java): stop compilation service when shutdowning compile service by @chaokunyang in <a href="https://github.com/apache/fory/pull/3138" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3138</a></li>
<li>fix(python): fix collection null elements read/write by @chaokunyang in <a href="https://github.com/apache/fory/pull/3149" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3149</a></li>
<li>fix: typo in the xlang_serialization_spec.md by @ayush00git in <a href="https://github.com/apache/fory/pull/3151" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3151</a></li>
<li>fix(java): use littlen endian for utf16 string on big endian by @chaokunyang in <a href="https://github.com/apache/fory/pull/3159" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3159</a></li>
<li>fix(java): fix openj9 sliced string serde by @chaokunyang in <a href="https://github.com/apache/fory/pull/3160" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3160</a></li>
<li>fix(cpp): fix fory cpp compile warnings by @chaokunyang in <a href="https://github.com/apache/fory/pull/3188" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3188</a></li>
<li>fix(cpp): issue 3229 - compile error on gcc16 by @xflcx1991 in <a href="https://github.com/apache/fory/pull/3230" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3230</a></li>
<li>fix(java): fix java ci maven module error by @chaokunyang in <a href="https://github.com/apache/fory/pull/3265" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3265</a></li>
<li>fix(go): prevent panic in readUTF16LE with odd byte counts by @jonyoder in <a href="https://github.com/apache/fory/pull/3293" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3293</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="other-improvements">Other Improvements<a href="https://fory.apache.org/blog/fory_0_15_0_release#other-improvements" class="hash-link" aria-label="Direct link to Other Improvements" title="Direct link to Other Improvements">​</a></h2>
<ul>
<li>chore: bump release version to 0.14.0 by @chaokunyang in <a href="https://github.com/apache/fory/pull/3052" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3052</a></li>
<li>chore: fix benchmark plot by @chaokunyang in <a href="https://github.com/apache/fory/pull/3053" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3053</a></li>
<li>docs: add cpp doc in main readme.md by @chaokunyang in <a href="https://github.com/apache/fory/pull/3055" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3055</a></li>
<li>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 <a href="https://github.com/apache/fory/pull/3065" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3065</a></li>
<li>chore(python): Update badge styles in README.md by @chaokunyang in <a href="https://github.com/apache/fory/pull/3072" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3072</a></li>
<li>chore(rust): revert rust crates version by @ariesdevil in <a href="https://github.com/apache/fory/pull/3075" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3075</a></li>
<li>docs(cpp): Add MSVC compatibility to the CMake sample in the CPP document. by @Eiskomet in <a href="https://github.com/apache/fory/pull/3078" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3078</a></li>
<li>chore: bump release version to 0.14.1 by @chaokunyang in <a href="https://github.com/apache/fory/pull/3096" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3096</a></li>
<li>docs(go): add go serialization doc by @chaokunyang in <a href="https://github.com/apache/fory/pull/3121" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3121</a></li>
<li>docs(go): fix go serialization doc by @chaokunyang in <a href="https://github.com/apache/fory/pull/3125" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3125</a></li>
<li>docs(go): fix broken go doc links by @chaokunyang in <a href="https://github.com/apache/fory/pull/3127" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3127</a></li>
<li>docs(go): add go version requirements by @chaokunyang in <a href="https://github.com/apache/fory/pull/3134" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3134</a></li>
<li>docs(go): add docs for go pkg dev by @chaokunyang in <a href="https://github.com/apache/fory/pull/3135" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3135</a></li>
<li>docs: adjust doc links and sync config by @chaokunyang in <a href="https://github.com/apache/fory/pull/3136" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3136</a></li>
<li>docs: remove redundant prefix doc id by @chaokunyang in <a href="https://github.com/apache/fory/pull/3141" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3141</a></li>
<li>docs: add field configuration doc by @chaokunyang in <a href="https://github.com/apache/fory/pull/3143" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3143</a></li>
<li>docs: fix field type broken links by @chaokunyang in <a href="https://github.com/apache/fory/pull/3146" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3146</a></li>
<li>docs: fix field type meta pos by @chaokunyang in <a href="https://github.com/apache/fory/pull/3147" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3147</a></li>
<li>docs: fix native field type meta doc by @chaokunyang in <a href="https://github.com/apache/fory/pull/3148" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3148</a></li>
<li>chore(java): move java benchmark to bench dir by @chaokunyang in <a href="https://github.com/apache/fory/pull/3152" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3152</a></li>
<li>docs: fix typo and grammar in readme by @Howard-aile in <a href="https://github.com/apache/fory/pull/3156" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3156</a></li>
<li>docs: update agents.md by @chaokunyang in <a href="https://github.com/apache/fory/pull/3162" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3162</a></li>
<li>docs(compiler): update fory compiler doc by @chaokunyang in <a href="https://github.com/apache/fory/pull/3183" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3183</a></li>
<li>docs: fix protobuf docs by @chaokunyang in <a href="https://github.com/apache/fory/pull/3185" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3185</a></li>
<li>docs: add missing protobuf-idl.md by @chaokunyang in <a href="https://github.com/apache/fory/pull/3186" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3186</a></li>
<li>docs(cpp): add cpp polymorphism doc by @chaokunyang in <a href="https://github.com/apache/fory/pull/3187" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3187</a></li>
<li>docs: Fix links in README by @chaokunyang in <a href="https://github.com/apache/fory/pull/3212" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3212</a></li>
<li>chore(java): rename _getTypeResolver to getTypeResolver by @chaokunyang in <a href="https://github.com/apache/fory/pull/3227" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3227</a></li>
<li>chore(cpp): remove unique token from FORY_FIELD_CONFIG by @chaokunyang in <a href="https://github.com/apache/fory/pull/3228" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3228</a></li>
<li>docs(compiler): merge type system doc into schema-idl odc by @chaokunyang in <a href="https://github.com/apache/fory/pull/3258" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3258</a></li>
<li>chore: fix bump version and add rust/comiler auto release by @chaokunyang in <a href="https://github.com/apache/fory/pull/3257" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3257</a></li>
<li>docs: move language impl reference to a new doc by @chaokunyang in <a href="https://github.com/apache/fory/pull/3261" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3261</a></li>
<li>docs(go): add go benchmarks result by @chaokunyang in <a href="https://github.com/apache/fory/pull/3296" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3296</a></li>
<li>chore: speedup windows ci by @chaokunyang in <a href="https://github.com/apache/fory/pull/3297" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3297</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="new-contributors">New Contributors<a href="https://fory.apache.org/blog/fory_0_15_0_release#new-contributors" class="hash-link" aria-label="Direct link to New Contributors" title="Direct link to New Contributors">​</a></h2>
<ul>
<li>@jim-parsons made their first contribution in <a href="https://github.com/apache/fory/pull/3048" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3048</a></li>
<li>@Asuka-star made their first contribution in <a href="https://github.com/apache/fory/pull/3061" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3061</a></li>
<li>@userzhy made their first contribution in <a href="https://github.com/apache/fory/pull/3067" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3067</a></li>
<li>@ariesdevil made their first contribution in <a href="https://github.com/apache/fory/pull/3074" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3074</a></li>
<li>@Eiskomet made their first contribution in <a href="https://github.com/apache/fory/pull/3078" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3078</a></li>
<li>@vybhavjs made their first contribution in <a href="https://github.com/apache/fory/pull/3079" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3079</a></li>
<li>@jonyoder made their first contribution in <a href="https://github.com/apache/fory/pull/3086" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3086</a></li>
<li>@theharsh999 made their first contribution in <a href="https://github.com/apache/fory/pull/3100" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3100</a></li>
<li>@madhavajay made their first contribution in <a href="https://github.com/apache/fory/pull/3114" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3114</a></li>
<li>@Pigsy-Monk made their first contribution in <a href="https://github.com/apache/fory/pull/3115" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3115</a></li>
<li>@ayush00git made their first contribution in <a href="https://github.com/apache/fory/pull/3139" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3139</a></li>
<li>@Howard-aile made their first contribution in <a href="https://github.com/apache/fory/pull/3156" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3156</a></li>
<li>@xflcx1991 made their first contribution in <a href="https://github.com/apache/fory/pull/3230" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3230</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a href="https://github.com/apache/fory/compare/v0.14.1...v0.15.0" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/compare/v0.14.1...v0.15.0</a></p>]]></content>
        <author>
            <name>Shawn Yang</name>
            <uri>https://github.com/chaokunyang</uri>
        </author>
        <category label="fory" term="fory"/>
        <category label="c++" term="c++"/>
        <category label="rust" term="rust"/>
        <category label="java" term="java"/>
        <category label="python" term="python"/>
        <category label="go" term="go"/>
        <category label="compiler" term="compiler"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Fory v0.14.1 Released]]></title>
        <id>https://fory.apache.org/blog/fory_0_14_1_release</id>
        <link href="https://fory.apache.org/blog/fory_0_14_1_release"/>
        <updated>2025-12-26T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[The Apache Fory team is pleased to announce the 0.14.1 release. This is a release that includes 6 PR from 5 distinct contributors. See the Install Page to learn how to get the libraries for your platform.]]></summary>
        <content type="html"><![CDATA[<p>The Apache Fory team is pleased to announce the 0.14.1 release. This is a release that includes <a href="https://github.com/apache/fory/compare/v0.14.0...v0.14.1" target="_blank" rel="noopener noreferrer">6 PR</a> from 5 distinct contributors. See the <a href="https://fury.apache.org/docs/docs/start/install" target="_blank" rel="noopener noreferrer">Install</a> Page to learn how to get the libraries for your platform.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="highlights">Highlights<a href="https://fory.apache.org/blog/fory_0_14_1_release#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights">​</a></h2>
<ul>
<li>feat(rust): add generate_default attr, no longer generate Default by default by @ariesdevil in <a href="https://github.com/apache/fory/pull/3074" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3074</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="features">Features<a href="https://fory.apache.org/blog/fory_0_14_1_release#features" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features">​</a></h2>
<ul>
<li>feat(rust): add generate_default attr, no longer generate Default by default by @ariesdevil in <a href="https://github.com/apache/fory/pull/3074" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3074</a></li>
<li>feat(java): mark createSerializer as public by @chaokunyang</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="bug-fix">Bug Fix<a href="https://fory.apache.org/blog/fory_0_14_1_release#bug-fix" class="hash-link" aria-label="Direct link to Bug Fix" title="Direct link to Bug Fix">​</a></h2>
<ul>
<li>fix(java): Fix CopyOnWriteArrayList field serialization by @vybhavjs in <a href="https://github.com/apache/fory/pull/3079" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3079</a></li>
<li>fix(java): Better ergonomics for AllowListChecker by @Asuka-star in <a href="https://github.com/apache/fory/pull/3061" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3061</a></li>
<li>fix(java): fix read class def when writing classdefs by @chaokunyang in <a href="https://github.com/apache/fory/commit/3ad627c9" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/commit/3ad627c9</a></li>
<li>fix(Rust): Move the calculating of TypeMeta::bytes and TypeMeta::hash ahead of serialization by @urlyy in <a href="https://github.com/apache/fory/pull/3060" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3060</a></li>
<li>fix(Rust): prevent obtaining generic type metadata on custom types(struct/enum) by @urlyy in <a href="https://github.com/apache/fory/pull/3057" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3057</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a href="https://github.com/apache/fory/compare/v0.14.0...v0.14.1" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/compare/v0.14.0...v0.14.1</a></p>]]></content>
        <author>
            <name>Shawn Yang</name>
            <uri>https://github.com/chaokunyang</uri>
        </author>
        <category label="fory" term="fory"/>
        <category label="rust" term="rust"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Fory v0.14.0 Released]]></title>
        <id>https://fory.apache.org/blog/fory_0_14_0_release</id>
        <link href="https://fory.apache.org/blog/fory_0_14_0_release"/>
        <updated>2025-12-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[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.]]></summary>
        <content type="html"><![CDATA[<p>The Apache Fory team is pleased to announce the 0.14.0 release. This is a major release that includes <a href="https://github.com/apache/fory/compare/v0.13.2...v0.14.0" target="_blank" rel="noopener noreferrer">85 PR</a> from 11 distinct contributors. See the <a href="https://fory.apache.org/docs/start/install" target="_blank" rel="noopener noreferrer">Install</a> Page to learn how to get the libraries for your platform.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="highlights">Highlights<a href="https://fory.apache.org/blog/fory_0_14_0_release#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights">​</a></h2>
<ul>
<li><strong>Official C++ Support</strong>: First release of Apache Fory C++ with high-performance object graph serialization, cross-language interoperability, and schema evolution</li>
<li><strong>Row Format &amp; Type System</strong>: New row-oriented format type system across Java, Python, and C++, enabling row-columnar conversions and removing Arrow dependencies</li>
<li><strong>Performance Enhancements</strong>: Significant optimizations across all languages, including thread-local context in Rust and fast flat-int maps for C++ type dispatch</li>
<li><strong>Ecosystem Updates</strong>: Added support for JDK 25 (Java), Go 1.23, and Bazel 8. Python officially marked as stable with improved build parallelism</li>
<li><strong>Advanced Java Features</strong>: GraalVM Native Image support via <code>ForyFeature</code> and optimized serializers for blocking queues and final fields</li>
<li><strong>ObjectStreamSerializer Refactoring</strong>: Refactored <code>ObjectStreamSerializer</code> with meta-shared compatible mode for reduced space cost and improved performance on JDK customized serialization APIs</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="c-first-release-highlights">C++: First Release Highlights<a href="https://fory.apache.org/blog/fory_0_14_0_release#c-first-release-highlights" class="hash-link" aria-label="Direct link to C++: First Release Highlights" title="Direct link to C++: First Release Highlights">​</a></h2>
<p>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.</p>
<p><strong>Key capabilities:</strong></p>
<ul>
<li>Macro-based struct registration via <code>FORY_STRUCT</code> for compile-time type safety</li>
<li>Cross-language serialization with Java, Python, Go, Rust, and JavaScript</li>
<li>Forward/backward compatible schema evolution (Compatible mode)</li>
<li>Reference tracking for shared objects and circular references</li>
<li>Thread-safe and single-threaded (fastest) variants</li>
<li>Comprehensive type support: primitives, <code>std::string</code>, <code>std::vector</code>, <code>std::map</code>, <code>std::set</code>, <code>std::optional</code>, <code>std::shared_ptr</code>, <code>std::unique_ptr</code>, <code>std::variant</code>, and temporal types</li>
<li>Zero-copy Row format for analytics workloads with random field access</li>
<li>CMake (FetchContent) and Bazel build system support</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="quick-start">Quick Start<a href="https://fory.apache.org/blog/fory_0_14_0_release#quick-start" class="hash-link" aria-label="Direct link to Quick Start" title="Direct link to Quick Start">​</a></h3>
<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token macro property directive-hash" style="color:#36acaa">#</span><span class="token macro property directive keyword" style="color:#00009f">include</span><span class="token macro property" style="color:#36acaa"> </span><span class="token macro property string" style="color:#e3116c">"fory/serialization/fory.h"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">using</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">namespace</span><span class="token plain"> fory</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">serialization</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token class-name">Person</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">string name</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">int32_t</span><span class="token plain"> age</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">vector</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">string</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> hobbies</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">FORY_STRUCT</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Person</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> name</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> age</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> hobbies</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">int</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">main</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">auto</span><span class="token plain"> fory </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Fory</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">builder</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">xlang</span><span class="token punctuation" style="color:#393A34">(</span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">       </span><span class="token comment" style="color:#999988;font-style:italic">// Enable cross-language mode</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">track_ref</span><span class="token punctuation" style="color:#393A34">(</span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Disable ref tracking for simple types</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">build</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token generic-function function" style="color:#d73a49">register_struct</span><span class="token generic-function generic class-name operator" style="color:#393A34">&lt;</span><span class="token generic-function generic class-name">Person</span><span class="token generic-function generic class-name operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  Person person</span><span class="token punctuation" style="color:#393A34">{</span><span class="token string" style="color:#e3116c">"Alice"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">30</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token string" style="color:#e3116c">"reading"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"coding"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">auto</span><span class="token plain"> bytes </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">serialize</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">person</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">value</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  Person decoded </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token generic-function function" style="color:#d73a49">deserialize</span><span class="token generic-function generic class-name operator" style="color:#393A34">&lt;</span><span class="token generic-function generic class-name">Person</span><span class="token generic-function generic class-name operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">bytes</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">value</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// person == decoded</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<ul>
<li>Guide: C++ Serialization – <a href="https://fory.apache.org/docs/docs/guide/cpp/" target="_blank" rel="noopener noreferrer">https://fory.apache.org/docs/docs/guide/cpp/</a></li>
<li>Examples: <a href="https://github.com/apache/fory/tree/main/examples/cpp/hello_world" target="_blank" rel="noopener noreferrer">hello_world</a>, <a href="https://github.com/apache/fory/tree/main/examples/cpp/hello_row" target="_blank" rel="noopener noreferrer">hello_row</a></li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="c-benchmarks">C++ Benchmarks<a href="https://fory.apache.org/blog/fory_0_14_0_release#c-benchmarks" class="hash-link" aria-label="Direct link to C++ Benchmarks" title="Direct link to C++ Benchmarks">​</a></h3>
<img src="https://fory.apache.org/img/benchmarks/cpp/throughput.png" width="90%">
<p>Below are timing results (nanoseconds; lower is better) comparing Fory with Protobuf across different data structures.</p>
<table><thead><tr><th>Datatype</th><th>Operation</th><th>Fory (ns)</th><th>Protobuf (ns)</th><th>Faster</th></tr></thead><tbody><tr><td>MediaContent</td><td>Serialize</td><td>414</td><td>2,046</td><td>Fory (4.9x)</td></tr><tr><td>MediaContent</td><td>Deserialize</td><td>1,361</td><td>2,890</td><td>Fory (2.1x)</td></tr><tr><td>Sample</td><td>Serialize</td><td>210</td><td>307</td><td>Fory (1.5x)</td></tr><tr><td>Sample</td><td>Deserialize</td><td>1,061</td><td>1,500</td><td>Fory (1.4x)</td></tr><tr><td>Struct</td><td>Serialize</td><td>51</td><td>181</td><td>Fory (3.5x)</td></tr><tr><td>Struct</td><td>Deserialize</td><td>136</td><td>170</td><td>Fory (1.3x)</td></tr></tbody></table>
<p>Note: Results depend on hardware and implementation versions. See the C++ benchmark guide for how to run benchmarks yourself: <a href="https://github.com/apache/fory/tree/main/benchmarks/cpp_benchmark" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/tree/main/benchmarks/cpp_benchmark</a></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="features">Features<a href="https://fory.apache.org/blog/fory_0_14_0_release#features" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features">​</a></h2>
<ul>
<li>feat(python): add raw method to buffer object by @chaokunyang in <a href="https://github.com/apache/fory/pull/2875" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2875</a></li>
<li>feat(rust): add duration serializer support by @chaokunyang in <a href="https://github.com/apache/fory/pull/2878" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2878</a></li>
<li>feat(rust): add typename to unregistered error message by @chaokunyang in <a href="https://github.com/apache/fory/pull/2881" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2881</a></li>
<li>perf(rust): support criterion profiler to generate flamegraph by @chaokunyang in <a href="https://github.com/apache/fory/pull/2882" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2882</a></li>
<li>refactor(rust): merge fory_debug into fory macro attr by @chaokunyang in <a href="https://github.com/apache/fory/pull/2883" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2883</a></li>
<li>feat(rust): direct derive primitve write/read by @chaokunyang in <a href="https://github.com/apache/fory/pull/2890" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2890</a></li>
<li>perf(rust): optimize buffer write read perf by @chaokunyang in <a href="https://github.com/apache/fory/pull/2892" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2892</a></li>
<li>feat(Rust): Support u128 &amp; u128_array by @urlyy in <a href="https://github.com/apache/fory/pull/2899" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2899</a></li>
<li>feat(c++): implement fory cpp object graph serialization framework by @chaokunyang in <a href="https://github.com/apache/fory/pull/2908" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2908</a></li>
<li>feat(python): pure python row-columar convert by @chaokunyang in <a href="https://github.com/apache/fory/pull/2919" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2919</a></li>
<li>feat(c++): implement xlang serialization for c++ by @chaokunyang in <a href="https://github.com/apache/fory/pull/2925" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2925</a></li>
<li>feat(c++/python): add row format schema and remove arrow dependency by @chaokunyang in <a href="https://github.com/apache/fory/pull/2928" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2928</a></li>
<li>feat(java): implement fory row format type system by @chaokunyang in <a href="https://github.com/apache/fory/pull/2931" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2931</a></li>
<li>feat(python): implement cython bazel build directly without 3rd deps by @chaokunyang in <a href="https://github.com/apache/fory/pull/2936" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2936</a></li>
<li>feat(c+/python): upgrade bazel to bazel8 by @chaokunyang in <a href="https://github.com/apache/fory/pull/2937" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2937</a></li>
<li>feat(java/python/c++): add schema encoder and remove arrow serializers by @chaokunyang in <a href="https://github.com/apache/fory/pull/2938" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2938</a></li>
<li>feat(c++): check max dyn depth when deserializing polymorphic types by @chaokunyang in <a href="https://github.com/apache/fory/pull/2939" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2939</a></li>
<li>feat(c++): add cmake build support and add cpp examples by @chaokunyang in <a href="https://github.com/apache/fory/pull/2942" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2942</a></li>
<li>feat(c++ ): add cpp benchmark by @chaokunyang in <a href="https://github.com/apache/fory/pull/2943" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2943</a></li>
<li>perf(rust): use segmented pool to reduce contention of fory pool by @chaokunyang in <a href="https://github.com/apache/fory/pull/2945" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2945</a></li>
<li>perf(rust): use thread local to manage fory rust WriteContext/ReadContext by @chaokunyang in <a href="https://github.com/apache/fory/pull/2946" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2946</a></li>
<li>feat(rust): add fory config for rust by @chaokunyang in <a href="https://github.com/apache/fory/pull/2947" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2947</a></li>
<li>perf(c++): optimize cpp serialization performance by @chaokunyang in <a href="https://github.com/apache/fory/pull/2944" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2944</a></li>
<li>perf(c++): remove shared_ptr from type info to reduce atomic counter cost by @chaokunyang in <a href="https://github.com/apache/fory/pull/2951" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2951</a></li>
<li>feat: refine python module check by @chaokunyang in <a href="https://github.com/apache/fory/pull/2952" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2952</a></li>
<li>feat(java): support jdk 25 by @chaokunyang in <a href="https://github.com/apache/fory/pull/2954" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2954</a></li>
<li>feat(java): add optimized serializers for blocking queues by @zhan7236 in <a href="https://github.com/apache/fory/pull/2955" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2955</a></li>
<li>perf(c++): directly error set instead of result to reduce cost on hotpath by @chaokunyang in <a href="https://github.com/apache/fory/pull/2959" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2959</a></li>
<li>perf(c++): optimize primitive struct fields read performance by @chaokunyang in <a href="https://github.com/apache/fory/pull/2960" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2960</a></li>
<li>feat(java): implement FinalFieldReplaceResolveSerializer for final fields with writeReplace/readResolve methods by @mchernyakov in <a href="https://github.com/apache/fory/pull/2917" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2917</a></li>
<li>perf(c++): add mac profile script for c++ by @chaokunyang in <a href="https://github.com/apache/fory/pull/2962" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2962</a></li>
<li>perf(c++): fair benchmark for cpp by @chaokunyang in <a href="https://github.com/apache/fory/pull/2963" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2963</a></li>
<li>perf(c++): optimize type dispatch performance by a fast flat-int map by @chaokunyang in <a href="https://github.com/apache/fory/pull/2966" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2966</a></li>
<li>perf(c++): add media content benchmark by @chaokunyang in <a href="https://github.com/apache/fory/pull/2968" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2968</a></li>
<li>feat(c++): support polymorphic collection elements serialization by @chaokunyang in <a href="https://github.com/apache/fory/pull/2974" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2974</a></li>
<li>feat(c++): add cpp tuple serializer by @chaokunyang in <a href="https://github.com/apache/fory/pull/2975" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2975</a></li>
<li>refactor(xlang): use 0 for unknow type id by @chaokunyang in <a href="https://github.com/apache/fory/pull/2985" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2985</a></li>
<li>feat(java): Add ForyFeature for GraalVM Native Image by @mengnankkkk in <a href="https://github.com/apache/fory/pull/2701" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2701</a></li>
<li>feat(c++): support container xlang serialization with polymorphic elements by @chaokunyang in <a href="https://github.com/apache/fory/pull/2980" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2980</a></li>
<li>feat(python): parallel python wheel build by @chaokunyang in <a href="https://github.com/apache/fory/pull/2989" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2989</a></li>
<li>perf(c++): improve the serialization performance of array/collection by @LiangliangSui in <a href="https://github.com/apache/fory/pull/2986" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2986</a></li>
<li>feat(go): upgrade go to to 1.23 by @chaokunyang in <a href="https://github.com/apache/fory/pull/2995" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2995</a></li>
<li>perf(c++): centralize error state in context for faster serialization by @chaokunyang in <a href="https://github.com/apache/fory/pull/3009" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3009</a></li>
<li>refactor(go): redesign serialization implementation with performance and usability improvements by @chaokunyang in <a href="https://github.com/apache/fory/pull/2998" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2998</a></li>
<li>refactor(rust): merge rust type layer into TypeMeta by @chaokunyang in <a href="https://github.com/apache/fory/pull/3019" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3019</a></li>
<li>ci: remove macos x86 CI for Python by @chaokunyang in <a href="https://github.com/apache/fory/pull/3023" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3023</a></li>
<li>feat(c++): support unsigned type for cpp by @chaokunyang in <a href="https://github.com/apache/fory/pull/3022" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3022</a></li>
<li>feat(c++): support variant-based union type serialization for c++ by @chaokunyang in <a href="https://github.com/apache/fory/pull/3032" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3032</a></li>
<li>feat(java): refactor ObjectStreamSerializer to use meta shared compatible serializer by @chaokunyang in <a href="https://github.com/apache/fory/pull/3034" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3034</a></li>
<li>feat(java): separate user register type id with fory registered type id by @chaokunyang in <a href="https://github.com/apache/fory/pull/3035" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3035</a></li>
<li>feat(): add c++ user guide doc by @chaokunyang in <a href="https://github.com/apache/fory/pull/3037" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3037</a></li>
<li>refactor(c++/rust): refine c++ serialize_to API by @chaokunyang in <a href="https://github.com/apache/fory/pull/3045" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3045</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="bug-fix">Bug Fix<a href="https://fory.apache.org/blog/fory_0_14_0_release#bug-fix" class="hash-link" aria-label="Direct link to Bug Fix" title="Direct link to Bug Fix">​</a></h2>
<ul>
<li>fix(Rust): fix Binary implementation by @urlyy in <a href="https://github.com/apache/fory/pull/2902" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2902</a></li>
<li>fix(rust): fix array field support by @chaokunyang in <a href="https://github.com/apache/fory/pull/2933" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2933</a></li>
<li>fix(rust): raise error for nested polymorphics for collection by @chaokunyang in <a href="https://github.com/apache/fory/pull/2934" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2934</a></li>
<li>fix(kotlin): support Kotlin field with Java reserved world by @chaokunyang in <a href="https://github.com/apache/fory/pull/2948" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2948</a></li>
<li>fix(java): handle TypeVariable in row format type inference by @chaokunyang in <a href="https://github.com/apache/fory/pull/2949" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2949</a></li>
<li>fix(java): use single quotes in Python command for Windows compatibility by @zhan7236 in <a href="https://github.com/apache/fory/pull/2953" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2953</a></li>
<li>fix(java): fix race condition in blocking queue serializers by @zhan7236 in <a href="https://github.com/apache/fory/pull/2956" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2956</a></li>
<li>fix(cpp): fix the type error by @LiangliangSui in <a href="https://github.com/apache/fory/pull/2961" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2961</a></li>
<li>fix(go): fix struct value reference tracking bug by @chaokunyang in <a href="https://github.com/apache/fory/pull/2991" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2991</a></li>
<li>fix(java): support serialization of CopyOnWriteArraySet by @LiangliangSui in <a href="https://github.com/apache/fory/pull/2999" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2999</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="other-improvements">Other Improvements<a href="https://fory.apache.org/blog/fory_0_14_0_release#other-improvements" class="hash-link" aria-label="Direct link to Other Improvements" title="Direct link to Other Improvements">​</a></h2>
<ul>
<li>docs: fix broken table in in java_serialization_guide.md by @mosinnik in <a href="https://github.com/apache/fory/pull/2876" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2876</a></li>
<li>chore(rust): fix tuple test comment by @chaokunyang in <a href="https://github.com/apache/fory/pull/2877" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2877</a></li>
<li>docs(rust): remove redundant doc for shared reference by @chaokunyang in <a href="https://github.com/apache/fory/pull/2879" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2879</a></li>
<li>chore(Java): Update java quickstart doc, for note register order-sensitive by @moooonk in <a href="https://github.com/apache/fory/pull/2837" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2837</a></li>
<li>chore(CI): Add caching for bazel in github workflows by @prakash-218 in <a href="https://github.com/apache/fory/pull/2888" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2888</a></li>
<li>chore(CI): Fix cache with symlinks by @prakash-218 in <a href="https://github.com/apache/fory/pull/2893" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2893</a></li>
<li>chore: move benchmarks to separate dir to speed up ci build by @chaokunyang in <a href="https://github.com/apache/fory/pull/2894" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2894</a></li>
<li>docs: fix rust benchmark links by @chaokunyang in <a href="https://github.com/apache/fory/pull/2896" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2896</a></li>
<li>docs: fix cargo benchmark comand in doc by @chaokunyang in <a href="https://github.com/apache/fory/pull/2897" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2897</a></li>
<li>chore: bump release version to 0.13.1 by @chaokunyang in <a href="https://github.com/apache/fory/pull/2901" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2901</a></li>
<li>docs(java): add logging section by @mosinnik in <a href="https://github.com/apache/fory/pull/2905" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2905</a></li>
<li>chore(c++): remove cpp benchmarks by @chaokunyang in <a href="https://github.com/apache/fory/pull/2926" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2926</a></li>
<li>chore(c++): move meta string to meta dir by @chaokunyang in <a href="https://github.com/apache/fory/pull/2940" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2940</a></li>
<li>docs: remove unused type mappings for arrow types by @chaokunyang in <a href="https://github.com/apache/fory/pull/2964" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2964</a></li>
<li>chore: Remove the content related to arrow. by @LiangliangSui in <a href="https://github.com/apache/fory/pull/2965" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2965</a></li>
<li>chore(c++): move common macro into macros.h by @chaokunyang in <a href="https://github.com/apache/fory/pull/2970" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2970</a></li>
<li>docs: Update Bazel version in README.md by @chaokunyang in <a href="https://github.com/apache/fory/pull/2971" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2971</a></li>
<li>docs: refine xlang spec documentation by @chaokunyang in <a href="https://github.com/apache/fory/pull/2979" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2979</a></li>
<li>docs: Refine metadata packing and automatic type mapping by @chaokunyang in <a href="https://github.com/apache/fory/pull/2984" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2984</a></li>
<li>ci: add workflow to remove HTML comments from PR body by @chaokunyang in <a href="https://github.com/apache/fory/pull/2983" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2983</a></li>
<li>docs: Update xlang_serialization_spec.md by @chaokunyang in <a href="https://github.com/apache/fory/pull/2987" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2987</a></li>
<li>docs: update the C++ benchmark case by @LiangliangSui in <a href="https://github.com/apache/fory/pull/2988" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2988</a></li>
<li>chore(deps): bump gopkg.in/yaml.v3 from 3.0.0-20200313102051-9f266ea9e77c to 3.0.1 in /go/fory by @dependabot[bot] in <a href="https://github.com/apache/fory/pull/2996" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2996</a></li>
<li>chore: bump release version to 0.13.2 by @chaokunyang in <a href="https://github.com/apache/fory/pull/2997" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2997</a></li>
<li>chore(python): mark pyfory as stable by @chaokunyang in <a href="https://github.com/apache/fory/pull/3001" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3001</a></li>
<li>docs(c++): add cpp bazel example and add ci by @chaokunyang in <a href="https://github.com/apache/fory/pull/3033" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3033</a></li>
<li>docs: refactor user guide docs by @chaokunyang in <a href="https://github.com/apache/fory/pull/3036" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3036</a></li>
<li>docs: add scala and kotlin docs by @chaokunyang in <a href="https://github.com/apache/fory/pull/3040" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3040</a></li>
<li>docs: refactor xlang docs by @chaokunyang in <a href="https://github.com/apache/fory/pull/3041" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3041</a></li>
<li>docs: add row format spec by @chaokunyang in <a href="https://github.com/apache/fory/pull/3042" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3042</a></li>
<li>docs: fix sidebar position by @chaokunyang in <a href="https://github.com/apache/fory/pull/3043" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3043</a></li>
<li>docs: remove copy rust/python docs by @chaokunyang in <a href="https://github.com/apache/fory/pull/3044" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/3044</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="new-contributors">New Contributors<a href="https://fory.apache.org/blog/fory_0_14_0_release#new-contributors" class="hash-link" aria-label="Direct link to New Contributors" title="Direct link to New Contributors">​</a></h2>
<ul>
<li>@mosinnik made their first contribution in <a href="https://github.com/apache/fory/pull/2876" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2876</a></li>
<li>@prakash-218 made their first contribution in <a href="https://github.com/apache/fory/pull/2888" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2888</a></li>
<li>@zhan7236 made their first contribution in <a href="https://github.com/apache/fory/pull/2953" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2953</a></li>
<li>@mchernyakov made their first contribution in <a href="https://github.com/apache/fory/pull/2917" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2917</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a href="https://github.com/apache/fory/compare/v0.13.2...v0.14.0" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/compare/v0.13.2...v0.14.0</a></p>]]></content>
        <author>
            <name>Shawn Yang</name>
            <uri>https://github.com/chaokunyang</uri>
        </author>
        <category label="fory" term="fory"/>
        <category label="c++" term="c++"/>
        <category label="rust" term="rust"/>
        <category label="java" term="java"/>
        <category label="python" term="python"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Fory v0.13.2 Released]]></title>
        <id>https://fory.apache.org/blog/fory_0_13_2_release</id>
        <link href="https://fory.apache.org/blog/fory_0_13_2_release"/>
        <updated>2025-12-05T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[The Apache Fory team is pleased to announce the 0.13.2 release. This is a release that includes 25 PR from 4 distinct contributors. See the Install Page to learn how to get the libraries for your platform.]]></summary>
        <content type="html"><![CDATA[<p>The Apache Fory team is pleased to announce the 0.13.2 release. This is a release that includes <a href="https://github.com/apache/fory/compare/v0.13.1...v0.13.2" target="_blank" rel="noopener noreferrer">25 PR</a> from 4 distinct contributors. See the <a href="https://fury.apache.org/docs/docs/start/install" target="_blank" rel="noopener noreferrer">Install</a> Page to learn how to get the libraries for your platform.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="highlights">Highlights<a href="https://fory.apache.org/blog/fory_0_13_2_release#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights">​</a></h2>
<ul>
<li>perf(rust): use thread local to manage fory rust WriteContext/ReadContext by @chaokunyang in
<a href="https://github.com/apache/fory/pull/2946" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2946</a></li>
<li>feat(rust): add typename to unregistered error message by @chaokunyang in <a href="https://github.com/apache/fory/pull/2881" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2881</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="features">Features<a href="https://fory.apache.org/blog/fory_0_13_2_release#features" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features">​</a></h2>
<ul>
<li>feat(rust): add fory config for rust by @chaokunyang in <a href="https://github.com/apache/fory/pull/2947" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2947</a></li>
<li>perf(rust): use thread local to manage fory rust WriteContext/ReadContext by @chaokunyang in
<a href="https://github.com/apache/fory/pull/2946" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2946</a></li>
<li>perf(rust): use segmented pool to reduce contention of fory pool by @chaokunyang in
<a href="https://github.com/apache/fory/pull/2945" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2945</a></li>
<li>feat(Rust): Support u128 &amp; u128_array by @urlyy in <a href="https://github.com/apache/fory/pull/2899" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2899</a></li>
<li>perf(rust): optimize buffer write read perf by @chaokunyang in <a href="https://github.com/apache/fory/pull/2892" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2892</a></li>
<li>feat(rust): direct derive primitve write/read by @chaokunyang in <a href="https://github.com/apache/fory/pull/2890" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2890</a></li>
<li>refactor(rust): merge fory_debug into fory macro attr by @chaokunyang in <a href="https://github.com/apache/fory/pull/2883" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2883</a></li>
<li>perf(rust): support criterion profiler to generate flamegraph by @chaokunyang in
<a href="https://github.com/apache/fory/pull/2882" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2882</a></li>
<li>feat(rust): add typename to unregistered error message by @chaokunyang in <a href="https://github.com/apache/fory/pull/2881" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2881</a></li>
<li>feat(rust): add duration serializer support by @chaokunyang in <a href="https://github.com/apache/fory/pull/2878" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2878</a></li>
<li>feat(python): add raw method to buffer object by @chaokunyang in <a href="https://github.com/apache/fory/pull/2875" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2875</a></li>
<li>feat: refine python module check by @chaokunyang in <a href="https://github.com/apache/fory/pull/2952" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2952</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="bug-fix">Bug Fix<a href="https://fory.apache.org/blog/fory_0_13_2_release#bug-fix" class="hash-link" aria-label="Direct link to Bug Fix" title="Direct link to Bug Fix">​</a></h2>
<ul>
<li>fix(kotlin): support Kotlin field with Java reserved world by @chaokunyang in
<a href="https://github.com/apache/fory/pull/2948" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2948</a></li>
<li>fix(rust): raise error for nested polymorphics for collection by @chaokunyang in
<a href="https://github.com/apache/fory/pull/2934" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2934</a></li>
<li>fix(rust): fix array field support by @chaokunyang in <a href="https://github.com/apache/fory/pull/2933" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2933</a></li>
<li>fix(Rust): fix Binary implementation by @urlyy in <a href="https://github.com/apache/fory/pull/2902" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2902</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="other-improvements">Other Improvements<a href="https://fory.apache.org/blog/fory_0_13_2_release#other-improvements" class="hash-link" aria-label="Direct link to Other Improvements" title="Direct link to Other Improvements">​</a></h2>
<ul>
<li>docs(java): add logging section by @mosinnik in <a href="https://github.com/apache/fory/pull/2905" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2905</a></li>
<li>docs: fix cargo benchmark comand in doc by @chaokunyang in <a href="https://github.com/apache/fory/pull/2897" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2897</a></li>
<li>chore: move benchmarks to separate dir to speed up ci build by @chaokunyang in
<a href="https://github.com/apache/fory/pull/2894" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2894</a></li>
<li>chore(CI): Fix cache with symlinks by @PrakashRaj-GK in <a href="https://github.com/apache/fory/pull/2893" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2893</a></li>
<li>chore(CI): Add caching for bazel in github workflows by @PrakashRaj-GK in <a href="https://github.com/apache/fory/pull/2888" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2888</a></li>
<li>chore(Java): Update java quickstart doc, for note register order-sensitive by @monk in
<a href="https://github.com/apache/fory/pull/2837" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2837</a></li>
<li>docs(rust): remove redundant doc for shared reference by @chaokunyang in <a href="https://github.com/apache/fory/pull/2879" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2879</a></li>
<li>chore(rust): fix tuple test comment by @chaokunyang in <a href="https://github.com/apache/fory/pull/2877" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2877</a></li>
<li>docs: fix broken table in in java_serialization_guide.md by @mosinnik in <a href="https://github.com/apache/fory/pull/2876" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2876</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a href="https://github.com/apache/fory/compare/v0.13.1...v0.13.2" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/compare/v0.13.1...v0.13.2</a></p>]]></content>
        <author>
            <name>Shawn Yang</name>
            <uri>https://github.com/chaokunyang</uri>
        </author>
        <category label="fory" term="fory"/>
        <category label="rust" term="rust"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Fory v0.13.1 Released]]></title>
        <id>https://fory.apache.org/blog/fory_0_13_1_release</id>
        <link href="https://fory.apache.org/blog/fory_0_13_1_release"/>
        <updated>2025-11-06T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[The Apache Fory team is pleased to announce the 0.13.1 release. This is a release that includes 28 PR from 11 distinct contributors. See the Install Page to learn how to get the libraries for your platform.]]></summary>
        <content type="html"><![CDATA[<p>The Apache Fory team is pleased to announce the 0.13.1 release. This is a release that includes <a href="https://github.com/apache/fory/compare/v0.13.0...v0.13.1" target="_blank" rel="noopener noreferrer">28 PR</a> from 11 distinct contributors. See the <a href="https://fury.apache.org/docs/docs/start/install" target="_blank" rel="noopener noreferrer">Install</a> Page to learn how to get the libraries for your platform.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="highlights">Highlights<a href="https://fory.apache.org/blog/fory_0_13_1_release#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights">​</a></h2>
<ul>
<li>Support rust enum variant and schema evolution for tuple/struct style enum</li>
<li>Support rust tuple serialization and schema evolution</li>
<li>Support rust skip macro attributes</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="enum-schema-evolution">Enum Schema Evolution<a href="https://fory.apache.org/blog/fory_0_13_1_release#enum-schema-evolution" class="hash-link" aria-label="Direct link to Enum Schema Evolution" title="Direct link to Enum Schema Evolution">​</a></h3>
<p>Fory v0.13.1 adds comprehensive enum schema evolution in Compatible mode, supporting all three variant types (Unit, Unnamed, Named):</p>
<ul>
<li><strong>Add/remove variants</strong>: Unknown variants fall back to <code>#[fory(default)]</code></li>
<li><strong>Add/remove fields</strong>: Named variants support field evolution with automatic defaults</li>
<li><strong>Modify elements</strong>: Unnamed variants handle element count changes (extras skipped, missing use defaults)</li>
<li><strong>Variant type changes</strong>: Convert between Unit/Unnamed/Named with automatic default values</li>
</ul>
<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Version 1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token attribute attr-name" style="color:#00a4db">#[derive(ForyObject)]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">enum</span><span class="token plain"> </span><span class="token type-definition class-name">Command</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token attribute attr-name" style="color:#00a4db">#[fory(default)]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token class-name">Noop</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token class-name">Execute</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> args</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">i32</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Version 2 - Added field and new variant</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// both `fory(default)` and standard `default` are supported</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token attribute attr-name" style="color:#00a4db">#[derive(Default, ForyObject)]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">enum</span><span class="token plain"> </span><span class="token type-definition class-name">Command</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token attribute attr-name" style="color:#00a4db">#[default]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token class-name">Noop</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token class-name">Execute</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> args</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">i32</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> env</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Added 'env'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token class-name">Cancel</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> reason</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// New variant</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// V1→V2: Missing 'env' gets default ""; Cancel→Noop fallback in V1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// V2→V1: Extra 'env' skipped; Cancel→Noop fallback</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="tuple-schema-evolution">Tuple Schema Evolution<a href="https://fory.apache.org/blog/fory_0_13_1_release#tuple-schema-evolution" class="hash-link" aria-label="Direct link to Tuple Schema Evolution" title="Direct link to Tuple Schema Evolution">​</a></h3>
<p>Tuples (1-22 elements) now support length evolution in Compatible mode:</p>
<ul>
<li><strong>Length changes</strong>: Grow or shrink tuple size (missing elements get defaults, extras discarded)</li>
<li><strong>Collections</strong>: <code>Vec</code>, <code>HashMap</code>, <code>HashSet</code> elements fully supported</li>
<li><strong>Nested tuples</strong>: Multi-level nesting with independent evolution per level</li>
<li><strong>Smart pointers</strong>: <code>Option</code>, <code>Arc</code>, <code>Rc</code> wrapped elements handle evolution correctly</li>
<li><strong>Struct fields</strong>: Tuple fields in structs evolve independently</li>
</ul>
<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> fory </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Fory</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">default</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">compatible</span><span class="token punctuation" style="color:#393A34">(</span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Serialize 2-element tuple</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> short </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">42i32</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"hello"</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">to_string</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> bin </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">serialize</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">short</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">unwrap</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Deserialize as 4-element tuple - extras get defaults</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> long</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">i32</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">f64</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">bool</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">deserialize</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">bin</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">unwrap</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token macro property" style="color:#36acaa">assert_eq!</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">long</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">42</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"hello"</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">to_string</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Reverse: 4→2 elements, extras discarded</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> long </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">100i32</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"world"</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">to_string</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3.14</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> bin </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">serialize</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">long</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">unwrap</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> short</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">i32</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">deserialize</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">bin</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">unwrap</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token macro property" style="color:#36acaa">assert_eq!</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">short</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">100</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"world"</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">to_string</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="features">Features<a href="https://fory.apache.org/blog/fory_0_13_1_release#features" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features">​</a></h2>
<ul>
<li>feat(rust): add rust benchmark report script and result by @chaokunyang in <a href="https://github.com/apache/fory/pull/2835" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2835</a></li>
<li>feat(rust): rust benchmark print serialized data size by @chaokunyang in <a href="https://github.com/apache/fory/pull/2845" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2845</a></li>
<li>feat(rust): Support rust tagged union enum by @urlyy in <a href="https://github.com/apache/fory/pull/2855" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2855</a></li>
<li>feat(rust): support unsigned number for rust by @chaokunyang in <a href="https://github.com/apache/fory/pull/2857" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2857</a></li>
<li>feat(rust): support rust tuple serialization and schema evolution by @chaokunyang in <a href="https://github.com/apache/fory/pull/2858" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2858</a></li>
<li>feat(go): implement new field ordering and type hash algorithm by @ThisingL in <a href="https://github.com/apache/fory/pull/2868" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2868</a></li>
<li>feat: support fory skip macro attributes(#2864) by @kitty-eu-org in <a href="https://github.com/apache/fory/pull/2865" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2865</a></li>
<li>feat(Rust): Support usize by @urlyy in <a href="https://github.com/apache/fory/pull/2870" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2870</a></li>
<li>feat(rust): make whether write type/ref compile-time evaluation by @chaokunyang in <a href="https://github.com/apache/fory/pull/2871" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2871</a></li>
<li>feat(rust): add array support for rust by @chaokunyang in <a href="https://github.com/apache/fory/pull/2874" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2874</a></li>
<li>feat(rust): support enum variant for schema evolution mode by @chaokunyang in <a href="https://github.com/apache/fory/pull/2873" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2873</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="bug-fix">Bug Fix<a href="https://fory.apache.org/blog/fory_0_13_1_release#bug-fix" class="hash-link" aria-label="Direct link to Bug Fix" title="Direct link to Bug Fix">​</a></h2>
<ul>
<li>fix: fix 0.14.0 snapshot version by @chaokunyang in <a href="https://github.com/apache/fory/pull/2842" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2842</a></li>
<li>fix(java): setting the ForyJitCompilerThreadFactory to produce daemon threads by @coderunner234 in <a href="https://github.com/apache/fory/pull/2869" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2869</a></li>
<li>fix: modify the depth setting in Fory to prevent duplicate registrations. by @mengnankkkk in <a href="https://github.com/apache/fory/pull/2852" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2852</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="other-improvements">Other Improvements<a href="https://fory.apache.org/blog/fory_0_13_1_release#other-improvements" class="hash-link" aria-label="Direct link to Other Improvements" title="Direct link to Other Improvements">​</a></h2>
<ul>
<li>docs(rust): update rust benchmark report table by @chaokunyang in <a href="https://github.com/apache/fory/pull/2836" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2836</a></li>
<li>chore(rust): update cargo toml for publish by @chaokunyang in <a href="https://github.com/apache/fory/pull/2838" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2838</a></li>
<li>chore: bump release version to 0.13.0 by @chaokunyang in <a href="https://github.com/apache/fory/pull/2841" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2841</a></li>
<li>docs: fix doc sync dest by @chaokunyang in <a href="https://github.com/apache/fory/pull/2839" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2839</a></li>
<li>docs: refactor readme by @chaokunyang in <a href="https://github.com/apache/fory/pull/2843" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2843</a></li>
<li>docs: add AGENTS to readme by @chaokunyang in <a href="https://github.com/apache/fory/pull/2844" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2844</a></li>
<li>chore: remove agents from main readme by @chaokunyang in <a href="https://github.com/apache/fory/pull/2846" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2846</a></li>
<li>docs: update readme by @chaokunyang in <a href="https://github.com/apache/fory/pull/2847" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2847</a></li>
<li>docs: fix xlang type mapping link by @chaokunyang in <a href="https://github.com/apache/fory/pull/2848" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2848</a></li>
<li>chore(Java): Make RustXlangTest cases independent from each other by @urlyy in <a href="https://github.com/apache/fory/pull/2834" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2834</a></li>
<li>chore(java): Remove print property names by @Danden1 in <a href="https://github.com/apache/fory/pull/2860" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2860</a></li>
<li>chore(python): add py3.13 release flag by @chaokunyang in <a href="https://github.com/apache/fory/pull/2872" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2872</a></li>
<li>chore(rust): add tests to use #[derive(ForyObject)] in macro_rules! by @REASY in <a href="https://github.com/apache/fory/pull/2867" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2867</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="new-contributors">New Contributors<a href="https://fory.apache.org/blog/fory_0_13_1_release#new-contributors" class="hash-link" aria-label="Direct link to New Contributors" title="Direct link to New Contributors">​</a></h2>
<ul>
<li>@Danden1 made their first contribution in <a href="https://github.com/apache/fory/pull/2860" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2860</a></li>
<li>@coderunner234 made their first contribution in <a href="https://github.com/apache/fory/pull/2869" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2869</a></li>
<li>@REASY made their first contribution in <a href="https://github.com/apache/fory/pull/2867" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2867</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a href="https://github.com/apache/fory/compare/v0.13.0...v0.13.1" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/compare/v0.13.0...v0.13.1</a></p>]]></content>
        <author>
            <name>Shawn Yang</name>
            <uri>https://github.com/chaokunyang</uri>
        </author>
        <category label="fory" term="fory"/>
        <category label="rust" term="rust"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Introducing Apache Fory™ Rust: A Versatile Serialization Framework for the Modern Age]]></title>
        <id>https://fory.apache.org/blog/fory_rust_versatile_serialization_framework</id>
        <link href="https://fory.apache.org/blog/fory_rust_versatile_serialization_framework"/>
        <updated>2025-10-29T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[TL;DR: Apache Fory Rust is a blazingly-fast, cross-language serialization framework that delivers ultra-fast serialization performance while automatically handling circular references, trait objects, and schema evolution. Built with Rust's safety guarantees and zero-copy techniques, it's designed for developers who refuse to compromise between performance and developer experience.]]></summary>
        <content type="html"><![CDATA[<p><strong>TL;DR</strong>: Apache Fory Rust is a blazingly-fast, cross-language serialization framework that delivers <strong>ultra-fast serialization performance</strong> while <strong>automatically handling circular references, trait objects, and schema evolution</strong>. Built with Rust's safety guarantees and zero-copy techniques, it's designed for developers who refuse to compromise between performance and developer experience.</p>
<ul>
<li>🐙 GitHub: <a href="https://github.com/apache/fory" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory</a></li>
<li>📦 Crate: <a href="https://crates.io/crates/fory" target="_blank" rel="noopener noreferrer">https://crates.io/crates/fory</a></li>
</ul>
<img src="https://fory.apache.org/img/fory-logo-light.png" width="50%">
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-serialization-dilemma">The Serialization Dilemma<a href="https://fory.apache.org/blog/fory_rust_versatile_serialization_framework#the-serialization-dilemma" class="hash-link" aria-label="Direct link to The Serialization Dilemma" title="Direct link to The Serialization Dilemma">​</a></h2>
<p>Every backend engineer has faced this moment: your application needs to serialize complex data structures such as nested objects, circular references, polymorphic types, and you're forced to choose between three bad options:</p>
<ol>
<li><strong>Fast but fragile</strong>: Hand-rolled binary formats that break with schema changes</li>
<li><strong>Flexible but slow</strong>: JSON/Protocol with 10x performance overhead</li>
<li><strong>Complex and limiting</strong>: Existing solutions that don't support your language's advanced features</li>
</ol>
<p>Apache Fory Rust eliminates this false choice. It's a serialization framework that delivers exceptional performance while automatically handling the complexities of modern applications—no IDL files, no manual schema management, no compromises.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-makes-apache-fory-rust-different">What Makes Apache Fory Rust Different?<a href="https://fory.apache.org/blog/fory_rust_versatile_serialization_framework#what-makes-apache-fory-rust-different" class="hash-link" aria-label="Direct link to What Makes Apache Fory Rust Different?" title="Direct link to What Makes Apache Fory Rust Different?">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="1-truly-cross-language">1. <strong>Truly Cross-Language</strong><a href="https://fory.apache.org/blog/fory_rust_versatile_serialization_framework#1-truly-cross-language" class="hash-link" aria-label="Direct link to 1-truly-cross-language" title="Direct link to 1-truly-cross-language">​</a></h3>
<p>Apache Fory Rust speaks the same binary protocol as Java, Python, C++, Go, and other language implementations. Serialize data in Rust, deserialize in Python — <strong>it just works</strong>. No schema files. No code generation. No version mismatches.</p>
<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Rust: Serialize</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> user </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">User</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Alice"</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">to_string</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    age</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">30</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">HashMap</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">from</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"role"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"admin"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> bytes </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">serialize</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">user</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Python: Deserialize (same binary format!)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">user </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">deserialize</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">bytes</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">  # </span><span class="token class-name">Just</span><span class="token plain"> </span><span class="token macro property" style="color:#36acaa">works!</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>This isn't just convenient — it changes how we develop microservices architectures where different teams use different languages.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="2-automatic-sharedcircular-reference-handling">2. <strong>Automatic Shared/Circular Reference Handling</strong><a href="https://fory.apache.org/blog/fory_rust_versatile_serialization_framework#2-automatic-sharedcircular-reference-handling" class="hash-link" aria-label="Direct link to 2-automatic-sharedcircular-reference-handling" title="Direct link to 2-automatic-sharedcircular-reference-handling">​</a></h3>
<p>Most serialization frameworks panic when encountering circular references. Apache Fory tracks and preserves reference identity automatically:</p>
<p><strong>Shared Reference</strong>:</p>
<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">use</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">fory</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">::</span><span class="token class-name">Fory</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">use</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">std</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">::</span><span class="token namespace" style="opacity:0.7">rc</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">::</span><span class="token class-name">Rc</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> fory </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Fory</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">default</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Create a shared value</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> shared </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Rc</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">new</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">String</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">from</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"shared_value"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Reference it multiple times</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> data </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token macro property" style="color:#36acaa">vec!</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">shared</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">clone</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> shared</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">clone</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> shared</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">clone</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// The shared value is serialized only once</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> bytes </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">serialize</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">data</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> decoded</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">Vec</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token class-name">Rc</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token class-name">String</span><span class="token operator" style="color:#393A34">&gt;&gt;</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">deserialize</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">bytes</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">?</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Verify reference identity is preserved</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token macro property" style="color:#36acaa">assert_eq!</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">decoded</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">len</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token macro property" style="color:#36acaa">assert_eq!</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">*</span><span class="token plain">decoded</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"shared_value"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// All three Rc pointers point to the same object</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token macro property" style="color:#36acaa">assert!</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Rc</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">ptr_eq</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">decoded</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">decoded</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token macro property" style="color:#36acaa">assert!</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Rc</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">ptr_eq</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">decoded</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">decoded</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><strong>Circular Reference</strong>:</p>
<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">use</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">fory</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">::</span><span class="token punctuation" style="color:#393A34">{</span><span class="token class-name">ForyObject</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">RcWeak</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token attribute attr-name" style="color:#00a4db">#[derive(ForyObject)]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token type-definition class-name">Node</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    value</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">i32</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    parent</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">RcWeak</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token class-name">RefCell</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token class-name">Node</span><span class="token operator" style="color:#393A34">&gt;&gt;</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">     </span><span class="token comment" style="color:#999988;font-style:italic">// Weak pointer breaks cycles</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    children</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">Vec</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token class-name">Rc</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token class-name">RefCell</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token class-name">Node</span><span class="token operator" style="color:#393A34">&gt;&gt;</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Strong references tracked</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Build a parent-child tree with circular references</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> parent </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Rc</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">new</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">RefCell</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">new</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Node</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">...</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> child </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Rc</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">new</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">RefCell</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">new</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Node</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    parent</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">RcWeak</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">from</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">parent</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Points back to parent</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">parent</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">borrow_mut</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">children</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">push</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">child</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">clone</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Serialization handles the cycle automatically</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> bytes </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">serialize</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">parent</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> decoded</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">Rc</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token class-name">RefCell</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token class-name">Node</span><span class="token operator" style="color:#393A34">&gt;&gt;</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">deserialize</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">bytes</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">?</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Reference relationships preserved!</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token macro property" style="color:#36acaa">assert!</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Rc</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">ptr_eq</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">decoded</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">decoded</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">borrow</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">children</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">borrow</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">parent</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">upgrade</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">unwrap</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>This isn't just a feature—it's essential for graph databases, object-relational mappers, and domain models.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="3-trait-object-serialization">3. <strong>Trait Object Serialization</strong><a href="https://fory.apache.org/blog/fory_rust_versatile_serialization_framework#3-trait-object-serialization" class="hash-link" aria-label="Direct link to 3-trait-object-serialization" title="Direct link to 3-trait-object-serialization">​</a></h3>
<p>Rust's trait system enables powerful abstractions, but serializing <code>Box&lt;dyn Trait&gt;</code> is notoriously difficult. Apache Fory makes it trivial:</p>
<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">use</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">fory</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">::</span><span class="token punctuation" style="color:#393A34">{</span><span class="token class-name">ForyObject</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">Serializer</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> register_trait_type</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">trait</span><span class="token plain"> </span><span class="token type-definition class-name">Animal</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">Serializer</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:#d73a49">speak</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token keyword" style="color:#00009f">self</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-&gt;</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token attribute attr-name" style="color:#00a4db">#[derive(ForyObject)]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token type-definition class-name">Dog</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> breed</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token attribute attr-name" style="color:#00a4db">#[derive(ForyObject)]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token type-definition class-name">Cat</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> color</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Register implementations</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token macro property" style="color:#36acaa">register_trait_type!</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Animal</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">Dog</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">Cat</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Serialize heterogeneous collections</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> animals</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">Vec</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token class-name">Box</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token keyword" style="color:#00009f">dyn</span><span class="token plain"> </span><span class="token class-name">Animal</span><span class="token operator" style="color:#393A34">&gt;&gt;</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token macro property" style="color:#36acaa">vec!</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token class-name">Box</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">new</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Dog</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">...</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token class-name">Box</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">new</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Cat</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">...</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> bytes </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">serialize</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">animals</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> decoded</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">Vec</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token class-name">Box</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token keyword" style="color:#00009f">dyn</span><span class="token plain"> </span><span class="token class-name">Animal</span><span class="token operator" style="color:#393A34">&gt;&gt;</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">deserialize</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">bytes</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">?</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Polymorphism preserved!</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">decoded</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">speak</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// "Woof!"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">decoded</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">speak</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// "Meow!"</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><strong>Alternative: Using <code>dyn Any</code> without trait registration</strong>:</p>
<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">use</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">std</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">::</span><span class="token namespace" style="opacity:0.7">rc</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">::</span><span class="token class-name">Rc</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">use</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">std</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">::</span><span class="token namespace" style="opacity:0.7">any</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">::</span><span class="token class-name">Any</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// No trait definition or registration needed</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> dog</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">Rc</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token keyword" style="color:#00009f">dyn</span><span class="token plain"> </span><span class="token class-name">Any</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Rc</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">new</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Dog</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Rex"</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">to_string</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> breed</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Labrador"</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">to_string</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> cat</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">Rc</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token keyword" style="color:#00009f">dyn</span><span class="token plain"> </span><span class="token class-name">Any</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Rc</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">new</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Cat</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Whiskers"</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">to_string</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> color</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Orange"</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">to_string</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> bytes </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">serialize</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">dog</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> decoded</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">Rc</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token keyword" style="color:#00009f">dyn</span><span class="token plain"> </span><span class="token class-name">Any</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">deserialize</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">bytes</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">?</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Downcast to concrete type</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> unwrapped </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> decoded</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">downcast_ref</span><span class="token punctuation" style="color:#393A34">::</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token class-name">Dog</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">unwrap</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token macro property" style="color:#36acaa">assert_eq!</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">unwrapped</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">name</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Rex"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><strong>Supports</strong>:</p>
<ul>
<li><code>Box&lt;dyn Trait&gt;</code> - Owned trait objects</li>
<li><code>Rc&lt;dyn Trait&gt;</code> / <code>Arc&lt;dyn Trait&gt;</code> - Reference-counted trait objects</li>
<li><code>Rc&lt;dyn Any&gt;</code> / <code>Arc&lt;dyn Any&gt;</code> - Runtime type dispatch without traits</li>
<li>Auto-generated wrapper types for standalone serialization</li>
</ul>
<p>This unlocks plugin systems, heterogeneous collections, and extensible architectures that were previously impossible to serialize.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="4-schema-evolution-without-breaking-changes">4. <strong>Schema Evolution Without Breaking Changes</strong><a href="https://fory.apache.org/blog/fory_rust_versatile_serialization_framework#4-schema-evolution-without-breaking-changes" class="hash-link" aria-label="Direct link to 4-schema-evolution-without-breaking-changes" title="Direct link to 4-schema-evolution-without-breaking-changes">​</a></h3>
<p>Microservices evolve independently. Apache Fory's <strong>Compatible mode</strong> allows schema changes without coordination:</p>
<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">use</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">fory</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">::</span><span class="token punctuation" style="color:#393A34">{</span><span class="token class-name">Fory</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">ForyObject</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Service A: Version 1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token attribute attr-name" style="color:#00a4db">#[derive(ForyObject)]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token type-definition class-name">User</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    age</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">i32</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    address</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">mut</span><span class="token plain"> fory_v1 </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Fory</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">default</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">compatible</span><span class="token punctuation" style="color:#393A34">(</span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">fory_v1</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">register</span><span class="token punctuation" style="color:#393A34">::</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token class-name">User</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Service B: Version 2 (evolved independently)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token attribute attr-name" style="color:#00a4db">#[derive(ForyObject)]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token type-definition class-name">User</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    age</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">i32</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// address removed</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    phone</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">Option</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token class-name">String</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">     </span><span class="token comment" style="color:#999988;font-style:italic">// New field</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">HashMap</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token class-name">String</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Another new field</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">mut</span><span class="token plain"> fory_v2 </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Fory</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">default</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">compatible</span><span class="token punctuation" style="color:#393A34">(</span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">fory_v2</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">register</span><span class="token punctuation" style="color:#393A34">::</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token class-name">User</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// V1 data deserializes into V2 structure</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> v1_bytes </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> fory_v1</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">serialize</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">user_v1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> user_v2</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">User</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> fory_v2</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">deserialize</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">v1_bytes</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">?</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Missing fields get default values automatically</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><strong>Compatibility rules</strong>:</p>
<ul>
<li>✅ Add new fields (default values applied)</li>
<li>✅ Remove fields (skipped during deserialization)</li>
<li>✅ Reorder fields (matched by name)</li>
<li>✅ Change nullability (<code>T</code> ↔ <code>Option&lt;T&gt;</code>)</li>
<li>❌ Type changes (except nullable variants)</li>
</ul>
<p>This is critical for zero-downtime deployments and polyglot microservices.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-technical-foundation">The Technical Foundation<a href="https://fory.apache.org/blog/fory_rust_versatile_serialization_framework#the-technical-foundation" class="hash-link" aria-label="Direct link to The Technical Foundation" title="Direct link to The Technical Foundation">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="protocol-design">Protocol Design<a href="https://fory.apache.org/blog/fory_rust_versatile_serialization_framework#protocol-design" class="hash-link" aria-label="Direct link to Protocol Design" title="Direct link to Protocol Design">​</a></h3>
<p>Apache Fory uses a sophisticated binary protocol designed for both performance and flexibility:</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">| fory header | reference meta | type meta | value data |</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><strong>Key innovations</strong>:</p>
<ol>
<li><strong>Efficient encoding</strong>: Variable-length integers, compact type IDs, bit-packed flags</li>
<li><strong>Reference tracking</strong>: Deduplicates shared objects automatically (serialize once, reference thereafter)</li>
<li><strong>Meta compression</strong>: Gzip compression for type metadata in meta-sharing mode</li>
<li><strong>Little-endian layout</strong>: Optimized for modern CPU architectures</li>
</ol>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="compile-time-code-generation">Compile-Time Code Generation<a href="https://fory.apache.org/blog/fory_rust_versatile_serialization_framework#compile-time-code-generation" class="hash-link" aria-label="Direct link to Compile-Time Code Generation" title="Direct link to Compile-Time Code Generation">​</a></h3>
<p>Unlike reflection-based frameworks, Apache Fory generates serialization code at compile time via procedural macros:</p>
<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">use</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">fory</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">::</span><span class="token class-name">ForyObject</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token attribute attr-name" style="color:#00a4db">#[derive(ForyObject)]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token type-definition class-name">Person</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    age</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">i32</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    address</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">Address</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Macro generates:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// - fory_write_data() for serialization</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// - fory_read_data() for deserialization</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// - fory_reserved_space() for buffer pre-allocation</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// - fory_get_type_id() for type registration</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><strong>Benefits</strong>:</p>
<ul>
<li>⚡ <strong>Zero runtime overhead</strong>: No reflection, no vtable lookups</li>
<li>🛡️ <strong>Type safety</strong>: Compile-time errors instead of runtime panics</li>
<li>📦 <strong>Small binary size</strong>: Only code for types you actually use</li>
<li>🔍 <strong>IDE support</strong>: Full autocomplete and error checking</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="architecture">Architecture<a href="https://fory.apache.org/blog/fory_rust_versatile_serialization_framework#architecture" class="hash-link" aria-label="Direct link to Architecture" title="Direct link to Architecture">​</a></h3>
<p>Apache Fory Rust consists of three focused crates:</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">fory/            # High-level API</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  └─ Convenience wrappers, derive re-exports</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">fory-core/       # Core serialization engine</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  ├─ fory.rs         # Main entry point</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  ├─ buffer.rs       # Zero-copy binary I/O</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  ├─ serializer/     # Type-specific serializers</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  ├─ resolver/       # Type registration &amp; dispatch</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  ├─ meta/           # Meta string compression</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  └─ row/            # Row format implementation</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">fory-derive/     # Procedural macros</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  ├─ object/         # ForyObject derive macro</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  └─ fory_row.rs    # ForyRow derive macro</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>This modular design ensures clean separation of concerns and makes the codebase maintainable.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="benchmarks-real-world-performance">Benchmarks: Real-World Performance<a href="https://fory.apache.org/blog/fory_rust_versatile_serialization_framework#benchmarks-real-world-performance" class="hash-link" aria-label="Direct link to Benchmarks: Real-World Performance" title="Direct link to Benchmarks: Real-World Performance">​</a></h2>
<img src="https://fory.apache.org/img/benchmarks/rust/ecommerce_data.png" width="90%">
<img src="https://fory.apache.org/img/benchmarks/rust/system_data.png" width="90%">
<table><thead><tr><th>Datatype</th><th>Size</th><th>Operation</th><th>Fory TPS</th><th>JSON TPS</th><th>Protobuf TPS</th><th>Fastest</th></tr></thead><tbody><tr><td>company</td><td>small</td><td>serialize</td><td>10,063,906</td><td>761,673</td><td>896,620</td><td>fory</td></tr><tr><td>company</td><td>medium</td><td>serialize</td><td>412,507</td><td>33,835</td><td>37,590</td><td>fory</td></tr><tr><td>company</td><td>large</td><td>serialize</td><td>9,183</td><td>793</td><td>880</td><td>fory</td></tr><tr><td>ecommerce_data</td><td>small</td><td>serialize</td><td>2,350,729</td><td>206,262</td><td>256,970</td><td>fory</td></tr><tr><td>ecommerce_data</td><td>medium</td><td>serialize</td><td>59,977</td><td>4,699</td><td>5,242</td><td>fory</td></tr><tr><td>ecommerce_data</td><td>large</td><td>serialize</td><td>3,727</td><td>266</td><td>295</td><td>fory</td></tr><tr><td>person</td><td>small</td><td>serialize</td><td>13,632,522</td><td>1,345,189</td><td>1,475,035</td><td>fory</td></tr><tr><td>person</td><td>medium</td><td>serialize</td><td>3,839,656</td><td>337,610</td><td>369,031</td><td>fory</td></tr><tr><td>person</td><td>large</td><td>serialize</td><td>907,853</td><td>79,631</td><td>91,408</td><td>fory</td></tr><tr><td>simple_list</td><td>small</td><td>serialize</td><td>27,726,945</td><td>4,874,957</td><td>4,643,172</td><td>fory</td></tr><tr><td>simple_list</td><td>medium</td><td>serialize</td><td>4,770,765</td><td>401,558</td><td>397,551</td><td>fory</td></tr><tr><td>simple_list</td><td>large</td><td>serialize</td><td>606,061</td><td>41,061</td><td>44,565</td><td>fory</td></tr><tr><td>simple_map</td><td>small</td><td>serialize</td><td>22,862,369</td><td>3,888,025</td><td>2,695,999</td><td>fory</td></tr><tr><td>simple_map</td><td>medium</td><td>serialize</td><td>2,128,973</td><td>204,319</td><td>193,132</td><td>fory</td></tr><tr><td>simple_map</td><td>large</td><td>serialize</td><td>177,847</td><td>18,419</td><td>18,668</td><td>fory</td></tr><tr><td>simple_struct</td><td>small</td><td>serialize</td><td>35,729,598</td><td>10,167,045</td><td>8,633,342</td><td>fory</td></tr><tr><td>simple_struct</td><td>medium</td><td>serialize</td><td>34,988,279</td><td>9,737,098</td><td>6,433,350</td><td>fory</td></tr><tr><td>simple_struct</td><td>large</td><td>serialize</td><td>31,801,558</td><td>4,545,041</td><td>7,420,049</td><td>fory</td></tr><tr><td>system_data</td><td>small</td><td>serialize</td><td>5,382,131</td><td>468,033</td><td>569,930</td><td>fory</td></tr><tr><td>system_data</td><td>medium</td><td>serialize</td><td>174,240</td><td>11,896</td><td>14,753</td><td>fory</td></tr><tr><td>system_data</td><td>large</td><td>serialize</td><td>10,671</td><td>876</td><td>1,040</td><td>fory</td></tr></tbody></table>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="when-to-use-apache-fory-rust">When to Use Apache Fory Rust<a href="https://fory.apache.org/blog/fory_rust_versatile_serialization_framework#when-to-use-apache-fory-rust" class="hash-link" aria-label="Direct link to When to Use Apache Fory Rust" title="Direct link to When to Use Apache Fory Rust">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="-ideal-use-cases">✅ <strong>Ideal Use Cases</strong><a href="https://fory.apache.org/blog/fory_rust_versatile_serialization_framework#-ideal-use-cases" class="hash-link" aria-label="Direct link to -ideal-use-cases" title="Direct link to -ideal-use-cases">​</a></h3>
<ol>
<li>
<p><strong>Microservices with polyglot teams</strong></p>
<ul>
<li>Different services in different languages</li>
<li>Need seamless data exchange without schema files</li>
<li>Schema evolution across independent deployments</li>
</ul>
</li>
<li>
<p><strong>High-performance data pipelines</strong></p>
<ul>
<li>Processing millions of records per second</li>
<li>Memory-constrained environments (use row format)</li>
<li>Analytics workloads with selective field access</li>
</ul>
</li>
<li>
<p><strong>Complex domain models</strong></p>
<ul>
<li>Circular references (parent-child relationships, graphs)</li>
<li>Polymorphic types (trait objects, inheritance hierarchies)</li>
<li>Rich object graphs with shared references</li>
</ul>
</li>
<li>
<p><strong>Real-time systems</strong></p>
<ul>
<li>Low-latency requirements (<code>&lt;1ms</code> serialization)</li>
<li>Memory-mapped file access</li>
<li>Zero-copy deserialization critical</li>
</ul>
</li>
</ol>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="️-consider-alternatives-if">⚠️ <strong>Consider Alternatives If</strong><a href="https://fory.apache.org/blog/fory_rust_versatile_serialization_framework#%EF%B8%8F-consider-alternatives-if" class="hash-link" aria-label="Direct link to ️-consider-alternatives-if" title="Direct link to ️-consider-alternatives-if">​</a></h3>
<ol>
<li><strong>You need human-readable data</strong>: Use JSON/YAML for debugging</li>
<li><strong>You need long-term storage format</strong>: Use Parquet for data lakes</li>
<li><strong>Your data is trivial</strong>: serde + bincode is simpler for basic types</li>
</ol>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="getting-started-in-5-minutes">Getting Started in 5 Minutes<a href="https://fory.apache.org/blog/fory_rust_versatile_serialization_framework#getting-started-in-5-minutes" class="hash-link" aria-label="Direct link to Getting Started in 5 Minutes" title="Direct link to Getting Started in 5 Minutes">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="installation">Installation<a href="https://fory.apache.org/blog/fory_rust_versatile_serialization_framework#installation" class="hash-link" aria-label="Direct link to Installation" title="Direct link to Installation">​</a></h3>
<p>Add to <code>Cargo.toml</code>:</p>
<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">[dependencies]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">fory = "0.13"</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="basic-object-serialization">Basic Object Serialization<a href="https://fory.apache.org/blog/fory_rust_versatile_serialization_framework#basic-object-serialization" class="hash-link" aria-label="Direct link to Basic Object Serialization" title="Direct link to Basic Object Serialization">​</a></h3>
<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">use</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">fory</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">::</span><span class="token punctuation" style="color:#393A34">{</span><span class="token class-name">Fory</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">Error</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">ForyObject</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token attribute attr-name" style="color:#00a4db">#[derive(ForyObject, Debug, PartialEq)]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token type-definition class-name">User</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    age</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">i32</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    email</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:#d73a49">main</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-&gt;</span><span class="token plain"> </span><span class="token class-name">Result</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">Error</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">mut</span><span class="token plain"> fory </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Fory</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">default</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">register</span><span class="token punctuation" style="color:#393A34">::</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token class-name">User</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Register with unique ID</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> user </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">User</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Alice"</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">to_string</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        age</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">30</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        email</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"alice@example.com"</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">to_string</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Serialize</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> bytes </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">serialize</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">user</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Deserialize</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> decoded</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">User</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">deserialize</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">bytes</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">?</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token macro property" style="color:#36acaa">assert_eq!</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">user</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> decoded</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token class-name">Ok</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="cross-language-serialization">Cross-Language Serialization<a href="https://fory.apache.org/blog/fory_rust_versatile_serialization_framework#cross-language-serialization" class="hash-link" aria-label="Direct link to Cross-Language Serialization" title="Direct link to Cross-Language Serialization">​</a></h3>
<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">use</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">fory</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">::</span><span class="token class-name">Fory</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Enable cross-language mode</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">mut</span><span class="token plain"> fory </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Fory</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">default</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">compatible</span><span class="token punctuation" style="color:#393A34">(</span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">xlang</span><span class="token punctuation" style="color:#393A34">(</span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Register with id/namespace for cross-language compatibility</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">register_by_namespace</span><span class="token punctuation" style="color:#393A34">::</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token class-name">User</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// fory.register_by_namespace::&lt;User&gt;("example", "User");</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> bytes </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">serialize</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">user</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// This can now be deserialized in Java, Python, Go, etc.</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Register types with <strong>consistent IDs or names</strong> across all languages:</p>
<ul>
<li><strong>By ID</strong> (<code>fory.register::&lt;User&gt;(1)</code>): Faster serialization, more compact encoding, but requires coordination to avoid ID conflicts</li>
<li><strong>By name</strong> (<code>fory.register_by_name::&lt;User&gt;("example.User")</code>): More flexible, less prone to conflicts, easier to manage across teams, but slightly larger encoding</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="supported-types">Supported Types<a href="https://fory.apache.org/blog/fory_rust_versatile_serialization_framework#supported-types" class="hash-link" aria-label="Direct link to Supported Types" title="Direct link to Supported Types">​</a></h2>
<p>Apache Fory Rust supports a comprehensive type system:</p>
<p><strong>Primitives</strong>: <code>bool</code>, <code>i8</code>, <code>i16</code>, <code>i32</code>, <code>i64</code>, <code>f32</code>, <code>f64</code>, <code>String</code></p>
<p><strong>Collections</strong>: <code>Vec&lt;T&gt;</code>, <code>HashMap&lt;K,V&gt;</code>, <code>BTreeMap&lt;K,V&gt;</code>, <code>HashSet&lt;T&gt;</code>, <code>Option&lt;T&gt;</code></p>
<p><strong>Smart Pointers</strong>: <code>Box&lt;T&gt;</code>, <code>Rc&lt;T&gt;</code>, <code>Arc&lt;T&gt;</code>, <code>RcWeak&lt;T&gt;</code>, <code>ArcWeak&lt;T&gt;</code>, <code>RefCell&lt;T&gt;</code>, <code>Mutex&lt;T&gt;</code></p>
<p><strong>Date/Time</strong>: <code>chrono::NaiveDate</code>, <code>chrono::NaiveDateTime</code></p>
<p><strong>Custom Types</strong>: Derive <code>ForyObject</code> for object graphs, <code>ForyRow</code> for row format</p>
<p><strong>Trait Objects</strong>: <code>Box&lt;dyn T&gt;</code>, <code>Rc&lt;dyn T&gt;</code>, <code>Arc&lt;dyn T&gt;</code>, <code>Rc&lt;dyn Any&gt;</code>, <code>Arc&lt;dyn Any&gt;</code></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="roadmap-whats-next">Roadmap: What's Next<a href="https://fory.apache.org/blog/fory_rust_versatile_serialization_framework#roadmap-whats-next" class="hash-link" aria-label="Direct link to Roadmap: What's Next" title="Direct link to Roadmap: What's Next">​</a></h2>
<p>Apache Fory Rust is production-ready today, but we're just getting started and continuing active development:</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="-shipped-in-v013">✅ <strong>Shipped in v0.13</strong><a href="https://fory.apache.org/blog/fory_rust_versatile_serialization_framework#-shipped-in-v013" class="hash-link" aria-label="Direct link to -shipped-in-v013" title="Direct link to -shipped-in-v013">​</a></h3>
<ul>
<li>✅ Static codegen via procedural macros</li>
<li>✅ Row format serialization with zero-copy</li>
<li>✅ Cross-language object graph serialization</li>
<li>✅ Shared and circular reference tracking</li>
<li>✅ Weak pointer support (RcWeak, ArcWeak)</li>
<li>✅ Trait object serialization (Box/Rc/Arc)</li>
<li>✅ Schema evolution in compatible mode</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="-coming-soon">🚧 <strong>Coming Soon</strong><a href="https://fory.apache.org/blog/fory_rust_versatile_serialization_framework#-coming-soon" class="hash-link" aria-label="Direct link to -coming-soon" title="Direct link to -coming-soon">​</a></h3>
<ul class="contains-task-list containsTaskList_mC6p">
<li class="task-list-item"><input type="checkbox" disabled=""> <strong>Cross-language reference serialization</strong>: serialize <code>Rc/Arc</code> to/from other languages.</li>
<li class="task-list-item"><input type="checkbox" disabled=""> <strong>Partial row updates</strong>: Mutate row format in-place</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="-help-wanted">🎯 <strong>Help Wanted</strong><a href="https://fory.apache.org/blog/fory_rust_versatile_serialization_framework#-help-wanted" class="hash-link" aria-label="Direct link to -help-wanted" title="Direct link to -help-wanted">​</a></h3>
<p>We're actively seeking contributors for:</p>
<ul>
<li><strong>Performance tuning</strong>: Profile and optimize hot paths</li>
<li><strong>Documentation</strong>: More examples, tutorials, and guides</li>
<li><strong>Testing</strong>: Fuzzing, property tests, edge case coverage</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="production-considerations">Production Considerations<a href="https://fory.apache.org/blog/fory_rust_versatile_serialization_framework#production-considerations" class="hash-link" aria-label="Direct link to Production Considerations" title="Direct link to Production Considerations">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="thread-safety">Thread Safety<a href="https://fory.apache.org/blog/fory_rust_versatile_serialization_framework#thread-safety" class="hash-link" aria-label="Direct link to Thread Safety" title="Direct link to Thread Safety">​</a></h3>
<p><code>Fory</code> becomes fully thread-safe after registration is complete. Once every type is registered (which requires <code>&amp;mut Fory</code>), wrap the instance in an <code>Arc</code> and freely share it across worker threads for concurrent serialization and deserialization.</p>
<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">use</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">fory</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">::</span><span class="token class-name">Fory</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">use</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">std</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">::</span><span class="token punctuation" style="color:#393A34">{</span><span class="token namespace" style="opacity:0.7">sync</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">::</span><span class="token class-name">Arc</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> thread</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">mut</span><span class="token plain"> fory </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Fory</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">default</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">register</span><span class="token punctuation" style="color:#393A34">::</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token class-name">Item</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">?</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> fory </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Arc</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">new</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">fory</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// `Fory` is Send + Sync once registration is done</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> item </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Item</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">default</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> handles</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">Vec</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">_</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">..</span><span class="token number" style="color:#36acaa">4</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">map</span><span class="token punctuation" style="color:#393A34">(</span><span class="token closure-params closure-punctuation punctuation" style="color:#393A34">|</span><span class="token closure-params">_</span><span class="token closure-params closure-punctuation punctuation" style="color:#393A34">|</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> fory </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Arc</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">clone</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">fory</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> input </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> item</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">clone</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token namespace" style="opacity:0.7">thread</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">::</span><span class="token function" style="color:#d73a49">spawn</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">move</span><span class="token plain"> </span><span class="token closure-params closure-punctuation punctuation" style="color:#393A34">|</span><span class="token closure-params closure-punctuation punctuation" style="color:#393A34">|</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> bytes </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">serialize</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">input</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> decoded</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">Item</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">deserialize</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">bytes</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">expect</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"valid data"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">bytes</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> decoded</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">collect</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> handle </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> handles </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">bytes</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> decoded</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> handle</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">join</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">expect</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"thread finished"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// work with `bytes` / `decoded`</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="error-handling">Error Handling<a href="https://fory.apache.org/blog/fory_rust_versatile_serialization_framework#error-handling" class="hash-link" aria-label="Direct link to Error Handling" title="Direct link to Error Handling">​</a></h3>
<p>Apache Fory uses <code>Result&lt;T, Error&gt;</code> for all fallible operations:</p>
<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">use</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">fory</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">::</span><span class="token class-name">Error</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">match</span><span class="token plain"> fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">deserialize</span><span class="token punctuation" style="color:#393A34">::</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token class-name">User</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">bytes</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token class-name">Ok</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">user</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">process_user</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">user</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token class-name">Err</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Error</span><span class="token punctuation" style="color:#393A34">::</span><span class="token class-name">TypeMismatch</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">log</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">::</span><span class="token macro property" style="color:#36acaa">error!</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Schema mismatch"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token class-name">Err</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Error</span><span class="token punctuation" style="color:#393A34">::</span><span class="token class-name">BufferTooShort</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">log</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">::</span><span class="token macro property" style="color:#36acaa">error!</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Incomplete data"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token class-name">Err</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">e</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">log</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">::</span><span class="token macro property" style="color:#36acaa">error!</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Deserialization failed: {}"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> e</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="documentation">Documentation<a href="https://fory.apache.org/blog/fory_rust_versatile_serialization_framework#documentation" class="hash-link" aria-label="Direct link to Documentation" title="Direct link to Documentation">​</a></h2>
<ul>
<li>Apache Fory Rust Guide: <a href="https://fory.apache.org/docs/docs/guide/rust_serialization" target="_blank" rel="noopener noreferrer">📖 View</a></li>
<li>Apache Fory Rust API Doc: <a href="https://docs.rs/fory/latest/fory/" target="_blank" rel="noopener noreferrer">📖 View</a></li>
<li>Apache Fory Xlang Serialization Spec: <a href="https://fory.apache.org/docs/specification/fory_xlang_serialization_spec/" target="_blank" rel="noopener noreferrer">📖 View</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="community-and-contribution">Community and Contribution<a href="https://fory.apache.org/blog/fory_rust_versatile_serialization_framework#community-and-contribution" class="hash-link" aria-label="Direct link to Community and Contribution" title="Direct link to Community and Contribution">​</a></h2>
<p>Apache Fory is an <strong>Apache Software Foundation</strong> project with a vibrant, growing community:</p>
<ul>
<li><strong>GitHub</strong>: <a href="https://github.com/apache/fory" target="_blank" rel="noopener noreferrer">apache/fory</a></li>
<li><strong>Docs</strong>: <a href="https://fory.apache.org/" target="_blank" rel="noopener noreferrer">fory.apache.org</a></li>
<li><strong>Slack</strong>: <a href="https://join.slack.com/t/fory-project/shared_invite/zt-1u8soj4qc-ieYEu7ciHOqA2mo47llS8A" target="_blank" rel="noopener noreferrer">Join our community</a></li>
<li><strong>Issue Tracker</strong>: <a href="https://github.com/apache/fory/issues" target="_blank" rel="noopener noreferrer">GitHub Issues</a></li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="how-to-contribute">How to Contribute<a href="https://fory.apache.org/blog/fory_rust_versatile_serialization_framework#how-to-contribute" class="hash-link" aria-label="Direct link to How to Contribute" title="Direct link to How to Contribute">​</a></h3>
<p>We welcome contributions of all kinds:</p>
<ol>
<li><strong>Code</strong>: Implement features from the roadmap</li>
<li><strong>Docs</strong>: Write tutorials, examples, and guides</li>
<li><strong>Testing</strong>: Add benchmarks, fuzz tests, integration tests</li>
<li><strong>Feedback</strong>: Report bugs, request features, share use cases</li>
</ol>
<p>See <a href="https://github.com/apache/fory/blob/main/CONTRIBUTING.md" target="_blank" rel="noopener noreferrer">CONTRIBUTING.md</a> for guidelines.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="license">License<a href="https://fory.apache.org/blog/fory_rust_versatile_serialization_framework#license" class="hash-link" aria-label="Direct link to License" title="Direct link to License">​</a></h3>
<p>Apache Fory is licensed under the <strong>Apache License 2.0</strong>, a permissive open-source license that allows commercial use, modification, and distribution.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="conclusion">Conclusion<a href="https://fory.apache.org/blog/fory_rust_versatile_serialization_framework#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion">​</a></h2>
<p>Apache Fory Rust represents a paradigm shift in serialization:</p>
<ul>
<li><strong>No more trade-offs</strong>: Get performance <em>and</em> flexibility</li>
<li><strong>No more boilerplate</strong>: Derive macros handle the complexity</li>
<li><strong>No more lock-in</strong>: Trait-object and shared reference support by nature</li>
</ul>
<p>Whether you're building microservices, data pipelines, or real-time systems, Apache Fory Rust delivers the performance you need with the ergonomics you deserve.</p>
<p><strong>Try it today</strong>:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">cargo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">add</span><span class="token plain"> fory</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><strong>Join the community</strong>:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">git</span><span class="token plain"> clone https://github.com/apache/fory.git</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">cd</span><span class="token plain"> fory/rust</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">cargo</span><span class="token plain"> </span><span class="token builtin class-name">test</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--features</span><span class="token plain"> tests</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><strong>Share your experience</strong>:</p>
<ul>
<li>Write a blog post about your use case</li>
<li>Present at your local Rust meetup</li>
<li>Contribute benchmarks from your domain</li>
</ul>]]></content>
        <author>
            <name>Shawn Yang</name>
            <uri>https://github.com/chaokunyang</uri>
        </author>
        <category label="fory" term="fory"/>
        <category label="rust" term="rust"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Fory v0.13.0 Released]]></title>
        <id>https://fory.apache.org/blog/fory_0_13_0_release</id>
        <link href="https://fory.apache.org/blog/fory_0_13_0_release"/>
        <updated>2025-10-27T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[The Apache Fory team is pleased to announce the 0.13.0 release. This is a major release that includes 217 PR from 19 distinct contributors. See the Install Page to learn how to get the libraries for your platform.]]></summary>
        <content type="html"><![CDATA[<p>The Apache Fory team is pleased to announce the 0.13.0 release. This is a major release that includes <a href="https://github.com/apache/fory/compare/v0.12.3...v0.13.0" target="_blank" rel="noopener noreferrer">217 PR</a> from 19 distinct contributors. See the <a href="https://fury.apache.org/docs/docs/start/install" target="_blank" rel="noopener noreferrer">Install</a> Page to learn how to get the libraries for your platform.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="highlights">Highlights<a href="https://fory.apache.org/blog/fory_0_13_0_release#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights">​</a></h2>
<ul>
<li>Dynamic Trait Object Serialization for Rust</li>
<li>Shared/Circular ownership serialization for Rust</li>
<li>Schema Forward/Backward compatibilify for Rust</li>
<li>Drop-in Replacement for Python pickle: support local function/classes/<code>__reduce__</code>/<code>__getstate__</code> serialization</li>
<li>Schema Forward/Backward compatibilify for Python dataclass</li>
<li>Support codegen for xlang mode in java</li>
<li>Primitive array compression using SIMD</li>
<li>Compact Row Codec for Row Format</li>
<li>Schema Forward/Backward compatibilify for Go</li>
<li>Ahead-of-time codegen for golang struct serialization</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="rust-first-release-highlights">Rust: First Release Highlights<a href="https://fory.apache.org/blog/fory_0_13_0_release#rust-first-release-highlights" class="hash-link" aria-label="Direct link to Rust: First Release Highlights" title="Direct link to Rust: First Release Highlights">​</a></h2>
<p>This is the first Apache Fory Rust release, delivering a complete, high‑performance serialization stack. If you build Rust services or libraries, you can now use Fory natively with strong typing, performance, and schema evolution.</p>
<ul>
<li>Derive-based object graph serialization via <code>#[derive(ForyObject)]</code></li>
<li>Polymorphism for trait objects: <code>Box&lt;dyn Trait&gt;</code>, <code>Rc&lt;dyn Trait&gt;</code>, <code>Arc&lt;dyn Trait&gt;</code>, plus <code>dyn Any</code></li>
<li>Shared and circular reference tracking: <code>Rc</code>/<code>Arc</code> and <code>RcWeak</code>/<code>ArcWeak</code></li>
<li>Forward/backward compatible schema evolution (Compatible mode)</li>
<li>Zero-copy Row format via <code>#[derive(ForyRow)]</code> with selective field access</li>
<li>Thread-safe and multi-thread capable serialization (context pool)</li>
<li>Broad collection support (e.g., <code>VecDeque</code>, <code>LinkedList</code>, <code>BTreeMap</code>, <code>BTreeSet</code>, <code>BinaryHeap</code>)</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="quick-start-minimal-example">Quick start (minimal example):<a href="https://fory.apache.org/blog/fory_0_13_0_release#quick-start-minimal-example" class="hash-link" aria-label="Direct link to Quick start (minimal example):" title="Direct link to Quick start (minimal example):">​</a></h3>
<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">use</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">fory</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">::</span><span class="token punctuation" style="color:#393A34">{</span><span class="token class-name">Fory</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">Error</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">use</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">fory</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">::</span><span class="token class-name">ForyObject</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token attribute attr-name" style="color:#00a4db">#[derive(ForyObject, Debug, PartialEq)]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token type-definition class-name">User</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    age</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">i32</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    email</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:#d73a49">main</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-&gt;</span><span class="token plain"> </span><span class="token class-name">Result</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">Error</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">mut</span><span class="token plain"> fory </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Fory</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">default</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">register</span><span class="token punctuation" style="color:#393A34">::</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token class-name">User</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">?</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> user </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">User</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Alice"</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">into</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> age</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">30</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> email</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"alice@example.com"</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">into</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> bytes </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">serialize</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">user</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">?</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> decoded</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">User</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">deserialize</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">bytes</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">?</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token macro property" style="color:#36acaa">assert_eq!</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">user</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> decoded</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token class-name">Ok</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<ul>
<li>Guide: Rust Serialization – <a href="https://fory.apache.org/docs/docs/guide/rust_serialization" target="_blank" rel="noopener noreferrer">https://fory.apache.org/docs/docs/guide/rust_serialization</a></li>
<li>Crate: fory on crates.io – <a href="https://crates.io/crates/fory" target="_blank" rel="noopener noreferrer">https://crates.io/crates/fory</a></li>
<li>API docs: docs.rs – <a href="https://docs.rs/fory/latest/fory" target="_blank" rel="noopener noreferrer">https://docs.rs/fory/latest/fory</a></li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="rust-benchmarks">Rust Benchmarks<a href="https://fory.apache.org/blog/fory_0_13_0_release#rust-benchmarks" class="hash-link" aria-label="Direct link to Rust Benchmarks" title="Direct link to Rust Benchmarks">​</a></h3>
<img src="https://fory.apache.org/img/benchmarks/rust/ecommerce_data.png" width="90%">
<img src="https://fory.apache.org/img/benchmarks/rust/system_data.png" width="90%">
<p>Below are serialize throughput results (TPS; higher is better) comparing Fory with JSON and Protobuf across multiple datasets and sizes.</p>
<table><thead><tr><th>Datatype</th><th>Size</th><th>Operation</th><th>Fory TPS</th><th>JSON TPS</th><th>Protobuf TPS</th><th>Fastest</th></tr></thead><tbody><tr><td>company</td><td>small</td><td>serialize</td><td>10,063,906</td><td>761,673</td><td>896,620</td><td>fory</td></tr><tr><td>company</td><td>medium</td><td>serialize</td><td>412,507</td><td>33,835</td><td>37,590</td><td>fory</td></tr><tr><td>company</td><td>large</td><td>serialize</td><td>9,183</td><td>793</td><td>880</td><td>fory</td></tr><tr><td>ecommerce_data</td><td>small</td><td>serialize</td><td>2,350,729</td><td>206,262</td><td>256,970</td><td>fory</td></tr><tr><td>ecommerce_data</td><td>medium</td><td>serialize</td><td>59,977</td><td>4,699</td><td>5,242</td><td>fory</td></tr><tr><td>ecommerce_data</td><td>large</td><td>serialize</td><td>3,727</td><td>266</td><td>295</td><td>fory</td></tr><tr><td>person</td><td>small</td><td>serialize</td><td>13,632,522</td><td>1,345,189</td><td>1,475,035</td><td>fory</td></tr><tr><td>person</td><td>medium</td><td>serialize</td><td>3,839,656</td><td>337,610</td><td>369,031</td><td>fory</td></tr><tr><td>person</td><td>large</td><td>serialize</td><td>907,853</td><td>79,631</td><td>91,408</td><td>fory</td></tr><tr><td>simple_list</td><td>small</td><td>serialize</td><td>27,726,945</td><td>4,874,957</td><td>4,643,172</td><td>fory</td></tr><tr><td>simple_list</td><td>medium</td><td>serialize</td><td>4,770,765</td><td>401,558</td><td>397,551</td><td>fory</td></tr><tr><td>simple_list</td><td>large</td><td>serialize</td><td>606,061</td><td>41,061</td><td>44,565</td><td>fory</td></tr><tr><td>simple_map</td><td>small</td><td>serialize</td><td>22,862,369</td><td>3,888,025</td><td>2,695,999</td><td>fory</td></tr><tr><td>simple_map</td><td>medium</td><td>serialize</td><td>2,128,973</td><td>204,319</td><td>193,132</td><td>fory</td></tr><tr><td>simple_map</td><td>large</td><td>serialize</td><td>177,847</td><td>18,419</td><td>18,668</td><td>fory</td></tr><tr><td>simple_struct</td><td>small</td><td>serialize</td><td>35,729,598</td><td>10,167,045</td><td>8,633,342</td><td>fory</td></tr><tr><td>simple_struct</td><td>medium</td><td>serialize</td><td>34,988,279</td><td>9,737,098</td><td>6,433,350</td><td>fory</td></tr><tr><td>simple_struct</td><td>large</td><td>serialize</td><td>31,801,558</td><td>4,545,041</td><td>7,420,049</td><td>fory</td></tr><tr><td>system_data</td><td>small</td><td>serialize</td><td>5,382,131</td><td>468,033</td><td>569,930</td><td>fory</td></tr><tr><td>system_data</td><td>medium</td><td>serialize</td><td>174,240</td><td>11,896</td><td>14,753</td><td>fory</td></tr><tr><td>system_data</td><td>large</td><td>serialize</td><td>10,671</td><td>876</td><td>1,040</td><td>fory</td></tr></tbody></table>
<p>Note: Results depend on hardware, dataset, and implementation versions. See the Rust guide for how to run benchmarks yourself: <a href="https://github.com/apache/fory/blob/main/benchmarks/rust_benchmark/README.md" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/blob/main/benchmarks/rust_benchmark/README.md</a></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="python-dropin-replacement-for-pickle">Python: Drop‑in Replacement for pickle<a href="https://fory.apache.org/blog/fory_0_13_0_release#python-dropin-replacement-for-pickle" class="hash-link" aria-label="Direct link to Python: Drop‑in Replacement for pickle" title="Direct link to Python: Drop‑in Replacement for pickle">​</a></h2>
<p><code>pyfory</code> now acts as a high‑performance drop‑in replacement for <code>pickle</code>/<code>cloudpickle</code>, while keeping the same simple API and adding security and performance features.</p>
<ul>
<li>Serialize any Python object in Python‑native mode (<code>xlang=False</code>): global/local functions, lambdas, global/local classes, instance/class/static methods</li>
<li>Honors Python hooks: <code>__getstate__</code>, <code>__setstate__</code>, <code>__reduce__</code>, <code>__reduce_ex__</code></li>
<li>Reference tracking for shared/circular graphs with <code>ref=True</code></li>
<li>Pickle protocol 5 out‑of‑band buffers for zero‑copy via <code>pickle.PickleBuffer</code> (NumPy, Pandas, etc.)</li>
<li>Security: <code>strict=True</code> for registration‑based safety and <code>DeserializationPolicy</code> for fine‑grained control</li>
<li>Threading: <code>ThreadSafeFory</code> for safe multi‑thread use</li>
<li>Familiar API: <code>dumps/loads</code> are aliases of <code>serialize/deserialize</code></li>
</ul>
<p>Quick start:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> pyfory</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Drop-in replacement for pickle/cloudpickle</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">fory </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> pyfory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Fory</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">xlang</span><span class="token operator" style="color:#393A34">=</span><span class="token boolean" style="color:#36acaa">False</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> ref</span><span class="token operator" style="color:#393A34">=</span><span class="token boolean" style="color:#36acaa">True</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> strict</span><span class="token operator" style="color:#393A34">=</span><span class="token boolean" style="color:#36acaa">False</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">make_multiplier</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">k</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">mul</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">x</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> k </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> x</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> mul</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">binary </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">dumps</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">make_multiplier</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">assert</span><span class="token plain"> fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">loads</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">binary</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">30</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Read more: Python Guide – <a href="https://fory.apache.org/docs/latest/python_serialization/" target="_blank" rel="noopener noreferrer">https://fory.apache.org/docs/latest/python_serialization/</a></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="features">Features<a href="https://fory.apache.org/blog/fory_0_13_0_release#features" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features">​</a></h2>
<ul>
<li>feat(java): support object stream serialization for graalvm by @chaokunyang in <a href="https://github.com/apache/fory/pull/2464" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2464</a></li>
<li>refactor(java): rename abstract collection/map serializers to Map/ListLikeSerializer by @chaokunyang in <a href="https://github.com/apache/fory/pull/2466" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2466</a></li>
<li>feat(memory): add customizable MemoryAllocator interface by @adriacabeza in <a href="https://github.com/apache/fory/pull/2467" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2467</a></li>
<li>feat: Chain wheel test/build and release workflows by @esafak in <a href="https://github.com/apache/fory/pull/2483" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2483</a></li>
<li>feat(python): set default languge to python for pyfory by @chaokunyang in <a href="https://github.com/apache/fory/pull/2490" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2490</a></li>
<li>feat(python): add register api to python by @chaokunyang in <a href="https://github.com/apache/fory/pull/2491" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2491</a></li>
<li>feat(python): meta compression for python by @chaokunyang in <a href="https://github.com/apache/fory/pull/2504" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2504</a></li>
<li>feat(python): type meta encoding for python by @chaokunyang in <a href="https://github.com/apache/fory/pull/2509" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2509</a></li>
<li>feat(CI): Cache npm, add node 24, lock file by @esafak in <a href="https://github.com/apache/fory/pull/2523" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2523</a></li>
<li>feat(Rust): Implementing Type Compatible by @urlyy in <a href="https://github.com/apache/fory/pull/2492" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2492</a></li>
<li>feat(Rust): support Option in MetaFieldType se/de by @urlyy in <a href="https://github.com/apache/fory/pull/2528" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2528</a></li>
<li>feat(rust): support skipping fields bytes when deserializing in compatible mode by @urlyy in <a href="https://github.com/apache/fory/pull/2545" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2545</a></li>
<li>feat(go): add type meta encoding for meta share by @junjiexh in <a href="https://github.com/apache/fory/pull/2554" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2554</a></li>
<li>feat(Rust): Support automatic conversion between T and <code>Option&lt;T&gt;</code> when deserialize by @urlyy in <a href="https://github.com/apache/fory/pull/2563" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2563</a></li>
<li>feat(java): bean encoder implemented interfaces honor <code>@Ignore</code> by @stevenschlansker in <a href="https://github.com/apache/fory/pull/2576" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2576</a></li>
<li>refactor(java): refactor fory java exception hierarchical structure by @chaokunyang in <a href="https://github.com/apache/fory/pull/2577" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2577</a></li>
<li>feat(Go): Implement ahead of time codegen for fory-go serialization by @ThisingL in <a href="https://github.com/apache/fory/pull/2553" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2553</a></li>
<li>feat(java): support limit deserialization depth by @chaokunyang in <a href="https://github.com/apache/fory/pull/2578" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2578</a></li>
<li>feat(rust): add fory rust benchmark by @chaokunyang in <a href="https://github.com/apache/fory/pull/2583" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2583</a></li>
<li>perf(rust): optimize rust deserialize perf by @chaokunyang in <a href="https://github.com/apache/fory/pull/2584" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2584</a></li>
<li>feat(rust): add rust profiler for serialization by @chaokunyang in <a href="https://github.com/apache/fory/pull/2588" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2588</a></li>
<li>refactor(go): rename FieldInfo to FieldDef to avoide name collision by @junjiexh in <a href="https://github.com/apache/fory/pull/2594" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2594</a></li>
<li>feat(python): meta share mode for pyfory compatible serialization by @chaokunyang in <a href="https://github.com/apache/fory/pull/2593" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2593</a></li>
<li>feat(java/python): align java and python compatible mode serialization by @chaokunyang in <a href="https://github.com/apache/fory/pull/2602" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2602</a></li>
<li>feat(java/python): support enum xlang serialization by @chaokunyang in <a href="https://github.com/apache/fory/pull/2603" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2603</a></li>
<li>feat(Rust): support basic type se/de aligned with java by @urlyy in <a href="https://github.com/apache/fory/pull/2585" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2585</a></li>
<li>perf(python/java): Fix &amp; optimize cross-language meta-share mode by @pandalee99 in <a href="https://github.com/apache/fory/pull/2601" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2601</a></li>
<li>feat(go): align cross-language type serialization for primitive arrays by @pandalee99 in <a href="https://github.com/apache/fory/pull/2610" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2610</a></li>
<li>feat(java): support codegen for xlang mode in java by @chaokunyang in <a href="https://github.com/apache/fory/pull/2613" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2613</a></li>
<li>feat(java): primitive array compression using SIMD by @adriacabeza in <a href="https://github.com/apache/fory/pull/2485" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2485</a></li>
<li>refactor(go): Replace globalTypeResolver with factory-based serializer registration by @ThisingL in <a href="https://github.com/apache/fory/pull/2615" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2615</a></li>
<li>feat(go): Implement compatible mode with metashare mode by @junjiexh in <a href="https://github.com/apache/fory/pull/2607" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2607</a></li>
<li>feat(java): support concurent map serialization when being updated by @chaokunyang in <a href="https://github.com/apache/fory/pull/2617" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2617</a></li>
<li>feat(java): support concurrent updates when serializing collections by @chaokunyang in <a href="https://github.com/apache/fory/pull/2623" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2623</a></li>
<li>feat(python): support limit pyfory depth by @chaokunyang in <a href="https://github.com/apache/fory/pull/2625" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2625</a></li>
<li>feat(Rust): sort fields &amp;&amp; feat Enum &amp;&amp; fix read/write type_info &amp;&amp; fix type_meta en/decode by @urlyy in <a href="https://github.com/apache/fory/pull/2630" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2630</a></li>
<li>feat(python): drop-in replacement for pickle serialization by @chaokunyang in <a href="https://github.com/apache/fory/pull/2629" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2629</a></li>
<li>refactor(java): refactor type resolver by @chaokunyang in <a href="https://github.com/apache/fory/pull/2640" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2640</a></li>
<li>feat(java): support type converters for comaptible mode by @chaokunyang in <a href="https://github.com/apache/fory/pull/2641" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2641</a></li>
<li>refactor(java/python): refine collection header bitmap by @chaokunyang in <a href="https://github.com/apache/fory/pull/2642" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2642</a></li>
<li>feat(go): metashare mode support collection and map and nested object by @junjiexh in <a href="https://github.com/apache/fory/pull/2643" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2643</a></li>
<li>feat(go): Add slice and map support to fory-go codegen serialization by @ThisingL in <a href="https://github.com/apache/fory/pull/2638" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2638</a></li>
<li>refactor(go): Change codegen annotation from //fory<!-- -->:gen<!-- --> to //fory<!-- -->:generate<!-- --> by @ThisingL in <a href="https://github.com/apache/fory/pull/2648" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2648</a></li>
<li>feat(rust): support Map and register_by_name by @urlyy in <a href="https://github.com/apache/fory/pull/2649" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2649</a></li>
<li>feat(java): support graalvm 25 by @chaokunyang in <a href="https://github.com/apache/fory/pull/2652" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2652</a></li>
<li>feat(java): support deserialize not registered/exsited class/fields for xlang compatible mode by @chaokunyang in <a href="https://github.com/apache/fory/pull/2655" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2655</a></li>
<li>refactor(Rust): Refactor compile-time code &amp; fix named_enum &amp; fix skip enum by @urlyy in <a href="https://github.com/apache/fory/pull/2657" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2657</a></li>
<li>feat(python): support local py class serialization by @chaokunyang in <a href="https://github.com/apache/fory/pull/2665" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2665</a></li>
<li>refactor(go): refine collection header bitmap by @junjiexh in <a href="https://github.com/apache/fory/pull/2656" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2656</a></li>
<li>feat(python): support class methods serialization by @chaokunyang in <a href="https://github.com/apache/fory/pull/2670" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2670</a></li>
<li>refactor(go): refine collection header bitmap in codegen by @ThisingL in <a href="https://github.com/apache/fory/pull/2676" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2676</a></li>
<li>feat(rust): support box serde for rust by @chaokunyang in <a href="https://github.com/apache/fory/pull/2677" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2677</a></li>
<li>feat(rust): support reference tracking for rust Rc/Arc by @chaokunyang in <a href="https://github.com/apache/fory/pull/2678" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2678</a></li>
<li>feat(python): refine python serialization api by @chaokunyang in <a href="https://github.com/apache/fory/pull/2673" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2673</a></li>
<li>refactor(Rust): Refine api name by @urlyy in <a href="https://github.com/apache/fory/pull/2671" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2671</a></li>
<li>feat(rust): support rust dyn trait object serialization by @chaokunyang in <a href="https://github.com/apache/fory/pull/2691" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2691</a></li>
<li>feat(rust): support dyn any trait object serialization for box/arc/rc by @chaokunyang in <a href="https://github.com/apache/fory/pull/2704" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2704</a></li>
<li>feat(rust): support shared reference tracking for <code>arc/rc&lt;dyn T&gt;</code> by @chaokunyang in <a href="https://github.com/apache/fory/pull/2707" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2707</a></li>
<li>feat(rust): avoid downcast method of multiple trait objects in same module conflict by @chaokunyang in <a href="https://github.com/apache/fory/pull/2708" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2708</a></li>
<li>feat(rust): add deref to arc/rc wrapper by @chaokunyang in <a href="https://github.com/apache/fory/pull/2709" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2709</a></li>
<li>refactor(rust): unify rc/arc wrapper macro arms into one function by @chaokunyang in <a href="https://github.com/apache/fory/pull/2711" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2711</a></li>
<li>perf(Rust): Use SIMD to se/de string by @urlyy in <a href="https://github.com/apache/fory/pull/2716" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2716</a></li>
<li>feat(Rust): named_xx se/de &amp;&amp; ext se/de &amp;&amp; add unittest by @urlyy in <a href="https://github.com/apache/fory/pull/2712" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2712</a></li>
<li>feat(rust): support RcWeak/ArcWeak for circular reference tracking by @chaokunyang in <a href="https://github.com/apache/fory/pull/2714" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2714</a></li>
<li>feat(rust): support limit max dyn depth by @chaokunyang in <a href="https://github.com/apache/fory/pull/2730" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2730</a></li>
<li>feat(Rust): Unroll fields loop &amp; Add a feature for this by @urlyy in <a href="https://github.com/apache/fory/pull/2724" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2724</a></li>
<li>feat(python): make fory out-of-band serialization compatible with pickle5 by @chaokunyang in <a href="https://github.com/apache/fory/pull/2732" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2732</a></li>
<li>refactor(go): Replace legacy RegisterTagType api call by @junjiexh in <a href="https://github.com/apache/fory/pull/2696" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2696</a></li>
<li>feat(python): add thread safe fory by @chaokunyang in <a href="https://github.com/apache/fory/pull/2735" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2735</a></li>
<li>feat(rust): support VecDeque/LinkedList serialization by @chaokunyang in <a href="https://github.com/apache/fory/pull/2741" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2741</a></li>
<li>feat(rust): support btreemap serialization by @chaokunyang in <a href="https://github.com/apache/fory/pull/2743" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2743</a></li>
<li>feat(rust): support btree set and binary heap serialization by @chaokunyang in <a href="https://github.com/apache/fory/pull/2744" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2744</a></li>
<li>feat(Rust): support context_pool to reduce context allocation &amp;&amp; support se/de in multi-thread by @urlyy in <a href="https://github.com/apache/fory/pull/2737" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2737</a></li>
<li>feat(ci): cache Bazel binary in Python CI workflow by @SanyamSuyal in <a href="https://github.com/apache/fory/pull/2745" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2745</a></li>
<li>feat(rust): rewrite fory derive macro for smaller and faster generated code using compile-time fields sort algorithm by @chaokunyang in <a href="https://github.com/apache/fory/pull/2749" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2749</a></li>
<li>feat(ci): add maven cache to ci for faster build by @chaokunyang in <a href="https://github.com/apache/fory/pull/2751" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2751</a></li>
<li>feat(rust): fast fory_read_compatible macro to use match by assigned field id by @chaokunyang in <a href="https://github.com/apache/fory/pull/2758" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2758</a></li>
<li>refactor(rust): use compatible bool instead of enum to simplify API by @chaokunyang in <a href="https://github.com/apache/fory/pull/2763" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2763</a></li>
<li>feat(rust): query type meta from parsed cache to speed up deserialization by @chaokunyang in <a href="https://github.com/apache/fory/pull/2764" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2764</a></li>
<li>feat(java): introduce Compact Row Codec by @stevenschlansker in <a href="https://github.com/apache/fory/pull/2414" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2414</a></li>
<li>feat(go): Add pointer field test for meta share mode by @junjiexh in <a href="https://github.com/apache/fory/pull/2674" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2674</a></li>
<li>feat(rust): make Serializer api to return Result &amp;&amp; replace panic/expect/assert/unwrap with Result by @urlyy in <a href="https://github.com/apache/fory/pull/2765" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2765</a></li>
<li>feat(rust): refactor rust serialization system by @chaokunyang in <a href="https://github.com/apache/fory/pull/2774" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2774</a></li>
<li>feat(python): support optional typehint for dataclass fields by @chaokunyang in <a href="https://github.com/apache/fory/pull/2766" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2766</a></li>
<li>feat(rust): dynamic rust serializer system by @chaokunyang in <a href="https://github.com/apache/fory/pull/2778" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2778</a></li>
<li>feat(rust): use rc instead of arc for type meta for faster performance by @chaokunyang in <a href="https://github.com/apache/fory/pull/2782" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2782</a></li>
<li>feat(python): support dataclass compatible mode for python native mode by @chaokunyang in <a href="https://github.com/apache/fory/pull/2784" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2784</a></li>
<li>feat(java): support deserialize non exist enum variant to default by @chaokunyang in <a href="https://github.com/apache/fory/pull/2787" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2787</a></li>
<li>feat(go): update codegen field sorting to generate smaller and faster code by @ThisingL in <a href="https://github.com/apache/fory/pull/2779" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2779</a></li>
<li>feat(rust): make type meta resolve return type info directly by @chaokunyang in <a href="https://github.com/apache/fory/pull/2789" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2789</a></li>
<li>perf(Rust): remove clone()/to_owned() on MetaString/MetaStringBytes in MetaStringResolver to improve performance &amp;&amp; fix xlang test by @urlyy in <a href="https://github.com/apache/fory/pull/2791" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2791</a></li>
<li>feat(rust): support static struct version hash check for rust by @chaokunyang in <a href="https://github.com/apache/fory/pull/2793" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2793</a></li>
<li>feat(rust): support profile all data types in rust benchmark by @chaokunyang in <a href="https://github.com/apache/fory/pull/2801" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2801</a></li>
<li>perf(rust): optimize rust small string/struct read/write performance by @chaokunyang in <a href="https://github.com/apache/fory/pull/2803" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2803</a></li>
<li>perf(rust): optimize rust performance by remove copy simd and add more inline hints by @chaokunyang in <a href="https://github.com/apache/fory/pull/2807" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2807</a></li>
<li>perf(rust): always use utf8 when writing string by @chaokunyang in <a href="https://github.com/apache/fory/pull/2809" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2809</a></li>
<li>feat(python): add deserialization policy for more fine-grained control and audit deserialization behaviour by @chaokunyang in <a href="https://github.com/apache/fory/pull/2811" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2811</a></li>
<li>perf(Rust): Enchance performance by @theweipeng in <a href="https://github.com/apache/fory/pull/2810" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2810</a></li>
<li>feat(Rust): Support serialize_to by @theweipeng in <a href="https://github.com/apache/fory/pull/2822" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2822</a></li>
<li>feat(rust): lazy build typeinfo for rust to avoid nested struct register deps by @chaokunyang in <a href="https://github.com/apache/fory/pull/2824" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2824</a></li>
<li>perf(Rust): Refactor reader by @theweipeng in <a href="https://github.com/apache/fory/pull/2826" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2826</a></li>
<li>perf(python): optimize pyfory perf by @chaokunyang in <a href="https://github.com/apache/fory/pull/2829" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2829</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="bug-fix">Bug Fix<a href="https://fory.apache.org/blog/fory_0_13_0_release#bug-fix" class="hash-link" aria-label="Direct link to Bug Fix" title="Direct link to Bug Fix">​</a></h2>
<ul>
<li>fix(java): fix map/list element type same with collection type jit error by @chaokunyang in <a href="https://github.com/apache/fory/pull/2465" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2465</a></li>
<li>fix(python): fix gh action pypi publish by @chaokunyang in <a href="https://github.com/apache/fory/pull/2468" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2468</a></li>
<li>fix(java): fix row encoder for private struct by @chaokunyang in <a href="https://github.com/apache/fory/pull/2469" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2469</a></li>
<li>fix(python): fix pyfory pypi release by @chaokunyang in <a href="https://github.com/apache/fory/pull/2473" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2473</a></li>
<li>fix(python): fix py release on macos 13 by @chaokunyang in <a href="https://github.com/apache/fory/pull/2478" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2478</a></li>
<li>fix(ci): Build python wheels using interpreters in manylinux2014 by @esafak in <a href="https://github.com/apache/fory/pull/2486" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2486</a></li>
<li>fix(java): Encoders.mapEncoder(TypeRef, TypeRef, TypeRef, Fory) should load bean classes by @stevenschlansker in <a href="https://github.com/apache/fory/pull/2494" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2494</a></li>
<li>fix(java): row format generated bean types handling Optional by @stevenschlansker in <a href="https://github.com/apache/fory/pull/2497" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2497</a></li>
<li>fix: Fix the issue of addListener not releasing the lock by @open-snail in <a href="https://github.com/apache/fory/pull/2500" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2500</a></li>
<li>fix(ci): Use $ROOT/dist for wheel distribution by @esafak in <a href="https://github.com/apache/fory/pull/2506" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2506</a></li>
<li>fix(python): fix publich tag for workflow by @chaokunyang in <a href="https://github.com/apache/fory/pull/2517" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2517</a></li>
<li>fix(ci): print workflow head branch by @chaokunyang in <a href="https://github.com/apache/fory/pull/2518" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2518</a></li>
<li>fix(python): fix release python wheel head_branch tag by @chaokunyang in <a href="https://github.com/apache/fory/pull/2519" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2519</a></li>
<li>fix(java): MemoryBuffer tests that equalTo works with size zero buffers by @stevenschlansker in <a href="https://github.com/apache/fory/pull/2524" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2524</a></li>
<li>fix(ci): Pass tag to bump_py_version, set PLAT inside manylinux container by @esafak in <a href="https://github.com/apache/fory/pull/2522" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2522</a></li>
<li>fix(ci): Use ref_name tag in Windows, name release runs, verify wheel versions, use all python versions for release by @esafak in <a href="https://github.com/apache/fory/pull/2532" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2532</a></li>
<li>ci: Fix verify_version() by capturing version properly by @esafak in <a href="https://github.com/apache/fory/pull/2535" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2535</a></li>
<li>fix(python): fix bump_wheel version by @chaokunyang in <a href="https://github.com/apache/fory/pull/2534" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2534</a></li>
<li>fix(python): fix bump version by @chaokunyang in <a href="https://github.com/apache/fory/pull/2536" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2536</a></li>
<li>fix(python): add macos 13 release by @chaokunyang in <a href="https://github.com/apache/fory/pull/2538" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2538</a></li>
<li>fix(ci): use lowercase for betahuhn/repo-file-sync-action by @chaokunyang in <a href="https://github.com/apache/fory/pull/2541" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2541</a></li>
<li>fix(ci): use commit hash for repo-file-sync-action by @chaokunyang in <a href="https://github.com/apache/fory/pull/2542" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2542</a></li>
<li>fix(java): array encoder seems to waste 8 bytes in encode(T) by @stevenschlansker in <a href="https://github.com/apache/fory/pull/2551" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2551</a></li>
<li>fix(ci): Install pyfory for golang xlang tests by @esafak in <a href="https://github.com/apache/fory/pull/2561" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2561</a></li>
<li>fix(ci): Exit with subprocess return code in run_ci.py by @esafak in <a href="https://github.com/apache/fory/pull/2560" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2560</a></li>
<li>fix(java): fix codegen name conflict by @chaokunyang in <a href="https://github.com/apache/fory/pull/2565" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2565</a></li>
<li>fix(java): fix classinfo npe on graalvm by @chaokunyang in <a href="https://github.com/apache/fory/pull/2572" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2572</a></li>
<li>fix(java): Skip calculation of classVersionHash if checkClassVersion is false by @theigl in <a href="https://github.com/apache/fory/pull/2573" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2573</a></li>
<li>fix(java): skip hash compute for abstract field type by @chaokunyang in <a href="https://github.com/apache/fory/pull/2575" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2575</a></li>
<li>fix(java): row format buffer recycling leaves offset and size for null values by @stevenschlansker in <a href="https://github.com/apache/fory/pull/2540" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2540</a></li>
<li>fix(java): fix xlang register type by id by @chaokunyang in <a href="https://github.com/apache/fory/pull/2591" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2591</a></li>
<li>fix(java): fix xlang mode meta shared for java by @chaokunyang in <a href="https://github.com/apache/fory/pull/2592" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2592</a></li>
<li>fix(python): Fix the build dependency failure that occurred in pyfory by @pandalee99 in <a href="https://github.com/apache/fory/pull/2596" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2596</a></li>
<li>fix(python): Delete the redundant code in typedef by @pandalee99 in <a href="https://github.com/apache/fory/pull/2600" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2600</a></li>
<li>fix(java): fix register by id for xlang metashare mode in java by @chaokunyang in <a href="https://github.com/apache/fory/pull/2614" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2614</a></li>
<li>fix(java/python): fix meta string encoding order by @chaokunyang in <a href="https://github.com/apache/fory/pull/2616" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2616</a></li>
<li>fix(go): Complete type registration in factory-based serializer system by @ThisingL in <a href="https://github.com/apache/fory/pull/2619" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2619</a></li>
<li>fix(python): fix pyfory depth limit by @chaokunyang in <a href="https://github.com/apache/fory/pull/2626" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2626</a></li>
<li>fix(java): fix get nested genericType for codegen by @chaokunyang in <a href="https://github.com/apache/fory/pull/2632" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2632</a></li>
<li>fix(python): register dynamic serializer only not require registration by @chaokunyang in <a href="https://github.com/apache/fory/pull/2634" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2634</a></li>
<li>fix(java): fix record serialization on graalvm25 by @chaokunyang in <a href="https://github.com/apache/fory/pull/2644" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2644</a></li>
<li>fix(java): fix field converter for xlang by @chaokunyang in <a href="https://github.com/apache/fory/pull/2654" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2654</a></li>
<li>fix(java): fix array serialization on graalvm by @chaokunyang in <a href="https://github.com/apache/fory/pull/2664" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2664</a></li>
<li>fix(java): fix meta share deserialization for register by @chaokunyang in <a href="https://github.com/apache/fory/pull/2667" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2667</a></li>
<li>fix(java): retain serializers in graalvm native images by @gudzpoz in <a href="https://github.com/apache/fory/pull/2680" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2680</a></li>
<li>fix(java): fix graalvm not use generated serializer by @chaokunyang in <a href="https://github.com/apache/fory/pull/2682" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2682</a></li>
<li>fix(java): fix register serializer for xlang in java by @chaokunyang in <a href="https://github.com/apache/fory/pull/2683" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2683</a></li>
<li>fix(java): fix InputStream read big buffer error by @wuwangben in <a href="https://github.com/apache/fory/pull/2687" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2687</a></li>
<li>fix(python): fix python module/type serialize by @chaokunyang in <a href="https://github.com/apache/fory/pull/2688" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2688</a></li>
<li>fix(java): Fix flakiness in CollectionSerializersTest#tesPriorityQueueSerializer by @swj20010308 in <a href="https://github.com/apache/fory/pull/2693" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2693</a></li>
<li>fix(java): Fix flakiness in LazyMapTest#testMap by @swj20010308 in <a href="https://github.com/apache/fory/pull/2692" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2692</a></li>
<li>fix(java): fix deserializing EXT type bug by @mengnankkkk in <a href="https://github.com/apache/fory/pull/2700" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2700</a></li>
<li>fix(java): fix xlang typedef encode by @chaokunyang in <a href="https://github.com/apache/fory/pull/2719" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2719</a></li>
<li>fix(java): Fix flakiness in MetaContextTest#testShareClassName and #testShareClassDefCompatible by @swj20010308 in <a href="https://github.com/apache/fory/pull/2739" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2739</a></li>
<li>fix(java): Fix flakiness in ForyCopyTest#mutableObjectCopyTest by @swj20010308 in <a href="https://github.com/apache/fory/pull/2738" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2738</a></li>
<li>fix(ci): add retry logic to Bazel downloads to prevent flaky CI failures by @SanyamSuyal in <a href="https://github.com/apache/fory/pull/2733" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2733</a></li>
<li>fix(java): serialize collections with only null elements in xlang mode by @mymde in <a href="https://github.com/apache/fory/pull/2740" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2740</a></li>
<li>fix(ci): fix sync file by @chaokunyang in <a href="https://github.com/apache/fory/pull/2750" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2750</a></li>
<li>fix(ci): fix sync files by @chaokunyang in <a href="https://github.com/apache/fory/pull/2752" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2752</a></li>
<li>fix(docs): fix rust doc links build and check by @chaokunyang in <a href="https://github.com/apache/fory/pull/2753" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2753</a></li>
<li>fix(java): fix maven cache by @chaokunyang in <a href="https://github.com/apache/fory/pull/2755" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2755</a></li>
<li>fix(rust): fix rust xlang tests by @chaokunyang in <a href="https://github.com/apache/fory/pull/2788" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2788</a></li>
<li>fix(java): Fix flakiness in CollectionSerializersTest#testCollectionFieldSerializers, CollectionSerializersTest#testCollectionFieldSerializersCopy and ProtocolInteroperabilityTest#testComplexCollection by @swj20010308 in <a href="https://github.com/apache/fory/pull/2790" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2790</a></li>
<li>fix(java): fix java shanpshot version by @chaokunyang in <a href="https://github.com/apache/fory/pull/2800" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2800</a></li>
<li>fix(go): Adjust serialization of nullable value to align python behavior by @junjiexh in <a href="https://github.com/apache/fory/pull/2814" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2814</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="other-improvements">Other Improvements<a href="https://fory.apache.org/blog/fory_0_13_0_release#other-improvements" class="hash-link" aria-label="Direct link to Other Improvements" title="Direct link to Other Improvements">​</a></h2>
<ul>
<li>chore(python): disable pyfory.format import warning by @chaokunyang in <a href="https://github.com/apache/fory/pull/2476" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2476</a></li>
<li>chore: bump release version to 0.12.0 by @chaokunyang in <a href="https://github.com/apache/fory/pull/2489" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2489</a></li>
<li>docs: fix meta_size_mask by @urlyy in <a href="https://github.com/apache/fory/pull/2495" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2495</a></li>
<li>chore: fix typos by @Asnowww in <a href="https://github.com/apache/fory/pull/2496" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2496</a></li>
<li>docs: Improve pyfory PyPI documentation by @esafak in <a href="https://github.com/apache/fory/pull/2498" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2498</a></li>
<li>docs(python): add row format doc by @chaokunyang in <a href="https://github.com/apache/fory/pull/2499" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2499</a></li>
<li>chore: translate Chinese comments into English by @Asnowww in <a href="https://github.com/apache/fory/pull/2503" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2503</a></li>
<li>docs: Improve pull request template by @esafak in <a href="https://github.com/apache/fory/pull/2508" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2508</a></li>
<li>ci: Fix Windows wheel creation by @esafak in <a href="https://github.com/apache/fory/pull/2511" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2511</a></li>
<li>ci: Pass the GH token to actions/download-artifact by @esafak in <a href="https://github.com/apache/fory/pull/2514" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2514</a></li>
<li>chore: fix MetaStrEncoding by @co63oc in <a href="https://github.com/apache/fory/pull/2516" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2516</a></li>
<li>chore(javascript): rename foryjs to apache-fory and remove install docs by @chaokunyang in <a href="https://github.com/apache/fory/pull/2544" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2544</a></li>
<li>chore: bump release version to 0.12.1 by @chaokunyang in <a href="https://github.com/apache/fory/pull/2556" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2556</a></li>
<li>docs: update contributing.md with Rust lint command by @urlyy in <a href="https://github.com/apache/fory/pull/2569" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2569</a></li>
<li>chore(ci): use str replace to make bump java version faster by @chaokunyang in <a href="https://github.com/apache/fory/pull/2568" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2568</a></li>
<li>docs(java): add idea jdk11 usage config by @chaokunyang in <a href="https://github.com/apache/fory/pull/2570" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2570</a></li>
<li>docs(rust): add rust document by @chaokunyang in <a href="https://github.com/apache/fory/pull/2582" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2582</a></li>
<li>chore: bump release version to 0.12.2 by @chaokunyang in <a href="https://github.com/apache/fory/pull/2589" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2589</a></li>
<li>chore: add trademark for fory name by @chaokunyang in <a href="https://github.com/apache/fory/pull/2590" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2590</a></li>
<li>chore: Revert "fix(python): Fix the build dependency failure that occurred in pyfory" by @chaokunyang in <a href="https://github.com/apache/fory/pull/2597" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2597</a></li>
<li>chore: remove slash in homepage URL by @chaokunyang in <a href="https://github.com/apache/fory/pull/2604" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2604</a></li>
<li>chore(go): replace all typ to type_ by @chaokunyang in <a href="https://github.com/apache/fory/pull/2612" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2612</a></li>
<li>chore: bump release version to 0.12.3 by @chaokunyang in <a href="https://github.com/apache/fory/pull/2645" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2645</a></li>
<li>docs: add AGENT.md to make AI coding more efficient by @chaokunyang in <a href="https://github.com/apache/fory/pull/2646" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2646</a></li>
<li>chore(rust): remove tag read/write by @chaokunyang in <a href="https://github.com/apache/fory/pull/2681" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2681</a></li>
<li>docs(python): refine python readme with detailed docs by @chaokunyang in <a href="https://github.com/apache/fory/pull/2689" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2689</a></li>
<li>docs(python): update schema evolution support in README by @chaokunyang in <a href="https://github.com/apache/fory/pull/2690" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2690</a></li>
<li>docs: fix python readme lint by @chaokunyang in <a href="https://github.com/apache/fory/pull/2694" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2694</a></li>
<li>docs(rust): add comprehensive rust readme document by @chaokunyang in <a href="https://github.com/apache/fory/pull/2723" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2723</a></li>
<li>docs(rust): add detailed rust api doc and readme by @chaokunyang in <a href="https://github.com/apache/fory/pull/2728" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2728</a></li>
<li>docs: sync rust and python document to fory-site by @chaokunyang in <a href="https://github.com/apache/fory/pull/2734" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2734</a></li>
<li>docs(rust): update rust roadmap by @chaokunyang in <a href="https://github.com/apache/fory/pull/2754" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2754</a></li>
<li>docs(rust): fix rust doc broken link by @chaokunyang in <a href="https://github.com/apache/fory/pull/2756" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2756</a></li>
<li>docs(rust): fix rust doc lint by @chaokunyang in <a href="https://github.com/apache/fory/pull/2757" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2757</a></li>
<li>docs(go): Update README.md by @junjiexh in <a href="https://github.com/apache/fory/pull/2675" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2675</a></li>
<li>docs(rust): add rust thread safety and troubleshooting doc by @chaokunyang in <a href="https://github.com/apache/fory/pull/2781" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2781</a></li>
<li>chore(rust): rename fory-tests to tests by @chaokunyang in <a href="https://github.com/apache/fory/pull/2783" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2783</a></li>
<li>docs(rust): update rust serializer trait doc by @chaokunyang in <a href="https://github.com/apache/fory/pull/2795" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2795</a></li>
<li>chore: fix release error by @chaokunyang in <a href="https://github.com/apache/fory/pull/2796" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2796</a></li>
<li>chore(python): rename numeric typehint by @chaokunyang in <a href="https://github.com/apache/fory/pull/2808" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2808</a></li>
<li>chore(rust): reorder fory rust methods by @chaokunyang in <a href="https://github.com/apache/fory/pull/2813" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2813</a></li>
<li>docs(python): refine python code and add api doc by @chaokunyang in <a href="https://github.com/apache/fory/pull/2816" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2816</a></li>
<li>chore(ci): remove macos13 ci for rust/c++ by @chaokunyang in <a href="https://github.com/apache/fory/pull/2817" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2817</a></li>
<li>chore(rust): rename metastring to meta_string by @urlyy in <a href="https://github.com/apache/fory/pull/2812" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2812</a></li>
<li>docs(rust): add serialize_to api doc by @chaokunyang in <a href="https://github.com/apache/fory/pull/2825" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2825</a></li>
<li>chore(Rust): Streamline code by @theweipeng in <a href="https://github.com/apache/fory/pull/2828" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2828</a></li>
<li>docs(rust): update serialize to deserialize from doc by @chaokunyang in <a href="https://github.com/apache/fory/pull/2830" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2830</a></li>
<li>chore(Rust): Remove new_from_fory from context.rs by @urlyy in <a href="https://github.com/apache/fory/pull/2831" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2831</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="new-contributors">New Contributors<a href="https://fory.apache.org/blog/fory_0_13_0_release#new-contributors" class="hash-link" aria-label="Direct link to New Contributors" title="Direct link to New Contributors">​</a></h2>
<ul>
<li>@adriacabeza made their first contribution in <a href="https://github.com/apache/fory/pull/2467" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2467</a></li>
<li>@Asnowww made their first contribution in <a href="https://github.com/apache/fory/pull/2496" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2496</a></li>
<li>@open-snail made their first contribution in <a href="https://github.com/apache/fory/pull/2500" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2500</a></li>
<li>@junjiexh made their first contribution in <a href="https://github.com/apache/fory/pull/2554" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2554</a></li>
<li>@ThisingL made their first contribution in <a href="https://github.com/apache/fory/pull/2553" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2553</a></li>
<li>@gudzpoz made their first contribution in <a href="https://github.com/apache/fory/pull/2680" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2680</a></li>
<li>@wuwangben made their first contribution in <a href="https://github.com/apache/fory/pull/2687" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2687</a></li>
<li>@swj20010308 made their first contribution in <a href="https://github.com/apache/fory/pull/2693" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2693</a></li>
<li>@mengnankkkk made their first contribution in <a href="https://github.com/apache/fory/pull/2700" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2700</a></li>
<li>@SanyamSuyal made their first contribution in <a href="https://github.com/apache/fory/pull/2733" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2733</a></li>
<li>@mymde made their first contribution in <a href="https://github.com/apache/fory/pull/2740" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2740</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a href="https://github.com/apache/fory/compare/v0.12.3...v0.13.0-rc2" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/compare/v0.12.3...v0.13.0-rc2</a></p>]]></content>
        <author>
            <name>Shawn Yang</name>
            <uri>https://github.com/chaokunyang</uri>
        </author>
        <category label="fory" term="fory"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Fory v0.12.3 Released]]></title>
        <id>https://fory.apache.org/blog/fory_0_12_3_release</id>
        <link href="https://fory.apache.org/blog/fory_0_12_3_release"/>
        <updated>2025-09-23T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[The Apache Fory team is pleased to announce the 0.12.3 release. This is a minor release that includes 4 PR. See the Install Page to learn how to get the libraries for your platform.]]></summary>
        <content type="html"><![CDATA[<p>The Apache Fory team is pleased to announce the 0.12.3 release. This is a minor release that includes <a href="https://github.com/apache/fory/compare/v0.12.2...v0.12.3" target="_blank" rel="noopener noreferrer">4 PR</a>. See the <a href="https://fury.apache.org/docs/docs/start/install" target="_blank" rel="noopener noreferrer">Install</a> Page to learn how to get the libraries for your platform.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="features">Features<a href="https://fory.apache.org/blog/fory_0_12_3_release#features" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features">​</a></h2>
<ul>
<li>feat(java): support concurent map serialization when being updated by @chaokunyang in <a href="https://github.com/apache/fory/pull/2617" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2617</a></li>
<li>feat(python): support limit pyfory depth by @chaokunyang in <a href="https://github.com/apache/fory/pull/2625" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2625</a></li>
<li>feat(python): drop-in replacement for pickle serialization by @chaokunyang in <a href="https://github.com/apache/fory/pull/2629" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2629</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="bug-fixes">Bug Fixes<a href="https://fory.apache.org/blog/fory_0_12_3_release#bug-fixes" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes">​</a></h2>
<ul>
<li>fix(java): fix get nested genericType for codegen by @chaokunyang in <a href="https://github.com/apache/fory/pull/2632" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2632</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a href="https://github.com/apache/fory/compare/v0.12.2...v0.12.3" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/compare/v0.12.2...v0.12.3</a></p>]]></content>
        <author>
            <name>Shawn Yang</name>
            <uri>https://github.com/chaokunyang</uri>
        </author>
        <category label="fory" term="fory"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Fory v0.12.2 Released]]></title>
        <id>https://fory.apache.org/blog/fory_0_12_2_release</id>
        <link href="https://fory.apache.org/blog/fory_0_12_2_release"/>
        <updated>2025-09-08T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[The Apache Fory team is pleased to announce the 0.12.2 release. This is a minor release that includes 10 PR from 4 distinct contributors. See the Install Page to learn how to get the libraries for your platform.]]></summary>
        <content type="html"><![CDATA[<p>The Apache Fory team is pleased to announce the 0.12.2 release. This is a minor release that includes <a href="https://github.com/apache/fory/compare/v0.12.1...v0.12.2" target="_blank" rel="noopener noreferrer">10 PR</a> from 4 distinct contributors. See the <a href="https://fury.apache.org/docs/docs/start/install" target="_blank" rel="noopener noreferrer">Install</a> Page to learn how to get the libraries for your platform.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="features">Features<a href="https://fory.apache.org/blog/fory_0_12_2_release#features" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features">​</a></h2>
<ul>
<li>feat(java): bean encoder implemented interfaces honor <code>@Ignore</code> by @stevenschlansker in <a href="https://github.com/apache/fory/pull/2576" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2576</a></li>
<li>feat(java): support limit deserialization depth by @chaokunyang in <a href="https://github.com/apache/fory/pull/2578" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2578</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="bug-fixes">Bug Fixes<a href="https://fory.apache.org/blog/fory_0_12_2_release#bug-fixes" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes">​</a></h2>
<ul>
<li>fix(ci): Install pyfory for golang xlang tests by @esafak in <a href="https://github.com/apache/fory/pull/2561" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2561</a></li>
<li>fix(ci): Exit with subprocess return code in run_ci.py by @esafak in <a href="https://github.com/apache/fory/pull/2560" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2560</a></li>
<li>fix(java): fix codegen name conflict by @chaokunyang in <a href="https://github.com/apache/fory/pull/2565" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2565</a></li>
<li>fix(java): Skip calculation of classVersionHash if checkClassVersion by @theigl in <a href="https://github.com/apache/fory/pull/2573" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2573</a></li>
<li>fix(java): skip hash compute for abstract field type by @chaokunyang in <a href="https://github.com/apache/fory/pull/2575" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2575</a></li>
<li>fix(java): row format buffer recycling leaves offset and size for null by @stevenschlansker in <a href="https://github.com/apache/fory/pull/2540" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2540</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="improvements">Improvements<a href="https://fory.apache.org/blog/fory_0_12_2_release#improvements" class="hash-link" aria-label="Direct link to Improvements" title="Direct link to Improvements">​</a></h2>
<ul>
<li>refactor(java): refactor fory java exception hierarchical structure by @chaokunyang in <a href="https://github.com/apache/fory/pull/2577" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2577</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a href="https://github.com/apache/fory/compare/v0.12.1...v0.12.2" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/compare/v0.12.1...v0.12.2</a></p>]]></content>
        <author>
            <name>Shawn Yang</name>
            <uri>https://github.com/chaokunyang</uri>
        </author>
        <category label="fory" term="fory"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Fory v0.12.1 Released]]></title>
        <id>https://fory.apache.org/blog/fory_0_12_1_release</id>
        <link href="https://fory.apache.org/blog/fory_0_12_1_release"/>
        <updated>2025-09-01T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[The Apache Fory team is pleased to announce the 0.12.1 release. This is a major release that includes 24 PR from 5 distinct contributors. See the Install Page to learn how to get the libraries for your platform.]]></summary>
        <content type="html"><![CDATA[<p>The Apache Fory team is pleased to announce the 0.12.1 release. This is a major release that includes <a href="https://github.com/apache/fory/compare/v0.11.2...v0.12.1" target="_blank" rel="noopener noreferrer">24 PR</a> from 5 distinct contributors. See the <a href="https://fury.apache.org/docs/docs/start/install" target="_blank" rel="noopener noreferrer">Install</a> Page to learn how to get the libraries for your platform.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="features">Features<a href="https://fory.apache.org/blog/fory_0_12_1_release#features" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features">​</a></h2>
<ul>
<li>feat(python): set default languge to python for pyfory by @chaokunyang in <a href="https://github.com/apache/fory/pull/2490" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2490</a></li>
<li>feat(python): add register api to python by @chaokunyang in <a href="https://github.com/apache/fory/pull/2491" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2491</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="bug-fixes">Bug Fixes<a href="https://fory.apache.org/blog/fory_0_12_1_release#bug-fixes" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes">​</a></h2>
<ul>
<li>Ensure <code>Encoders.mapEncoder</code> loads bean classes correctly by @stevenschlansker in <a href="https://github.com/apache/fory/pull/2494" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2494</a></li>
<li>fix(java): row format generated bean types handling Optional by @stevenschlansker in <a href="https://github.com/apache/fory/pull/2497" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2497</a></li>
<li>fix(java): fix addListener not releasing the lock by @open-snail in <a href="https://github.com/apache/fory/pull/2500" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2500</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="improvements">Improvements<a href="https://fory.apache.org/blog/fory_0_12_1_release#improvements" class="hash-link" aria-label="Direct link to Improvements" title="Direct link to Improvements">​</a></h2>
<ul>
<li>Improve PyPI landing page and add row-format documentation (<a href="https://github.com/apache/fory/pull/2498" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2498</a>, <a href="https://github.com/apache/fory/pull/2499" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2499</a>)</li>
<li>Refactor python release workflow by @esafak in <a href="https://github.com/apache/fory/pull/2483" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2483</a> <a href="https://github.com/apache/fory/pull/2532" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2532</a></li>
<li>chore: translate Chinese comments into English by @Asnowww in <a href="https://github.com/apache/fory/pull/2503" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2503</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="new-contributors">New Contributors<a href="https://fory.apache.org/blog/fory_0_12_1_release#new-contributors" class="hash-link" aria-label="Direct link to New Contributors" title="Direct link to New Contributors">​</a></h2>
<ul>
<li>@Asnowww made their first contribution in <a href="https://github.com/apache/fory/pull/2503" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2503</a></li>
<li>@open-snail made their first contribution in <a href="https://github.com/apache/fory/pull/2500" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2500</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a href="https://github.com/apache/fory/compare/v0.12.0...v0.12.1" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/compare/v0.12.0...v0.12.1</a></p>]]></content>
        <author>
            <name>Shawn Yang</name>
            <uri>https://github.com/chaokunyang</uri>
        </author>
        <category label="fory" term="fory"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Fory v0.12.0 Released]]></title>
        <id>https://fory.apache.org/blog/fory_0_12_0_release</id>
        <link href="https://fory.apache.org/blog/fory_0_12_0_release"/>
        <updated>2025-08-18T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[The Apache Fory team is pleased to announce the 0.12.0 release. This is a major release that includes 64 PR from 9 distinct contributors. See the Install Page to learn how to get the libraries for your platform.]]></summary>
        <content type="html"><![CDATA[<p>The Apache Fory team is pleased to announce the 0.12.0 release. This is a major release that includes <a href="https://github.com/apache/fory/compare/v0.11.2...v0.12.0" target="_blank" rel="noopener noreferrer">64 PR</a> from 9 distinct contributors. See the <a href="https://fury.apache.org/docs/docs/start/install" target="_blank" rel="noopener noreferrer">Install</a> Page to learn how to get the libraries for your platform.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="highlights">Highlights<a href="https://fory.apache.org/blog/fory_0_12_0_release#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights">​</a></h2>
<ul>
<li>[Python] Support Python <code>__getstate__/__setstate__/__reduce__</code> serialization protocol</li>
<li>[Python] Support serialize python function</li>
<li>[Java] Use JDK11 for fory-format module</li>
<li>[Scala]Support default value for scala case/pojo classes when deseralizing</li>
<li>[Kotlin] Support default value for kotlin data classes when deserializing</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="features">Features<a href="https://fory.apache.org/blog/fory_0_12_0_release#features" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features">​</a></h2>
<ul>
<li>refactor(python): replace Black and Flake8 with Ruff by @esafak in <a href="https://github.com/apache/fory/pull/2388" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2388</a></li>
<li>refactor(python): Unify DataClassSerializer and ComplexObjectSerializer by @esafak in <a href="https://github.com/apache/fory/pull/2389" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2389</a></li>
<li>refactor(python): Simplify require_pyarrow, remove undefined pytest.mark by @esafak in <a href="https://github.com/apache/fory/pull/2396" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2396</a></li>
<li>feat(python): Replace usage of ComplexObjectSerializer with DataClassSerializer by @esafak in <a href="https://github.com/apache/fory/pull/2395" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2395</a></li>
<li>feat(python): Add StatefulSerializer using <strong>getstate</strong>, <strong>setstate</strong> by @esafak in <a href="https://github.com/apache/fory/pull/2400" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2400</a></li>
<li>feat(python): Implement ReduceSerializer for <strong>reduce</strong> support by @esafak in <a href="https://github.com/apache/fory/pull/2401" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2401</a></li>
<li>feat(python): Support codegen with XLANG in DataClassSerializer by @esafak in <a href="https://github.com/apache/fory/pull/2405" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2405</a></li>
<li>perf(Go/python): Type system compatibility upgrade by @pandalee99 in <a href="https://github.com/apache/fory/pull/2339" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2339</a></li>
<li>feat(python): Add FunctionSerializer for function serialization by @esafak in <a href="https://github.com/apache/fory/pull/2404" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2404</a></li>
<li>feat: Implement ObjectSerializer for custom objects by @esafak in <a href="https://github.com/apache/fory/pull/2413" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2413</a></li>
<li>feat(scala): support scala object with default values by @chaokunyang in <a href="https://github.com/apache/fory/pull/2412" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2412</a></li>
<li>refactor(java): refactor java default value support for scala/kotlin by @chaokunyang in <a href="https://github.com/apache/fory/pull/2415" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2415</a></li>
<li>feat(kotlin): support default value for kotlin data class by @chaokunyang in <a href="https://github.com/apache/fory/pull/2416" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2416</a></li>
<li>feat(kotlin): add cache to kotlin default value support by @chaokunyang in <a href="https://github.com/apache/fory/pull/2419" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2419</a></li>
<li>refactor(ci): Migrate CI runner to Python scripts by @esafak in <a href="https://github.com/apache/fory/pull/2406" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2406</a></li>
<li>feat(java): use java11 for fory-format module by @chaokunyang in <a href="https://github.com/apache/fory/pull/2448" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2448</a></li>
<li>feat(python): add register api for python by @chaokunyang in <a href="https://github.com/apache/fory/pull/2451" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2451</a></li>
<li>feat(java): add graalvm 23 ci by @chaokunyang in <a href="https://github.com/apache/fory/pull/2463" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2463</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="bug-fix">Bug Fix<a href="https://fory.apache.org/blog/fory_0_12_0_release#bug-fix" class="hash-link" aria-label="Direct link to Bug Fix" title="Direct link to Bug Fix">​</a></h2>
<ul>
<li>fix: tidy up issues in scala_guide.md by @pjfanning in <a href="https://github.com/apache/fory/pull/2374" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2374</a></li>
<li>fix(java): ClassDef header calculation error by @LiangliangSui in <a href="https://github.com/apache/fory/pull/2382" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2382</a></li>
<li>ci(python): Build manylinux_2_28 wheels using auditwheel by @esafak in <a href="https://github.com/apache/fory/pull/2381" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2381</a></li>
<li>fix: Correct pyarrow installation check and add bazel troubleshooting by @esafak in <a href="https://github.com/apache/fory/pull/2418" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2418</a></li>
<li>fix(go): fix type writing and reading logic in slice by @lzaeh in <a href="https://github.com/apache/fory/pull/2427" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2427</a></li>
<li>fix(rust): fix rust lint error by @chaokunyang in <a href="https://github.com/apache/fory/pull/2447" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2447</a></li>
<li>fix(java): crash when map only contains null value by @LouisLou2 in <a href="https://github.com/apache/fory/pull/2444" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2444</a></li>
<li>fix(java): MemoryBuffer::readChars by @LouisLou2 in <a href="https://github.com/apache/fory/pull/2438" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2438</a></li>
<li>fix(java): fix java deploy with different java versions by @chaokunyang in <a href="https://github.com/apache/fory/pull/2449" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2449</a></li>
<li>fix(java): fix install jdks by @chaokunyang in <a href="https://github.com/apache/fory/pull/2450" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2450</a></li>
<li>fix(java): fix maven deploy by @chaokunyang in <a href="https://github.com/apache/fory/pull/2452" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2452</a></li>
<li>fix(java): fix shade janino duplciate entry by @chaokunyang in <a href="https://github.com/apache/fory/pull/2453" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2453</a></li>
<li>fix(java): fix extension java module conflict by @chaokunyang in <a href="https://github.com/apache/fory/pull/2455" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2455</a></li>
<li>fix(java): fix extension java module conflict by @chaokunyang in <a href="https://github.com/apache/fory/pull/2456" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2456</a></li>
<li>fix(java): fix decode classdef for abstract classes by @chaokunyang in <a href="https://github.com/apache/fory/pull/2462" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2462</a></li>
<li>fix(python): fix pyfory pypi release (#2473) by @chaokunyang in <a href="https://github.com/apache/fory/pull/2474" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2474</a></li>
<li>fix(python): fix py releases macos13 by @chaokunyang in <a href="https://github.com/apache/fory/pull/2479" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2479</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="other-improvements">Other Improvements<a href="https://fory.apache.org/blog/fory_0_12_0_release#other-improvements" class="hash-link" aria-label="Direct link to Other Improvements" title="Direct link to Other Improvements">​</a></h2>
<ul>
<li>chore(Scala): upgrade sbt and plugins by @pjfanning in <a href="https://github.com/apache/fory/pull/2379" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2379</a></li>
<li>chore(python): add more comprehensive test parameters by @pandalee99 in <a href="https://github.com/apache/fory/pull/2377" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2377</a></li>
<li>chore(Scala): remove var that can be mutated by @pjfanning in <a href="https://github.com/apache/fory/pull/2385" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2385</a></li>
<li>chore(Scala): add test for Scala 3 enum by @pjfanning in <a href="https://github.com/apache/fory/pull/2386" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2386</a></li>
<li>chore(Scala): use setup-sbt CI action by @pjfanning in <a href="https://github.com/apache/fory/pull/2387" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2387</a></li>
<li>chore(Scala): refactor scala test so it asserts something by @pjfanning in <a href="https://github.com/apache/fory/pull/2390" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2390</a></li>
<li>chore(Scala): Create DurationTest.scala by @pjfanning in <a href="https://github.com/apache/fory/pull/2394" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2394</a></li>
<li>chore(Java): handle deserialization scenario that currently throws an IndexOutOfBoundsException by @pjfanning in <a href="https://github.com/apache/fory/pull/2399" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2399</a></li>
<li>chore: bump release version to 0.11.2 by @pandalee99 in <a href="https://github.com/apache/fory/pull/2403" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2403</a></li>
<li>chore(deps): bump org.apache.commons<!-- -->:commons-lang3<!-- --> from 3.12.0 to 3.18.0 in /java/fory-test-core by @dependabot[bot] in <a href="https://github.com/apache/fory/pull/2408" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2408</a></li>
<li>chore(docs): Fix the names of some documents by @pandalee99 in <a href="https://github.com/apache/fory/pull/2411" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2411</a></li>
<li>chore(cpp): fix duplicate copyright by @co63oc in <a href="https://github.com/apache/fory/pull/2426" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2426</a></li>
<li>docs: fix ruff command by @co63oc in <a href="https://github.com/apache/fory/pull/2425" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2425</a></li>
<li>chore: fix typos by @co63oc in <a href="https://github.com/apache/fory/pull/2424" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2424</a></li>
<li>chore(dart): fix typos by @co63oc in <a href="https://github.com/apache/fory/pull/2428" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2428</a></li>
<li>chore: fix typos by @co63oc in <a href="https://github.com/apache/fory/pull/2429" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2429</a></li>
<li>chore: remove incubating by @chaokunyang in <a href="https://github.com/apache/fory/pull/2431" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2431</a></li>
<li>chore: fix typos by @co63oc in <a href="https://github.com/apache/fory/pull/2433" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2433</a></li>
<li>chore: fix typos by @co63oc in <a href="https://github.com/apache/fory/pull/2436" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2436</a></li>
<li>chore: translate comments by @co63oc in <a href="https://github.com/apache/fory/pull/2442" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2442</a></li>
<li>chore(python): add execute doc for cross langauge tests in python by @chaokunyang in <a href="https://github.com/apache/fory/pull/2420" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2420</a></li>
<li>chore(java): arrow 18.3.0 by @stevenschlansker in <a href="https://github.com/apache/fory/pull/2458" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2458</a></li>
<li>chore: prepare commits for releases-0.12 by @chaokunyang in <a href="https://github.com/apache/fory/pull/2470" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2470</a></li>
<li>chore(python): disable import format warning by @chaokunyang in <a href="https://github.com/apache/fory/pull/2477" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2477</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="new-contributors">New Contributors<a href="https://fory.apache.org/blog/fory_0_12_0_release#new-contributors" class="hash-link" aria-label="Direct link to New Contributors" title="Direct link to New Contributors">​</a></h2>
<ul>
<li>@co63oc made their first contribution in <a href="https://github.com/apache/fory/pull/2426" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2426</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a href="https://github.com/apache/fory/compare/v0.11.2...v0.12.0" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/compare/v0.11.2...v0.12.0</a></p>]]></content>
        <author>
            <name>Shawn Yang</name>
            <uri>https://github.com/chaokunyang</uri>
        </author>
        <category label="fory" term="fory"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Apache Fory™ Graduates to Top-Level Apache Project]]></title>
        <id>https://fory.apache.org/blog/apache-fory-graduated</id>
        <link href="https://fory.apache.org/blog/apache-fory-graduated"/>
        <updated>2025-07-18T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Hello, everyone! I'm pleased to announce that Apache Fory™ has graduated from the Apache Incubator to become a Top-Level Project (TLP) of the Apache Software Foundation, signifying its technical maturity and sustainable open-source governance under the Apache Way.]]></summary>
        <content type="html"><![CDATA[<p><strong>Hello, everyone! I'm pleased to announce that <a href="https://fory.apache.org/" target="_blank" rel="noopener noreferrer">Apache Fory™</a> has graduated from the <a href="https://incubator.apache.org/" target="_blank" rel="noopener noreferrer">Apache Incubator</a> to become a Top-Level Project (TLP) of <a href="https://apache.org/" target="_blank" rel="noopener noreferrer">the Apache Software Foundation</a>, signifying its technical maturity and sustainable open-source governance under the Apache Way.</strong></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-is-apache-fory">What is Apache Fory?<a href="https://fory.apache.org/blog/apache-fory-graduated#what-is-apache-fory" class="hash-link" aria-label="Direct link to What is Apache Fory?" title="Direct link to What is Apache Fory?">​</a></h2>
<p><strong>Apache Fory</strong> is a blazingly-fast multi-language serialization framework that revolutionizes data exchange between systems and languages. By leveraging <strong>JIT compilation</strong> and <strong>zero-copy techniques</strong>, Fory delivers up to <strong>170x faster performance</strong> compared to other serialization frameworkds while being extremely easy to use.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="key-features">Key Features:<a href="https://fory.apache.org/blog/apache-fory-graduated#key-features" class="hash-link" aria-label="Direct link to Key Features:" title="Direct link to Key Features:">​</a></h3>
<ul>
<li>🌐 <strong>Cross-language serialization</strong>: Java, Python, C++, Go, JavaScript, Rust, Scala, Kotlin</li>
<li>⚡️ <strong>Zero-copy optimization</strong>: Minimizes memory overhead for large datasets</li>
<li>🔄 <strong>Schema evolution</strong>: Forward/backward compatibility for evolving data structures</li>
<li>🔒 <strong>Security-first</strong>: Class registration prevents deserialization vulnerabilities</li>
<li>📦 <strong>Multiple protocols</strong>: Object graph, Row format, and Java-compatible modes</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="quick-start">Quick Start<a href="https://fory.apache.org/blog/apache-fory-graduated#quick-start" class="hash-link" aria-label="Direct link to Quick Start" title="Direct link to Quick Start">​</a></h3>
<p>Java serialization example:</p>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token class-name">Fory</span><span class="token plain"> fory </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">builder</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">build</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">register</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">DataModel</span><span class="token punctuation" style="color:#393A34">.</span><span class="token keyword" style="color:#00009f">class</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token class-name">DataModel</span><span class="token plain"> obj </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">DataModel</span><span class="token punctuation" style="color:#393A34">(</span><span class="token comment" style="color:#999988;font-style:italic">/*...*/</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">byte</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> bytes </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">serialize</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">obj</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token class-name">DataModel</span><span class="token plain"> restored </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">DataModel</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">deserialize</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">bytes</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Python serialization example</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> dataclasses </span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> dataclass</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> pyfory</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">Foo</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token builtin">str</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    age</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token builtin">int</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">pyfory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">register</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Foo</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin">bytes</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> pyfory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">serialize</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Foo</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Shawn"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">30</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># Ultra-fast encoding</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">restored </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> pyfory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">deserialize</span><span class="token punctuation" style="color:#393A34">(</span><span class="token builtin">bytes</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># Instant decoding</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-incubation-journey">The Incubation Journey<a href="https://fory.apache.org/blog/apache-fory-graduated#the-incubation-journey" class="hash-link" aria-label="Direct link to The Incubation Journey" title="Direct link to The Incubation Journey">​</a></h2>
<p>Since entering the Apache Incubator in December 2023, Fory has achieved significant milestones.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="community-growth">Community Growth<a href="https://fory.apache.org/blog/apache-fory-graduated#community-growth" class="hash-link" aria-label="Direct link to Community Growth" title="Direct link to Community Growth">​</a></h3>
<ul>
<li>👥 90+ contributors</li>
<li>🔧 6 new committers added, with 1 promoted to PPMC</li>
<li>🤝 Diverse adoption across fintech, e-commerce, and cloud</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="technical-progress">Technical Progress<a href="https://fory.apache.org/blog/apache-fory-graduated#technical-progress" class="hash-link" aria-label="Direct link to Technical Progress" title="Direct link to Technical Progress">​</a></h3>
<ul>
<li>🚀 14 ASF-compliant releases (0.5.0 to 0.11.2)</li>
<li>🔄 4 release managers ensuring sustainable operations</li>
<li>™ Trademark resolution: Successful rename from Fury → Fory</li>
<li>✅ Maturity validation: Full compliance with ASF graduation requirements</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="apache-way-adoption">Apache Way Adoption<a href="https://fory.apache.org/blog/apache-fory-graduated#apache-way-adoption" class="hash-link" aria-label="Direct link to Apache Way Adoption" title="Direct link to Apache Way Adoption">​</a></h3>
<ul>
<li>📬 100% public discussions on dev@ mailing lists</li>
<li>🗳️ Consensus-driven decisions through formal voting</li>
<li>🌐 Complete infrastructure migration to Fory namespace</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="why-graduation-matters">Why Graduation Matters<a href="https://fory.apache.org/blog/apache-fory-graduated#why-graduation-matters" class="hash-link" aria-label="Direct link to Why Graduation Matters" title="Direct link to Why Graduation Matters">​</a></h2>
<p>Graduation signifies that Fory has demonstrated:</p>
<ul>
<li>Sustainable governance with diverse PMC leadership</li>
<li>Enterprise-ready stability through rigorous releases</li>
<li>Community independence with no vendor dominance</li>
<li>ASF policy compliance including security and licensing</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="whats-next">What's Next<a href="https://fory.apache.org/blog/apache-fory-graduated#whats-next" class="hash-link" aria-label="Direct link to What's Next" title="Direct link to What's Next">​</a></h2>
<p>As a Top-Level Project, Fory's roadmap includes:</p>
<ul>
<li>Enhanced Capabilities<!-- -->
<ul>
<li>Improved schema evolution for cross-language compatibility</li>
<li>Producation ready support for Rust/C++ serialization</li>
<li>Optimize Pyfory Performance continuously and provide drop-in replacement support for pickle</li>
</ul>
</li>
<li>Ecosystem Integration<!-- -->
<ul>
<li>GRPC Integration</li>
<li>Protobuf Migration Tool</li>
</ul>
</li>
<li>Community Growth<!-- -->
<ul>
<li>Comprehensive user documentation</li>
<li>Structured mentorship program for new contributors</li>
<li>Production case studies with early adopters</li>
</ul>
</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="get-involved">Get Involved<a href="https://fory.apache.org/blog/apache-fory-graduated#get-involved" class="hash-link" aria-label="Direct link to Get Involved" title="Direct link to Get Involved">​</a></h2>
<p>Experience Fory's performance:</p>
<p>Java:</p>
<div class="language-xml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-xml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">dependency</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">groupId</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">org.apache.fory</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">groupId</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">artifactId</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">fory-core</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">artifactId</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">version</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">0.11.2</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">version</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">dependency</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Python:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">pip </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> pyfory</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Join our community:</p>
<ul>
<li>🌐 Website: <a href="https://fory.apache.org/" target="_blank" rel="noopener noreferrer">https://fory.apache.org</a></li>
<li>💬 Slack: <a href="https://join.slack.com/t/fory-project/shared_invite/zt-36g0qouzm-kcQSvV_dtfbtBKHRwT5gsw" target="_blank" rel="noopener noreferrer">fory-project.slack.com</a></li>
<li>📧 Mailing list: <a href="mailto:dev@fory.apache.org" target="_blank" rel="noopener noreferrer">dev@fory.apache.org</a></li>
<li>🐙 GitHub: <a href="https://github.com/apache/fory" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="acknowledgements">Acknowledgements<a href="https://fory.apache.org/blog/apache-fory-graduated#acknowledgements" class="hash-link" aria-label="Direct link to Acknowledgements" title="Direct link to Acknowledgements">​</a></h2>
<p>The PMC Members of the Fory project are listed as follows, with big thanks to their significant contributions:</p>
<ul>
<li><a href="https://github.com/chaokunyang" target="_blank" rel="noopener noreferrer">Shawn Yang (Chair)</a></li>
<li><a href="https://github.com/tisonkun" target="_blank" rel="noopener noreferrer">tison</a></li>
<li><a href="https://github.com/xuanwo" target="_blank" rel="noopener noreferrer">Xuanwo</a></li>
<li><a href="https://github.com/pragmatwice" target="_blank" rel="noopener noreferrer">Twice</a></li>
<li><a href="https://github.com/pjfanning" target="_blank" rel="noopener noreferrer">PJ Fanning</a></li>
<li><a href="https://github.com/pandalee99" target="_blank" rel="noopener noreferrer">Pan Li</a></li>
<li>Xin Wang</li>
<li>Weipeng Wang</li>
<li>liyu</li>
<li><a href="https://github.com/eolivelli" target="_blank" rel="noopener noreferrer">eolivelli</a></li>
</ul>
<p>Big thanks to all contributors who submitted code, reported issues, and improved documentation. This achievement belongs to the entire Apache Fory community!</p>]]></content>
        <author>
            <name>Shawn Yang</name>
            <uri>https://github.com/chaokunyang</uri>
        </author>
        <category label="announcement" term="announcement"/>
        <category label="serialization" term="serialization"/>
        <category label="asf" term="asf"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Fory v0.11.2 Released]]></title>
        <id>https://fory.apache.org/blog/fory_0_11_2_release</id>
        <link href="https://fory.apache.org/blog/fory_0_11_2_release"/>
        <updated>2025-07-10T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[The Apache Fory team is pleased to announce the 0.11.2 release. This is a major release that includes 13 PR from 6 distinct contributors. See the Install Page to learn how to get the libraries for your platform.]]></summary>
        <content type="html"><![CDATA[<p>The Apache Fory team is pleased to announce the 0.11.2 release. This is a major release that includes <a href="https://github.com/apache/fory/compare/v0.11.1...v0.11.2-rc1" target="_blank" rel="noopener noreferrer">13 PR</a> from 6 distinct contributors. See the <a href="https://fury.apache.org/docs/docs/start/install" target="_blank" rel="noopener noreferrer">Install</a> Page to learn how to get the libraries for your platform.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="features">Features<a href="https://fory.apache.org/blog/fory_0_11_2_release#features" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features">​</a></h2>
<ul>
<li>feat(python): Add Python Linux ARM64 support and optimize Bazel installation by @esafak in <a href="https://github.com/apache/fory/pull/2357" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2357</a></li>
<li>feat(java): row encoder array deserialization into List supports lazy access by @stevenschlansker in <a href="https://github.com/apache/fory/pull/2358" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2358</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="bug-fixes">Bug Fixes<a href="https://fory.apache.org/blog/fory_0_11_2_release#bug-fixes" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes">​</a></h2>
<ul>
<li>fix(java): fix register class async jit thread safety by @chaokunyang in <a href="https://github.com/apache/fory/pull/2365" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2365</a></li>
<li>fix: fix WeakHashMap thread safety by @chaokunyang in <a href="https://github.com/apache/fory/pull/2366" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2366</a></li>
<li>fix(rust): fix rust lint error by @chaokunyang in <a href="https://github.com/apache/fory/pull/2373" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2373</a></li>
<li>fix(java): fix automatic module conflict with maven shaded dependencies by @chaokunyang in <a href="https://github.com/apache/fory/pull/2372" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2372</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="documentation">Documentation<a href="https://fory.apache.org/blog/fory_0_11_2_release#documentation" class="hash-link" aria-label="Direct link to Documentation" title="Direct link to Documentation">​</a></h2>
<ul>
<li>docs: adding multi-threading clarifications for java serialization by @drse in <a href="https://github.com/apache/fory/pull/2356" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2356</a></li>
<li>docs: fix document markdown lint error by @LiangliangSui in <a href="https://github.com/apache/fory/pull/2360" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2360</a></li>
<li>docs: Update java_serialization_guide.md - Fury - Fory by @apupier in <a href="https://github.com/apache/fory/pull/2362" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2362</a></li>
<li>docs: Update java_serialization_guide.md - fury --&gt; fory by @apupier in <a href="https://github.com/apache/fory/pull/2361" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2361</a></li>
<li>docs: update jdk 24 support in README.md by @chaokunyang in <a href="https://github.com/apache/fory/pull/2368" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2368</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="chores">Chores<a href="https://fory.apache.org/blog/fory_0_11_2_release#chores" class="hash-link" aria-label="Direct link to Chores" title="Direct link to Chores">​</a></h2>
<ul>
<li>chore: bump version 0.11.1 by @LiangliangSui in <a href="https://github.com/apache/fory/pull/2369" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2369</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a href="https://github.com/apache/fory/compare/v0.11.1...v0.11.2" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/compare/v0.11.1...v0.11.2</a></p>]]></content>
        <author>
            <name>Pan Li</name>
            <uri>https://github.com/pandalee99</uri>
        </author>
        <category label="fory" term="fory"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Fory v0.11.1 Released]]></title>
        <id>https://fory.apache.org/blog/fory_0_11_1_release</id>
        <link href="https://fory.apache.org/blog/fory_0_11_1_release"/>
        <updated>2025-06-27T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[The Apache Fory team is pleased to announce the 0.11.1 release. This is a major release that includes 32 PR from 13 distinct contributors. See the Install Page to learn how to get the libraries for your platform.]]></summary>
        <content type="html"><![CDATA[<p>The Apache Fory team is pleased to announce the 0.11.1 release. This is a major release that includes <a href="https://github.com/apache/fory/compare/v0.11.0...v0.11.1-rc1" target="_blank" rel="noopener noreferrer">32 PR</a> from 13 distinct contributors. See the <a href="https://fury.apache.org/docs/docs/start/install" target="_blank" rel="noopener noreferrer">Install</a> Page to learn how to get the libraries for your platform.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="features">Features<a href="https://fory.apache.org/blog/fory_0_11_1_release#features" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features">​</a></h2>
<ul>
<li>feat(java): row encoder supports synthesizing interfaces nested inside of records by @stevenschlansker in <a href="https://github.com/apache/fory/pull/2304" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2304</a></li>
<li>feat(java): Support customized serializer for abstract or interface. by @CherishCai in <a href="https://github.com/apache/fory/pull/2311" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2311</a></li>
<li>feat(java): row encoder supports custom rewriting values without changing their type by @stevenschlansker in <a href="https://github.com/apache/fory/pull/2305" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2305</a></li>
<li>feat(java): support multi-dimensional array field serialization in xlang meta shared mode by @OmCheeLin in <a href="https://github.com/apache/fory/pull/2314" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2314</a></li>
<li>feat(python): bump cython to 3.1.1 by @penguin-wwy in <a href="https://github.com/apache/fory/pull/2318" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2318</a></li>
<li>feat(java): array row encoder supports set of interface type by @stevenschlansker in <a href="https://github.com/apache/fory/pull/2333" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2333</a></li>
<li>feat(java): support maven shade for disallowed.txt by @chaokunyang in <a href="https://github.com/apache/fory/pull/2327" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2327</a></li>
<li>feat(java): store OptionalInt, OptionalLong, OptionalDouble same as nullable values by @stevenschlansker in <a href="https://github.com/apache/fory/pull/2338" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2338</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="bug-fix">Bug Fix<a href="https://fory.apache.org/blog/fory_0_11_1_release#bug-fix" class="hash-link" aria-label="Direct link to Bug Fix" title="Direct link to Bug Fix">​</a></h2>
<ul>
<li>fix(java): row encoder interface synthesis handle (Optional) null correctly by @stevenschlansker in <a href="https://github.com/apache/fory/pull/2306" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2306</a></li>
<li>fix(java): Use (long, long, byte) key for MetaStringBytes cache to prevent collisions by @LouisLou2 in <a href="https://github.com/apache/fory/pull/2308" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2308</a></li>
<li>fix(python): update python benchmark script by @penguin-wwy in <a href="https://github.com/apache/fory/pull/2315" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2315</a></li>
<li>fix(java): fix row encoder synthesized interface lazy-decoding of Optional by @stevenschlansker in <a href="https://github.com/apache/fory/pull/2320" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2320</a></li>
<li>fix(java): fix row format handling Optional of type with custom codec by @stevenschlansker in <a href="https://github.com/apache/fory/pull/2321" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2321</a></li>
<li>fix(java): row encoder array element serializer created too late by @stevenschlansker in <a href="https://github.com/apache/fory/pull/2323" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2323</a></li>
<li>fix(python): fix py3.13 ci on windows by @chaokunyang in <a href="https://github.com/apache/fory/pull/2334" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2334</a></li>
<li>fix(python): correct compute_string_hash usage in StructHashVisitor.visit_customized by @lzaeh in <a href="https://github.com/apache/fory/pull/2335" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2335</a></li>
<li>fix(java): fix register serializer for abstract class by @chaokunyang in <a href="https://github.com/apache/fory/pull/2347" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2347</a></li>
<li>fix(java): fix map nested array type serialization codegen by @chaokunyang in <a href="https://github.com/apache/fory/pull/2352" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2352</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="other-improvements">Other Improvements<a href="https://fory.apache.org/blog/fory_0_11_1_release#other-improvements" class="hash-link" aria-label="Direct link to Other Improvements" title="Direct link to Other Improvements">​</a></h2>
<ul>
<li>chore(java): skip find customized serializer when absClassInfo is empty by @CherishCai in <a href="https://github.com/apache/fory/pull/2316" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2316</a></li>
<li>chore: add release note generate tool by @chaokunyang in <a href="https://github.com/apache/fory/pull/2322" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2322</a></li>
<li>chore: Update README.md for fory rename by @chaokunyang in <a href="https://github.com/apache/fory/pull/2324" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2324</a></li>
<li>chore: update slack invite link to fory by @chaokunyang in <a href="https://github.com/apache/fory/pull/2325" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2325</a></li>
<li>perf(java): Improve zone offset deserialization performance by overriding JDK caching by @Cybermaxke in <a href="https://github.com/apache/fory/pull/2336" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2336</a></li>
<li>chore: bump release version to 0.11.0 by @chaokunyang in <a href="https://github.com/apache/fory/pull/2340" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2340</a></li>
<li>perf(java): update benchmark plot by @chaokunyang in <a href="https://github.com/apache/fory/pull/2342" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2342</a></li>
<li>chore: update plots fro compatible by @chaokunyang in <a href="https://github.com/apache/fory/pull/2344" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2344</a></li>
<li>docs: add document for customized map collection serializers by @chaokunyang in <a href="https://github.com/apache/fory/pull/2351" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2351</a></li>
<li>docs: add row format guide for ext and interface types by @nabilshafi in <a href="https://github.com/apache/fory/pull/2346" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2346</a></li>
<li>chore(java): ProtobufDispatcher should trigger log warning at most once by @ClaudioConsolmagno in <a href="https://github.com/apache/fory/pull/2353" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2353</a></li>
<li>docs: format markdown docs by @chaokunyang in <a href="https://github.com/apache/fory/pull/2354" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2354</a></li>
<li>chore: refine validate serializers message for map/collection by @chaokunyang in <a href="https://github.com/apache/fory/pull/2355" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2355</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="new-contributors">New Contributors<a href="https://fory.apache.org/blog/fory_0_11_1_release#new-contributors" class="hash-link" aria-label="Direct link to New Contributors" title="Direct link to New Contributors">​</a></h2>
<ul>
<li>@nabilshafi made their first contribution in <a href="https://github.com/apache/fory/pull/2346" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2346</a></li>
<li>@ClaudioConsolmagno made their first contribution in <a href="https://github.com/apache/fory/pull/2353" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2353</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a href="https://github.com/apache/fory/compare/v0.11.0...v0.11.1-rc1" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/compare/v0.11.0...v0.11.1-rc1</a></p>]]></content>
        <author>
            <name>Liangliang Sui</name>
            <uri>https://github.com/LiangliangSui</uri>
        </author>
        <category label="fory" term="fory"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Fory v0.11.0 Released]]></title>
        <id>https://fory.apache.org/blog/fory_0_11_0_release</id>
        <link href="https://fory.apache.org/blog/fory_0_11_0_release"/>
        <updated>2025-06-17T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[The Apache Fory team is pleased to announce the 0.11.0 release. This is a major release that includes 177 PR from 39 distinct contributors. See the Install Page to learn how to get the libraries for your platform.]]></summary>
        <content type="html"><![CDATA[<p>The Apache Fory team is pleased to announce the 0.11.0 release. This is a major release that includes <a href="https://github.com/apache/fory/compare/v0.10.3...v0.11.0" target="_blank" rel="noopener noreferrer">177 PR</a> from 39 distinct contributors. See the <a href="https://fury.apache.org/docs/docs/start/install" target="_blank" rel="noopener noreferrer">Install</a> Page to learn how to get the libraries for your platform.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="highlights">Highlights<a href="https://fory.apache.org/blog/fory_0_11_0_release#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights">​</a></h2>
<ul>
<li>Add Dart Serialization support</li>
<li>Chunk-based map serialization for Java/Python with performance optimizations and XLang support</li>
<li>Cross-language homogeneous collection serialization between Java/Python</li>
<li>Refactor XLang type system and serialization for fory go</li>
<li>Performance improvements in Python (dict/tuple/list serialization, C-API optimization)</li>
<li>Row format evolution with support for Optional, Records, nested beans, and interface synthesis</li>
<li>Unify Java and XLang object serialization with cross-language compatibility for enums, time, arrays, and more</li>
<li>Renamed Apache Fury to Apache Fory</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="breaking-changes">Breaking Changes<a href="https://fory.apache.org/blog/fory_0_11_0_release#breaking-changes" class="hash-link" aria-label="Direct link to Breaking Changes" title="Direct link to Breaking Changes">​</a></h2>
<ul>
<li>Renamed Apache Fury to Apache Fory, this transition impacts all project components including code repositories, maven groupId, jar names, package names, documentation, and communication channels and the source release name (and location), see <a href="https://fory.apache.org/blog/fury_renamed_to_fory" target="_blank" rel="noopener noreferrer">Rename Announcement</a> for more details.</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="features">Features<a href="https://fory.apache.org/blog/fory_0_11_0_release#features" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features">​</a></h2>
<ul>
<li>feat(java): ReplaceResolveSerializer deep copy by @zhaommmmomo in <a href="https://github.com/apache/fory/pull/1925" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/1925</a></li>
<li>perf(python): Enhance the Python benchmark script by @penguin-wwy in <a href="https://github.com/apache/fory/pull/1926" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/1926</a></li>
<li>perf(python): Improve tuple and list serializer performance by @penguin-wwy in <a href="https://github.com/apache/fory/pull/1933" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/1933</a></li>
<li>feat(python): Implement collection serialization protocol by @penguin-wwy in <a href="https://github.com/apache/fory/pull/1942" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/1942</a></li>
<li>perf(python): Pre-allocate size for the dictionary by @penguin-wwy in <a href="https://github.com/apache/fory/pull/1949" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/1949</a></li>
<li>feat(java): use varint for jdk compatible serializers by @chaokunyang in <a href="https://github.com/apache/fory/pull/1960" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/1960</a></li>
<li>feat(java): configurable buffer size limit by @theigl in <a href="https://github.com/apache/fory/pull/1963" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/1963</a></li>
<li>perf(python): Directly access the key-value pairs of a dict by @penguin-wwy in <a href="https://github.com/apache/fory/pull/1970" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/1970</a></li>
<li>feat(python): Hardcoding metastring into passable parameters by @pandalee99 in <a href="https://github.com/apache/fory/pull/1987" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/1987</a></li>
<li>feat(java/python): new xlang type system spec implementation by @chaokunyang in <a href="https://github.com/apache/fory/pull/1690" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/1690</a></li>
<li>feat(c++): Support the UTF-8 to UTF-16 with SIMD by @pandalee99 in <a href="https://github.com/apache/fory/pull/1990" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/1990</a></li>
<li>feat(python): support latin1/utf16 string encoding in python by @chaokunyang in <a href="https://github.com/apache/fory/pull/1997" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/1997</a></li>
<li>feat(c++): add simd accelerated c++ ascii/latin1 check funcion by @chaokunyang in <a href="https://github.com/apache/fory/pull/1999" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/1999</a></li>
<li>perf(python): get object <strong>dict</strong> for faster field read/write by @chaokunyang in <a href="https://github.com/apache/fory/pull/2003" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2003</a></li>
<li>perf(python): optimize bytes buffer creation by @chaokunyang in <a href="https://github.com/apache/fory/pull/2008" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2008</a></li>
<li>feat(java): make 4 bytes utf16 size header optional for utf8 encoding by @chaokunyang in <a href="https://github.com/apache/fory/pull/2010" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2010</a></li>
<li>feat(ci): support building python on windows by @An-DJ in <a href="https://github.com/apache/fory/pull/1885" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/1885</a></li>
<li>feat(java): Chunk by chunk predictive map serialization protocol by @Hen1ng in <a href="https://github.com/apache/fory/pull/1722" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/1722</a></li>
<li>feat(java): support streaming encode/decode to/from buffer for row format by @chaokunyang in <a href="https://github.com/apache/fory/pull/2024" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2024</a></li>
<li>feat(c++): Add benchmark for performance evaluation by @pandalee99 in <a href="https://github.com/apache/fory/pull/2023" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2023</a></li>
<li>feat(java): new implementation and protocol refine for chunk based map serialization by @chaokunyang in <a href="https://github.com/apache/fory/pull/2025" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2025</a></li>
<li>feat(c++): BenchMark will be a Module by @pandalee99 in <a href="https://github.com/apache/fory/pull/2028" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2028</a></li>
<li>feat(java): jit support for chunk based map serialization by @chaokunyang in <a href="https://github.com/apache/fory/pull/2027" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2027</a></li>
<li>feat(java): Add basicMultiConfigFury dataprovider and add basic map unit test use the dataProvider by @Hen1ng in <a href="https://github.com/apache/fory/pull/2032" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2032</a></li>
<li>feat(python): unify type system between python and xlang serialization in pyfury by @chaokunyang in <a href="https://github.com/apache/fory/pull/2034" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2034</a></li>
<li>feat(java): deserialize one pojo into another type by @orisgarno in <a href="https://github.com/apache/fory/pull/2012" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2012</a></li>
<li>feat(python): chunk based map serialization for python by @chaokunyang in <a href="https://github.com/apache/fory/pull/2038" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2038</a></li>
<li>feat(python): add macos pyfury ci by @chaokunyang in <a href="https://github.com/apache/fory/pull/2041" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2041</a></li>
<li>feat(python): automatic release pyfury on macos and windows by @chaokunyang in <a href="https://github.com/apache/fory/pull/2045" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2045</a></li>
<li>feat(javascript): optimize string serializer by @theweipeng in <a href="https://github.com/apache/fory/pull/2043" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2043</a></li>
<li>feat(java): zstd meta compressor by @orisgarno in <a href="https://github.com/apache/fory/pull/2042" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2042</a></li>
<li>feat(python): support 3.13 by @penguin-wwy in <a href="https://github.com/apache/fory/pull/2046" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2046</a></li>
<li>feat(java): support register type by name in java by @chaokunyang in <a href="https://github.com/apache/fory/pull/2053" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2053</a></li>
<li>feat(spec): remove polymorphic from type id by @chaokunyang in <a href="https://github.com/apache/fory/pull/2054" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2054</a></li>
<li>feat(java): Add fastpath for collection/map serialize and deserialize by @Hen1ng in <a href="https://github.com/apache/fory/pull/2050" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2050</a></li>
<li>perf(python): upgrade pyarrow version to 15.0.0 by @pandalee99 in <a href="https://github.com/apache/fory/pull/2056" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2056</a></li>
<li>feat(python): chunk based map serialization in pure python by @pandalee99 in <a href="https://github.com/apache/fory/pull/2037" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2037</a></li>
<li>build(bazel): Extracts compile_commands.json by @penguin-wwy in <a href="https://github.com/apache/fory/pull/2059" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2059</a></li>
<li>feat(javascript): simplify the definition of object type description by @theweipeng in <a href="https://github.com/apache/fory/pull/2058" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2058</a></li>
<li>perf(java): Optimize Computational Efficiency of MetaStringEncoder::encodeGeneric by @LouisLou2 in <a href="https://github.com/apache/fory/pull/2072" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2072</a></li>
<li>feat(javascript): Impl xlang by @theweipeng in <a href="https://github.com/apache/fory/pull/2075" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2075</a></li>
<li>perf(python): Optimize sequence buffer writing via the c-api by @penguin-wwy in <a href="https://github.com/apache/fory/pull/2078" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2078</a></li>
<li>feat(javascript): Speed up string serializer by @theweipeng in <a href="https://github.com/apache/fory/pull/2083" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2083</a></li>
<li>feat(java): extra entry in disallowed.txt by @pjfanning in <a href="https://github.com/apache/fory/pull/2098" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2098</a></li>
<li>perf(java): Refactor ThreadPoolFury to improve performance by @moooonk in <a href="https://github.com/apache/fory/pull/2092" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2092</a></li>
<li>perf(java): Improve performance by using System.arraycopy to copy between byte arrays by @Cybermaxke in <a href="https://github.com/apache/fory/pull/2101" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2101</a></li>
<li>feat(java): use sha256 to check disallowed.txt tamper by @chaokunyang in <a href="https://github.com/apache/fory/pull/2102" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2102</a></li>
<li>perf(java): Refactor field sorting in StructSerializer to cache transformed field names and avoid redundant computation by @LouisLou2 in <a href="https://github.com/apache/fory/pull/2091" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2091</a></li>
<li>feat(java): support passed tracking ref meta when building serializers by @chaokunyang in <a href="https://github.com/apache/fory/pull/2113" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2113</a></li>
<li>feat(java): support nested bean in array/collection/map for row format by @chaokunyang in <a href="https://github.com/apache/fory/pull/2116" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2116</a></li>
<li>feat(java): support inconsistent registration by name/id by @chaokunyang in <a href="https://github.com/apache/fory/pull/2120" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2120</a></li>
<li>feat: xlang map chunk serialization between java/python by @chaokunyang in <a href="https://github.com/apache/fory/pull/2127" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2127</a></li>
<li>feat: xlang homogeneous collection serialization between java/python by @chaokunyang in <a href="https://github.com/apache/fory/pull/2130" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2130</a></li>
<li>feat(chore): bump version support kotlin by @chaokunyang in <a href="https://github.com/apache/fory/pull/2134" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2134</a></li>
<li>feat(dart): Add Fury Dart Support by @LouisLou2 in <a href="https://github.com/apache/fory/pull/2112" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2112</a></li>
<li>refactor(java): refactor object serializer for unifying xlang/java serialization in java by @chaokunyang in <a href="https://github.com/apache/fory/pull/2139" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2139</a></li>
<li>refactor(java): move methods from object serializer to abstract object serializer by @chaokunyang in <a href="https://github.com/apache/fory/pull/2140" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2140</a></li>
<li>feat(java): unify java and xlang object serialization by @chaokunyang in <a href="https://github.com/apache/fory/pull/2146" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2146</a></li>
<li>feat(java): support enum/time/array final types in xlang serialization by @chaokunyang in <a href="https://github.com/apache/fory/pull/2164" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2164</a></li>
<li>feat(java): FuryField annotation hints for struct serialization by @Hen1ng in <a href="https://github.com/apache/fory/pull/2036" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2036</a></li>
<li>feat(kotlin): add kotlin ci by @pandalee99 in <a href="https://github.com/apache/fory/pull/2176" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2176</a></li>
<li>perf(kotlin): Add multiple versions of kotlin CI by @pandalee99 in <a href="https://github.com/apache/fory/pull/2184" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2184</a></li>
<li>feat(dart): add <code>test_config.yaml</code> and apply <code>TestConfig</code> for environment-specific settings by @LouisLou2 in <a href="https://github.com/apache/fory/pull/2183" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2183</a></li>
<li>feat: add Dart to Language enums across all implementations by @LouisLou2 in <a href="https://github.com/apache/fory/pull/2187" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2187</a></li>
<li>feat(go): fury go implements new xlang by @pandalee99 in <a href="https://github.com/apache/fory/pull/2198" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2198</a></li>
<li>feat(java): add protobuf serializer for message and byte string by @chaokunyang in <a href="https://github.com/apache/fory/pull/2213" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2213</a></li>
<li>feat(spec): update type meta encoding by @chaokunyang in <a href="https://github.com/apache/fory/pull/2216" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2216</a></li>
<li>feat(java): type meta encoding for xlang in java by @chaokunyang in <a href="https://github.com/apache/fory/pull/2197" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2197</a></li>
<li>feat(java): support trackingRef in furyField by @Hen1ng in <a href="https://github.com/apache/fory/pull/2168" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2168</a></li>
<li>feat(java): add DescriptorBuilder for easy build and copying Descriptor by @Hen1ng in <a href="https://github.com/apache/fory/pull/2229" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2229</a></li>
<li>feat(java): Support furyField nullable in codeGen pattern by @Hen1ng in <a href="https://github.com/apache/fory/pull/2191" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2191</a></li>
<li>feat(java): row encoder supports custom types and collections by @stevenschlansker in <a href="https://github.com/apache/fory/pull/2243" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2243</a></li>
<li>test(benchmark): add msgpack serialization/deserialization to benchmark by @Kn0688 in <a href="https://github.com/apache/fory/pull/2242" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2242</a></li>
<li>feat(go): fury-go implements adaptation and optimization for new xlang by @pandalee99 in <a href="https://github.com/apache/fory/pull/2230" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2230</a></li>
<li>perf(c++): Evaluate the implementation effect &amp;&amp;simdutf performs partial vectorization by @pandalee99 in <a href="https://github.com/apache/fory/pull/2033" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2033</a></li>
<li>feat(java): fury row encoder now supports implementing interfaces with simple value type by @stevenschlansker in <a href="https://github.com/apache/fory/pull/2250" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2250</a></li>
<li>feat(java): row format supports Optional by @stevenschlansker in <a href="https://github.com/apache/fory/pull/2254" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2254</a></li>
<li>feat(java): row format supports Record types by @stevenschlansker in <a href="https://github.com/apache/fory/pull/2256" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2256</a></li>
<li>perf(go): Optimize the type registration system &amp;&amp; Reduce useless code by @pandalee99 in <a href="https://github.com/apache/fory/pull/2262" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2262</a></li>
<li>feat(java): support meta shared serialization for xlang in java by @chaokunyang in <a href="https://github.com/apache/fory/pull/2276" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2276</a></li>
<li>feat(python): replace "_class" prefix with "_type" in metashare by @urlyy in <a href="https://github.com/apache/fory/pull/2290" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2290</a></li>
<li>feat(java): Adding explanatory message to <code>deserializeNonexistentClass</code> misconfiguration in <code>Config</code> by @drse in <a href="https://github.com/apache/fory/pull/2300" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2300</a></li>
<li>feat(java): row encoder supports synthesizing interfaces nested inside of records by @stevenschlansker in <a href="https://github.com/apache/fory/pull/2304" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2304</a></li>
<li>feat(java): Support customized serializer for abstract or interface. by @CherishCai in <a href="https://github.com/apache/fory/pull/2311" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2311</a></li>
<li>feat(java): row encoder supports custom rewriting values without changing their type by @stevenschlansker in <a href="https://github.com/apache/fory/pull/2305" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2305</a></li>
<li>feat(java): support multi-dimensional array field serialization in xlang meta shared mode by @OmCheeLin in <a href="https://github.com/apache/fory/pull/2314" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2314</a></li>
<li>feat(python): bump cython to 3.1.1 by @penguin-wwy in <a href="https://github.com/apache/fory/pull/2318" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2318</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="bug-fix">Bug Fix<a href="https://fory.apache.org/blog/fory_0_11_0_release#bug-fix" class="hash-link" aria-label="Direct link to Bug Fix" title="Direct link to Bug Fix">​</a></h2>
<ul>
<li>fix(doc): set compressString default value to false by @chaokunyang in <a href="https://github.com/apache/fory/pull/1913" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/1913</a></li>
<li>fix(java): Move schema caching to unsafe trait to avoid issues when using non-inferred schema. by @wywen in <a href="https://github.com/apache/fory/pull/1944" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/1944</a></li>
<li>fix(java): ClassLoaderFuryPooled#setFactoryCallback cannot effect old Fury by @MrChang0 in <a href="https://github.com/apache/fory/pull/1946" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/1946</a></li>
<li>fix(java): fix find constructor error in generated serializer class caused by duplicated class classloading for Fury by @chaokunyang in <a href="https://github.com/apache/fory/pull/1948" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/1948</a></li>
<li>fix(c++): fix bazel install by @chaokunyang in <a href="https://github.com/apache/fory/pull/1979" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/1979</a></li>
<li>fix(java): Fix flakiness in ExpressionVisitorTest#testTraverseExpression by @AmitPr in <a href="https://github.com/apache/fory/pull/1968" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/1968</a></li>
<li>fix(java): only print warn message if scopedMetaShareEnabled is true … by @zhfeng in <a href="https://github.com/apache/fory/pull/1985" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/1985</a></li>
<li>fix(java): Fix the issue caused by not using readCompressedBytesString during deserialization when string compression is enabled. by @Aliothmoon in <a href="https://github.com/apache/fory/pull/1991" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/1991</a></li>
<li>fix(java): Compatible mode on de/serialize api failed to deserialize by @orisgarno in <a href="https://github.com/apache/fory/pull/1996" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/1996</a></li>
<li>fix(java): chunk map serialize an error by @Hen1ng in <a href="https://github.com/apache/fory/pull/2030" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2030</a></li>
<li>fix(java): fix duplicate entry write at max chunk size bound by @chaokunyang in <a href="https://github.com/apache/fory/pull/2040" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2040</a></li>
<li>fix(java): Remove duplicate maven dependency by @Hen1ng in <a href="https://github.com/apache/fory/pull/2044" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2044</a></li>
<li>fix(python): Fix missing parameters and old API names by @pandalee99 in <a href="https://github.com/apache/fory/pull/2049" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2049</a></li>
<li>fix(java): fix read null chunk out of bound by @chaokunyang in <a href="https://github.com/apache/fory/pull/2065" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2065</a></li>
<li>fix(java): Fix error with <code>MemoryBuffer::readBytesAsInt64</code> when not in LITTLE_ENDIAN mode by @LouisLou2 in <a href="https://github.com/apache/fory/pull/2069" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2069</a></li>
<li>fix(java): fix read primitives error on fill buffer bound by @chaokunyang in <a href="https://github.com/apache/fory/pull/2064" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2064</a></li>
<li>fix(java): java.util.Date and its subclasses are mutable by @moooonk in <a href="https://github.com/apache/fory/pull/2076" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2076</a></li>
<li>fix(java): fix ImmutableCollections$SubList duplicate registration by @w-yfan in <a href="https://github.com/apache/fory/pull/2074" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2074</a></li>
<li>fix(java): Modify some mistake by @Hen1ng in <a href="https://github.com/apache/fory/pull/2086" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2086</a></li>
<li>fix(python): inconsistent struct hash calculation between Java and Python by @LouisLou2 in <a href="https://github.com/apache/fory/pull/2108" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2108</a></li>
<li>fix(java): fix serialization npe of collection with all null elems by @chaokunyang in <a href="https://github.com/apache/fory/pull/2111" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2111</a></li>
<li>fix(java): fix not null value flag by @chaokunyang in <a href="https://github.com/apache/fory/pull/2114" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2114</a></li>
<li>fix(java): use registered id to sort fields by @chaokunyang in <a href="https://github.com/apache/fory/pull/2115" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2115</a></li>
<li>fix(java): fix disallowed.txt check in windows by @chaokunyang in <a href="https://github.com/apache/fory/pull/2128" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2128</a></li>
<li>fix(java): fix nested chunk map serialization error when generics exists by @chaokunyang in <a href="https://github.com/apache/fory/pull/2136" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2136</a></li>
<li>fix(java): fix DisallowedList calculate hash in Windows by @moooonk in <a href="https://github.com/apache/fory/pull/2142" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2142</a></li>
<li>fix(java): fix fury logger log exception by @chaokunyang in <a href="https://github.com/apache/fory/pull/2153" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2153</a></li>
<li>fix(java): fix xlang container field deserialization type error by @chaokunyang in <a href="https://github.com/apache/fory/pull/2161" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2161</a></li>
<li>fix(java): fix nested map chunk serialization codegen by @chaokunyang in <a href="https://github.com/apache/fory/pull/2172" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2172</a></li>
<li>fix(kotlin): fix kotlin compile error by @chaokunyang in <a href="https://github.com/apache/fory/pull/2173" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2173</a></li>
<li>fix(dart): fix inappropriate naming and align test titles by @LouisLou2 in <a href="https://github.com/apache/fory/pull/2180" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2180</a></li>
<li>fix(dart): replace string-based type selection with enum in FixedNum factory method by @LouisLou2 in <a href="https://github.com/apache/fory/pull/2185" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2185</a></li>
<li>fix(java): ensure readVarUint36Small reads full bits regardless of remaining buffer size by @LouisLou2 in <a href="https://github.com/apache/fory/pull/2179" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2179</a></li>
<li>test(java): add test for fix of readVarUint36Small behavior by @LouisLou2 in <a href="https://github.com/apache/fory/pull/2186" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2186</a></li>
<li>fix(python): fix pyfury build using pyproject.toml by @chaokunyang in <a href="https://github.com/apache/fory/pull/2206" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2206</a></li>
<li>fix(java): ensure FuryObjectInputStream.read never returns 0 when length&gt;0 #2204 by @X-czh in <a href="https://github.com/apache/fory/pull/2205" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2205</a></li>
<li>fix(python): TimestampSerializer fails on Windows for naive datetimes near epoch by @LouisLou2 in <a href="https://github.com/apache/fory/pull/2209" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2209</a></li>
<li>fix(java): Fix empty string processing in MetaStringBytes by @LouisLou2 in <a href="https://github.com/apache/fory/pull/2212" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2212</a></li>
<li>fix(java): fix field super class missing in compatible mode by @chaokunyang in <a href="https://github.com/apache/fory/pull/2214" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2214</a></li>
<li>fix(java): mark fury-test-core as test dep in fury extensions by @chaokunyang in <a href="https://github.com/apache/fory/pull/2231" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2231</a></li>
<li>fix(java): MemoryBuffer getRemainingBytes can return unexpected results on a slice by @stevenschlansker in <a href="https://github.com/apache/fory/pull/2237" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2237</a></li>
<li>fix(java): use serialization binding by @Hen1ng in <a href="https://github.com/apache/fory/pull/2241" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2241</a></li>
<li>fix(C++): Fix reversed parameters and incorrect calls in string_util benchmark by @lzaeh in <a href="https://github.com/apache/fory/pull/2246" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2246</a></li>
<li>fix(java): fix row type enum properties by @stevenschlansker in <a href="https://github.com/apache/fory/pull/2258" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2258</a></li>
<li>fix(java): fix generics when write/read null map kv chunk by @chaokunyang in <a href="https://github.com/apache/fory/pull/2261" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2261</a></li>
<li>fix(java): row encoder incorrectly interprets type parameters as cycles by @stevenschlansker in <a href="https://github.com/apache/fory/pull/2265" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2265</a></li>
<li>fix(scala): Ensure singleton classes are initialized before reading by @creddy in <a href="https://github.com/apache/fory/pull/2267" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2267</a></li>
<li>fix(go): fix metastringbytes inconsistency issue by @lzaeh in <a href="https://github.com/apache/fory/pull/2269" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2269</a></li>
<li>fix(java): descriptors for beans should not include static methods by @stevenschlansker in <a href="https://github.com/apache/fory/pull/2281" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2281</a></li>
<li>fix(java): raise exception when registering invalid serializer for Map/List by @OmCheeLin in <a href="https://github.com/apache/fory/pull/2291" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2291</a></li>
<li>fix(java): xlang test skip needs correct import in newer python versions by @stevenschlansker in <a href="https://github.com/apache/fory/pull/2296" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2296</a></li>
<li>fix(java): row encoder interface synthesis handle <code>(Optional) null</code> correctly by @stevenschlansker in <a href="https://github.com/apache/fory/pull/2306" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2306</a></li>
<li>fix(java): Use (long, long, byte) key for MetaStringBytes cache to prevent collisions by @LouisLou2 in <a href="https://github.com/apache/fory/pull/2308" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2308</a></li>
<li>fix(python): update python benchmark script by @penguin-wwy in <a href="https://github.com/apache/fory/pull/2315" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2315</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="other-improvements">Other Improvements<a href="https://fory.apache.org/blog/fory_0_11_0_release#other-improvements" class="hash-link" aria-label="Direct link to Other Improvements" title="Direct link to Other Improvements">​</a></h2>
<ul>
<li>chore(ci): Migrate the ci from macOS 12 to macOS 13 by @penguin-wwy in <a href="https://github.com/apache/fory/pull/1927" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/1927</a></li>
<li>chore: bump release version to 0.9.0 by @chaokunyang in <a href="https://github.com/apache/fory/pull/1940" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/1940</a></li>
<li>chore(Rust): fix lint problems by @theweipeng in <a href="https://github.com/apache/fory/pull/1962" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/1962</a></li>
<li>docs(java): add object mapping example and tests by @chaokunyang in <a href="https://github.com/apache/fory/pull/1974" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/1974</a></li>
<li>chore(python): drop py3.7 support by @chaokunyang in <a href="https://github.com/apache/fory/pull/1981" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/1981</a></li>
<li>chore(c++): Function inlining and code tuning by @pandalee99 in <a href="https://github.com/apache/fory/pull/2002" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2002</a></li>
<li>style(cpp): rename logging level with "FURY_" prefix by @An-DJ in <a href="https://github.com/apache/fory/pull/2016" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2016</a></li>
<li>docs: update copyright date in NOTICE by @caicancai in <a href="https://github.com/apache/fory/pull/2029" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2029</a></li>
<li>docs(java): update java serialization schema compatibility doc by @chaokunyang in <a href="https://github.com/apache/fory/pull/2047" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2047</a></li>
<li>docs: Update to latest version by @theweipeng in <a href="https://github.com/apache/fory/pull/2080" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2080</a></li>
<li>Update snapshot version by @chaokunyang in <a href="https://github.com/apache/fory/pull/2081" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2081</a></li>
<li>chore: remove required_linear_history by @chaokunyang in <a href="https://github.com/apache/fory/pull/2122" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2122</a></li>
<li>chore: fix license issue by @chaokunyang in <a href="https://github.com/apache/fory/pull/2137" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2137</a></li>
<li>chore(java): use the SHA256_HASH field value directly. by @LiangliangSui in <a href="https://github.com/apache/fory/pull/2144" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2144</a></li>
<li>chore(java): Update the content that needs to be corrected when reading the code. by @LiangliangSui in <a href="https://github.com/apache/fory/pull/2143" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2143</a></li>
<li>chore: update copyright year to 2025 by @chaokunyang in <a href="https://github.com/apache/fory/pull/2149" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2149</a></li>
<li>chore: bump release version to 0.10.1 by @chaokunyang in <a href="https://github.com/apache/fory/pull/2151" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2151</a></li>
<li>chore(dart): remove unused <code>dart/fury-test/lib/main.dart</code> by @LouisLou2 in <a href="https://github.com/apache/fory/pull/2181" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2181</a></li>
<li>chore: bump release version to 0.10.2 by @LiangliangSui in <a href="https://github.com/apache/fory/pull/2207" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2207</a></li>
<li>chore(java): reduce java test log by @chaokunyang in <a href="https://github.com/apache/fory/pull/2217" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2217</a></li>
<li>chore(.asf.yaml): enable rebase-and-merge button by @chaokunyang in <a href="https://github.com/apache/fory/pull/2220" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2220</a></li>
<li>chore(github): fix YAML warnings about spaces before comments by @stevenschlansker in <a href="https://github.com/apache/fory/pull/2225" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2225</a></li>
<li>chore(java): janino 3.1.12 by @stevenschlansker in <a href="https://github.com/apache/fory/pull/2226" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2226</a></li>
<li>chore(java): jdk 24 build support by @stevenschlansker in <a href="https://github.com/apache/fory/pull/2224" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2224</a></li>
<li>chore(javascript): remove nodejs 12 support by @chaokunyang in <a href="https://github.com/apache/fory/pull/2233" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2233</a></li>
<li>chore(java): gitignore testng output by @stevenschlansker in <a href="https://github.com/apache/fory/pull/2238" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2238</a></li>
<li>chore: fix clippy warning by @theweipeng in <a href="https://github.com/apache/fory/pull/2240" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2240</a></li>
<li>chore: Delete the redundant comments and add the document by @pandalee99 in <a href="https://github.com/apache/fory/pull/2244" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2244</a></li>
<li>chore: bump release version to 0.10.3 by @pandalee99 in <a href="https://github.com/apache/fory/pull/2252" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2252</a></li>
<li>chore: rename apache fury to apache fory by @chaokunyang in <a href="https://github.com/apache/fory/pull/2263" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2263</a></li>
<li>chore: keep fury for maven artifact by @chaokunyang in <a href="https://github.com/apache/fory/pull/2264" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2264</a></li>
<li>chore(java): skip xlang tests when pyfory is not available by @stevenschlansker in <a href="https://github.com/apache/fory/pull/2266" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2266</a></li>
<li>chore(java): Use <code>crossLanguage</code> instead of <code>language</code> in Fory by @CherishCai in <a href="https://github.com/apache/fory/pull/2274" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2274</a></li>
<li>chore(java): fix xlang test skip in the case where there is no Python at all by @stevenschlansker in <a href="https://github.com/apache/fory/pull/2280" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2280</a></li>
<li>chore(java): gitignore test-output from integration_tests as well as java by @stevenschlansker in <a href="https://github.com/apache/fory/pull/2282" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2282</a></li>
<li>chore: update fory rename in README.md by @chaokunyang in <a href="https://github.com/apache/fory/pull/2292" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2292</a></li>
<li>chore: Some Fory changes in README.md by @pjfanning in <a href="https://github.com/apache/fory/pull/2295" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2295</a></li>
<li>chore: update fory logo by @chaokunyang in <a href="https://github.com/apache/fory/pull/2298" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2298</a></li>
<li>chore(java): skip find customized serializer when absClassInfo is empty by @CherishCai in <a href="https://github.com/apache/fory/pull/2316" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2316</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="new-contributors">New Contributors<a href="https://fory.apache.org/blog/fory_0_11_0_release#new-contributors" class="hash-link" aria-label="Direct link to New Contributors" title="Direct link to New Contributors">​</a></h2>
<ul>
<li>@theigl made their first contribution in <a href="https://github.com/apache/fory/pull/1963" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/1963</a></li>
<li>@AmitPr made their first contribution in <a href="https://github.com/apache/fory/pull/1968" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/1968</a></li>
<li>@zhfeng made their first contribution in <a href="https://github.com/apache/fory/pull/1985" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/1985</a></li>
<li>@Hen1ng made their first contribution in <a href="https://github.com/apache/fory/pull/1722" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/1722</a></li>
<li>@LouisLou2 made their first contribution in <a href="https://github.com/apache/fory/pull/2069" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2069</a></li>
<li>@moooonk made their first contribution in <a href="https://github.com/apache/fory/pull/2076" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2076</a></li>
<li>@w-yfan made their first contribution in <a href="https://github.com/apache/fory/pull/2074" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2074</a></li>
<li>@Cybermaxke made their first contribution in <a href="https://github.com/apache/fory/pull/2101" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2101</a></li>
<li>@X-czh made their first contribution in <a href="https://github.com/apache/fory/pull/2205" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2205</a></li>
<li>@stevenschlansker made their first contribution in <a href="https://github.com/apache/fory/pull/2225" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2225</a></li>
<li>@Kn0688 made their first contribution in <a href="https://github.com/apache/fory/pull/2242" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2242</a></li>
<li>@lzaeh made their first contribution in <a href="https://github.com/apache/fory/pull/2246" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2246</a></li>
<li>@creddy made their first contribution in <a href="https://github.com/apache/fory/pull/2267" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2267</a></li>
<li>@CherishCai made their first contribution in <a href="https://github.com/apache/fory/pull/2274" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2274</a></li>
<li>@OmCheeLin made their first contribution in <a href="https://github.com/apache/fory/pull/2291" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2291</a></li>
<li>@drse made their first contribution in <a href="https://github.com/apache/fory/pull/2300" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/pull/2300</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a href="https://github.com/apache/fory/compare/v0.10.3...v0.11.0-rc2" target="_blank" rel="noopener noreferrer">https://github.com/apache/fory/compare/v0.10.3...v0.11.0-rc2</a></p>]]></content>
        <author>
            <name>Shawn Yang</name>
            <uri>https://github.com/chaokunyang</uri>
        </author>
        <category label="fory" term="fory"/>
    </entry>
</feed>