| <?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-06-25T00: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 v1.3.0 Released]]></title> |
| <id>https://fory.apache.org/blog/fory_1_3_0_release</id> |
| <link href="https://fory.apache.org/blog/fory_1_3_0_release"/> |
| <updated>2026-06-25T00:00:00.000Z</updated> |
| <summary type="html"><![CDATA[The Apache Fory team is pleased to announce the 1.3.0 release. This release includes 8 PRs from 3 distinct contributors and continues to improve the cross-language runtime across supported languages. See the Install page to get the libraries for your platform.]]></summary> |
| <content type="html"><![CDATA[<p>The Apache Fory team is pleased to announce the 1.3.0 release. This release includes <a href="https://github.com/apache/fory/compare/v1.2.0...v1.3.0" target="_blank" rel="noopener noreferrer" class="">8 PRs</a> from 3 distinct contributors and continues to improve the cross-language runtime across supported languages. See the <a href="https://fory.apache.org/docs/start/install" target="_blank" rel="noopener noreferrer" class="">Install</a> page to get the libraries for your platform.</p> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="highlights">Highlights<a href="https://fory.apache.org/blog/fory_1_3_0_release#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no"></a></h2> |
| <ul> |
| <li class="">Python gRPC code generation now defaults to the <code>grpc.aio</code> AsyncIO API, while synchronous <code>grpcio</code> output remains available through <code>--grpc-python-mode=sync</code>.</li> |
| <li class="">Dart joins the generated gRPC service surface: <code>foryc --dart_out=... --grpc</code> now emits <code>package:grpc</code> clients, service bases, method descriptors, and Fory-backed payload serialization.</li> |
| <li class="">Compiler gRPC documentation was refined across languages, including clearer guidance for generated service dependencies and transport behavior.</li> |
| <li class="">Runtime hardening continued with remote schema metadata limits and Java aligned-varint/type-checker fixes.</li> |
| </ul> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="python-async-grpc-mode">Python Async gRPC Mode<a href="https://fory.apache.org/blog/fory_1_3_0_release#python-async-grpc-mode" class="hash-link" aria-label="Direct link to Python Async gRPC Mode" title="Direct link to Python Async gRPC Mode" translate="no"></a></h2> |
| <p>Python gRPC generation now targets AsyncIO by default. Generated companions use |
| <code>grpc.aio</code>: servicer bases expose <code>async def</code> methods, stubs are used with |
| <code>grpc.aio.Channel</code> instances, and streaming RPCs use async iterables. This keeps |
| the generated code aligned with modern Python async services while preserving |
| the same Fory-backed request and response encoding used by the existing gRPC |
| support.</p> |
| <p>Generate the default async companion with:</p> |
| <div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">foryc service.fdl </span><span class="token parameter variable" style="color:#36acaa">--python_out</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">./generated/python </span><span class="token parameter variable" style="color:#36acaa">--grpc</span><br></div></code></pre></div></div> |
| <p>For a simple unary service, the generated async server shape is:</p> |
| <div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> asyncio</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> grpc</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">aio</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> demo_greeter</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> demo_greeter_grpc</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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">Greeter</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">demo_greeter_grpc</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">GreeterServicer</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">async</span><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">say_hello</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"> request</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> context</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> demo_greeter</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">HelloReply</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">reply</span><span class="token operator" style="color:#393A34">=</span><span class="token string-interpolation string" style="color:#e3116c">f"Hello, </span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">request</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 punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">async</span><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">serve</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></div><div class="token-line" style="color:#393A34"><span class="token plain"> server </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> grpc</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">aio</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">server</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> demo_greeter_grpc</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">add_servicer</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Greeter</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"> server</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> server</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">add_insecure_port</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"[::]:50051"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> server</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">start</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> server</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">wait_for_termination</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">asyncio</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 plain">serve</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></div></code></pre></div></div> |
| <p>Clients use a <code>grpc.aio</code> channel and await generated stub methods:</p> |
| <div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> grpc</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> grpc</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">aio</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> demo_greeter</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> demo_greeter_grpc</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">credentials </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> grpc</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ssl_channel_credentials</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">with</span><span class="token plain"> grpc</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">aio</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">secure_channel</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"api.example.com:443"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> credentials</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">as</span><span class="token plain"> channel</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> stub </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> demo_greeter_grpc</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">GreeterStub</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">channel</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> reply </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> stub</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">say_hello</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">demo_greeter</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">HelloRequest</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 string" style="color:#e3116c">"Fory"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><br></div></code></pre></div></div> |
| <p>Existing synchronous applications can still request sync companions explicitly:</p> |
| <div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">foryc service.fdl </span><span class="token parameter variable" style="color:#36acaa">--python_out</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">./generated/python </span><span class="token parameter variable" style="color:#36acaa">--grpc</span><span class="token plain"> --grpc-python-mode</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">sync</span><br></div></code></pre></div></div> |
| <p>In sync mode the generated public names and <code><module>_grpc.py</code> filename stay the |
| same, but applications use <code>grpc.server(...)</code>, standard <code>grpc.Channel</code> |
| instances, and regular <code>def</code> servicer methods.</p> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="dart-grpc-code-generation">Dart gRPC Code Generation<a href="https://fory.apache.org/blog/fory_1_3_0_release#dart-grpc-code-generation" class="hash-link" aria-label="Direct link to Dart gRPC Code Generation" title="Direct link to Dart gRPC Code Generation" translate="no"></a></h2> |
| <p>Fory 1.3.0 adds Dart gRPC service generation for schemas with service |
| definitions. Service definitions can come from Fory IDL, protobuf IDL, or |
| FlatBuffers <code>rpc_service</code> definitions. The generated code uses normal |
| grpc-dart APIs for clients, service bases, method descriptors, call options, |
| deadlines, cancellations, metadata, and status codes, while each request and |
| response object is serialized with Fory instead of protobuf message bytes.</p> |
| <p>Add <code>grpc</code> and <code>build_runner</code> alongside the Fory package in the Dart |
| application:</p> |
| <div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">dependencies</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">fory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ^1.3.0</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">grpc</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ^4.0.0</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">dev_dependencies</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">build_runner</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ^2.4.0</span><br></div></code></pre></div></div> |
| <p>Generate Dart models and the gRPC companion with:</p> |
| <div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">foryc service.fdl </span><span class="token parameter variable" style="color:#36acaa">--dart_out</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">./lib/generated </span><span class="token parameter variable" style="color:#36acaa">--grpc</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">dart run build_runner build --delete-conflicting-outputs</span><br></div></code></pre></div></div> |
| <p>For a <code>demo.greeter</code> package, the generator emits the model file, the |
| <code>build_runner</code> serializer part, and a <code><stem>_grpc.dart</code> companion with |
| <code>GreeterServiceBase</code> and <code>GreeterClient</code>. The generated client and service base |
| install the schema's Fory module automatically on first use, so service |
| implementations do not need a separate manual registration step for the |
| generated message types.</p> |
| <p>A unary Dart server uses grpc-dart's <code>Server</code> and the generated service base:</p> |
| <div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e3116c">'dart:io'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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-literal string" style="color:#e3116c">'package:grpc/grpc.dart'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div 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-literal string" style="color:#e3116c">'demo/greeter/greeter.dart'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div 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-literal string" style="color:#e3116c">'demo/greeter/greeter_grpc.dart'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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">GreeterService</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">extends</span><span class="token plain"> </span><span class="token class-name">GreeterServiceBase</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token metadata function" style="color:#d73a49">@override</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">Future</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">HelloReply</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> </span><span class="token function" style="color:#d73a49">sayHello</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">ServiceCall</span><span class="token plain"> call</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">HelloRequest</span><span class="token plain"> request</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div 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 class-name">HelloReply</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">reply </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e3116c">'Hello, </span><span class="token string-literal interpolation punctuation" style="color:#393A34">${</span><span class="token string-literal interpolation expression">request</span><span class="token string-literal interpolation expression punctuation" style="color:#393A34">.</span><span class="token string-literal interpolation expression">name</span><span class="token string-literal interpolation punctuation" style="color:#393A34">}</span><span class="token string-literal string" style="color:#e3116c">'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token class-name">Future</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics keyword" style="color:#00009f">void</span><span class="token generics punctuation" style="color:#393A34">></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 keyword" style="color:#00009f">async</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> server </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Server</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">create</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">services</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 class-name">GreeterService</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><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> server</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">serve</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">address</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">InternetAddress</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">loopbackIPv4</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">50051</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div> |
| <p>Generated Dart clients use standard <code>ClientChannel</code> values and return the |
| grpc-dart call types:</p> |
| <div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e3116c">'package:grpc/grpc.dart'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div 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-literal string" style="color:#e3116c">'demo/greeter/greeter.dart'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div 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-literal string" style="color:#e3116c">'demo/greeter/greeter_grpc.dart'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> channel </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">ClientChannel</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token string-literal string" style="color:#e3116c">'localhost'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">50051</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> options</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token class-name">ChannelOptions</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">credentials</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">ChannelCredentials</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">insecure</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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> client </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">GreeterClient</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">channel</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> reply </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> client</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">sayHello</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">HelloRequest</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">name </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e3116c">'Fory'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> channel</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">shutdown</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></div></code></pre></div></div> |
| <p>Dart generation covers unary, server-streaming, client-streaming, and |
| bidirectional streaming RPC shapes following grpc-dart conventions.</p> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="features">Features<a href="https://fory.apache.org/blog/fory_1_3_0_release#features" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features" translate="no"></a></h2> |
| <ul> |
| <li class="">feat(python): add async grpc mode for python by @chaokunyang in <a href="https://github.com/apache/fory/pull/3768" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3768</a></li> |
| <li class="">feat: limit remote schema metadata by @chaokunyang in <a href="https://github.com/apache/fory/pull/3770" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3770</a></li> |
| <li class="">feat(compiler): add dart gRPC codegen by @yash-agarwa-l in <a href="https://github.com/apache/fory/pull/3723" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3723</a></li> |
| </ul> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bug-fix">Bug Fix<a href="https://fory.apache.org/blog/fory_1_3_0_release#bug-fix" class="hash-link" aria-label="Direct link to Bug Fix" title="Direct link to Bug Fix" translate="no"></a></h2> |
| <ul> |
| <li class="">fix(java): guard aligned varint unsafe read by @chaokunyang in <a href="https://github.com/apache/fory/pull/3772" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3772</a></li> |
| <li class="">fix(java): cache accepted type checker classes by @chaokunyang in <a href="https://github.com/apache/fory/pull/3773" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3773</a></li> |
| </ul> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="other-improvements">Other Improvements<a href="https://fory.apache.org/blog/fory_1_3_0_release#other-improvements" class="hash-link" aria-label="Direct link to Other Improvements" title="Direct link to Other Improvements" translate="no"></a></h2> |
| <ul> |
| <li class="">docs: refine gRPC support guides by @chaokunyang in <a href="https://github.com/apache/fory/pull/3767" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3767</a></li> |
| <li class="">docs: add threat model + SECURITY.md/AGENTS.md discoverability by @potiuk in <a href="https://github.com/apache/fory/pull/3734" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3734</a></li> |
| <li class="">chore(release): enforce OpenJDK 25 for JVM publishing by @chaokunyang in <a href="https://github.com/apache/fory/pull/3775" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3775</a></li> |
| </ul> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-contributors">New Contributors<a href="https://fory.apache.org/blog/fory_1_3_0_release#new-contributors" class="hash-link" aria-label="Direct link to New Contributors" title="Direct link to New Contributors" translate="no"></a></h2> |
| <ul> |
| <li class="">@potiuk made their first contribution in <a href="https://github.com/apache/fory/pull/3734" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3734</a></li> |
| </ul> |
| <p><strong>Full Changelog</strong>: <a href="https://github.com/apache/fory/compare/v1.2.0...v1.3.0" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/compare/v1.2.0...v1.3.0</a></p>]]></content> |
| <author> |
| <name>Shawn Yang</name> |
| <uri>https://github.com/chaokunyang</uri> |
| </author> |
| <category label="fory" term="fory"/> |
| <category label="java" term="java"/> |
| <category label="kotlin" term="kotlin"/> |
| <category label="scala" term="scala"/> |
| <category label="android" term="android"/> |
| <category label="python" term="python"/> |
| <category label="rust" term="rust"/> |
| <category label="c++" term="c++"/> |
| <category label="go" term="go"/> |
| <category label="c#" term="c#"/> |
| <category label="swift" term="swift"/> |
| <category label="dart" term="dart"/> |
| <category label="compiler" term="compiler"/> |
| </entry> |
| <entry> |
| <title type="html"><![CDATA[Fory v1.2.0 Released]]></title> |
| <id>https://fory.apache.org/blog/fory_1_2_0_release</id> |
| <link href="https://fory.apache.org/blog/fory_1_2_0_release"/> |
| <updated>2026-06-16T00:00:00.000Z</updated> |
| <summary type="html"><![CDATA[The Apache Fory team is pleased to announce the 1.2.0 release. This release includes 38 PRs from 9 distinct contributors and continues to improve the cross-language runtime across supported languages. See the Install page to get the libraries for your platform.]]></summary> |
| <content type="html"><![CDATA[<p>The Apache Fory team is pleased to announce the 1.2.0 release. This release includes <a href="https://github.com/apache/fory/compare/v1.1.0...v1.2.0" target="_blank" rel="noopener noreferrer" class="">38 PRs</a> from 9 distinct contributors and continues to improve the cross-language runtime across supported languages. See the <a href="https://fory.apache.org/docs/start/install" target="_blank" rel="noopener noreferrer" class="">Install</a> page to get the libraries for your platform.</p> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="highlights">Highlights<a href="https://fory.apache.org/blog/fory_1_2_0_release#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no"></a></h2> |
| <ul> |
| <li class="">Expanded generated gRPC support across Go, Rust, Kotlin, Scala, C#, and JavaScript, including Node.js and browser gRPC-Web support for JavaScript.</li> |
| <li class="">Improved cross-language compatibility with refined register-by-name APIs, compatible scalar read conversions, and default compatible mode for native serialization.</li> |
| <li class="">Strengthened Java platform support by adding Java 9/16 module-info generation and removing <code>sun.misc.Unsafe</code> usage for JDK 25.</li> |
| <li class="">Improved runtime safety and robustness with additional read checks, deflater leak fixes, and safer serializer/type-info error handling.</li> |
| <li class="">Optimized compatible-mode and row-format performance through faster compatible reads, compact row layout caching, and inlined custom-codec dispatch.</li> |
| <li class="">Enhanced compiler output quality across Rust, C++, and service generation with better identifier escaping, name-collision handling, nested container reference handling, and map code generation.</li> |
| </ul> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="java-25-without-sunmiscunsafe">Java 25+ Without <code>sun.misc.Unsafe</code><a href="https://fory.apache.org/blog/fory_1_2_0_release#java-25-without-sunmiscunsafe" class="hash-link" aria-label="Direct link to java-25-without-sunmiscunsafe" title="Direct link to java-25-without-sunmiscunsafe" translate="no"></a></h2> |
| <p>JDK 25 continues the platform shift away from <code>sun.misc.Unsafe</code>. Fory 1.2.0 |
| adds a Java 25 multi-release implementation for the core runtime so applications |
| can run on JDK 25+ without resolving <code>sun.misc.Unsafe</code> from Fory's active class |
| graph.</p> |
| <p>The implementation keeps the fast JDK 8-24 paths for older runtimes, but JDK 25+ |
| loads replacement classes from the versioned jar area. Those replacements move |
| field access and memory-buffer primitives to supported JVM mechanisms such as |
| <code>VarHandle</code>, <code>MethodHandle</code>, arrays, and <code>ByteBuffer</code>. Constructor-bypassing |
| allocation is also handled explicitly: on JDK 25+ classes that previously |
| depended on Unsafe allocation should provide an accessible no-arg constructor, |
| use record construction, or register a custom serializer.</p> |
| <p>This is an important compatibility milestone for Java users because the runtime |
| no longer depends on a terminally deprecated Unsafe API path when the application |
| runs on Java 25 and later.</p> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="compatible-scalar-field-reads">Compatible Scalar Field Reads<a href="https://fory.apache.org/blog/fory_1_2_0_release#compatible-scalar-field-reads" class="hash-link" aria-label="Direct link to Compatible Scalar Field Reads" title="Direct link to Compatible Scalar Field Reads" translate="no"></a></h2> |
| <p>Compatible mode already allows readers and writers to add, remove, and reorder |
| fields. Fory 1.2.0 extends that model to selected scalar type changes: when a |
| matched top-level field changes between boolean, string, numeric, and decimal |
| types, the reader can deserialize the value if the conversion is lossless.</p> |
| <p>Examples include reading <code>"123"</code> as an integer field, reading <code>1</code> or <code>0</code> as a |
| boolean field, reading booleans as <code>1</code>/<code>0</code>, reading numbers or decimals as |
| canonical strings, and widening or narrowing numeric values only when no range |
| or precision is lost. Invalid strings, out-of-range values, lossy float/integer |
| conversions, and reference-tracked scalar type changes fail during |
| deserialization. The conversion applies to matched compatible fields, not to |
| root values or collection elements.</p> |
| <p>The examples below show Rust, Python, Java, and C++, but compatible scalar field |
| conversion is supported across Fory's compatible-mode runtimes: Java, Python, |
| Rust, C++, Go, C#, Swift, Dart, JavaScript/TypeScript, Kotlin, and Scala.</p> |
| <p>Compatible mode is enabled by default in the Java and Python runtimes for both |
| xlang and native serialization. You can still make the setting explicit:</p> |
| <div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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 plain"></span><br></div><div 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">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 plain"></span><br></div><div 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">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 plain"></span><br></div><div 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><br></div></code></pre></div></div> |
| <div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> pyfory</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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"> compatible</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></div><div class="token-line" style="color:#393A34"><span class="token plain">native_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"> compatible</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><br></div></code></pre></div></div> |
| <p>Rust example:</p> |
| <div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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">ForyStruct</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token attribute attr-name" style="color:#00a4db">#[derive(ForyStruct)]</span><span class="token plain"></span><br></div><div 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">MetricV1</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div 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">i64</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token attribute attr-name" style="color:#00a4db">#[derive(ForyStruct)]</span><span class="token plain"></span><br></div><div 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">MetricV2</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div 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 class-name">String</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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"> writer </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">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">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">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></div><div class="token-line" style="color:#393A34"><span class="token plain">writer</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">register_by_name</span><span class="token punctuation" style="color:#393A34">::</span><span class="token operator" style="color:#393A34"><</span><span class="token class-name">MetricV1</span><span class="token operator" style="color:#393A34">></span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"example.Metric"</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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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"> reader </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">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">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">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></div><div class="token-line" style="color:#393A34"><span class="token plain">reader</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">register_by_name</span><span class="token punctuation" style="color:#393A34">::</span><span class="token operator" style="color:#393A34"><</span><span class="token class-name">MetricV2</span><span class="token operator" style="color:#393A34">></span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"example.Metric"</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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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"> writer</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">&</span><span class="token class-name">MetricV1</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> value</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">42</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 operator" style="color:#393A34">?</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> value</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">MetricV2</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> reader</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">&</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></div><div 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">value</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">value</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"42"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div> |
| <p>Python example:</p> |
| <div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token decorator annotation punctuation" style="color:#393A34">@dataclass</span><span class="token plain"></span><br></div><div 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">MetricV1</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> value</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> pyfory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Int64</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token decorator annotation punctuation" style="color:#393A34">@dataclass</span><span class="token plain"></span><br></div><div 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">MetricV2</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div 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 builtin">str</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">writer </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"> compatible</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></div><div class="token-line" style="color:#393A34"><span class="token plain">writer</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">MetricV1</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 string" style="color:#e3116c">"example.Metric"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">reader </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"> compatible</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></div><div class="token-line" style="color:#393A34"><span class="token plain">reader</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">MetricV2</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 string" style="color:#e3116c">"example.Metric"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">data </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> writer</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">MetricV1</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 punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">assert</span><span class="token plain"> reader</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">data</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">value </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"42"</span><br></div></code></pre></div></div> |
| <p>Java example:</p> |
| <div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><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">MetricV1</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div 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">long</span><span class="token plain"> value</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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">MetricV2</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div 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 class-name">String</span><span class="token plain"> value</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token class-name">Fory</span><span class="token plain"> writer </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">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 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 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></div><div class="token-line" style="color:#393A34"><span class="token plain">writer</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">MetricV1</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 string" style="color:#e3116c">"example"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Metric"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token class-name">Fory</span><span class="token plain"> reader </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">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 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 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></div><div class="token-line" style="color:#393A34"><span class="token plain">reader</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">MetricV2</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 string" style="color:#e3116c">"example"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Metric"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token class-name">MetricV1</span><span class="token plain"> source </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">MetricV1</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></div><div class="token-line" style="color:#393A34"><span class="token plain">source</span><span class="token punctuation" style="color:#393A34">.</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">42L</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div 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"> writer</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">source</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token class-name">MetricV2</span><span class="token plain"> value </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> reader</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">MetricV2</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></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">assert</span><span class="token plain"> value</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">value</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">equals</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"42"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div> |
| <p>C++ example:</p> |
| <div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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"><cassert></span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><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"><string></span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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">MetricV1</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">int64_t</span><span class="token plain"> value</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div 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></div><div 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">MetricV1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> value</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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">MetricV2</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div 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 value</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div 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></div><div 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">MetricV2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> value</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">auto</span><span class="token plain"> writer </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">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">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></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">auto</span><span class="token plain"> reader </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">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">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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">writer</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"><</span><span class="token generic-function generic class-name">MetricV1</span><span class="token generic-function generic class-name operator" style="color:#393A34">></span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"example"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Metric"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">reader</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"><</span><span class="token generic-function generic class-name">MetricV2</span><span class="token generic-function generic class-name operator" style="color:#393A34">></span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"example"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Metric"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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"> writer</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">MetricV1</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 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></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">auto</span><span class="token plain"> value </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> reader</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"><</span><span class="token generic-function generic class-name">MetricV2</span><span class="token generic-function generic class-name operator" 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 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></div><div 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">value</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">value </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"42"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div> |
| <p>The same rule works in the other direction, for example reading a <code>String</code> |
| field value such as <code>"42"</code> as <code>int64</code>, when the string uses Fory's strict |
| finite decimal grammar and the target range can represent the value exactly.</p> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="generated-grpc-support">Generated gRPC Support<a href="https://fory.apache.org/blog/fory_1_2_0_release#generated-grpc-support" class="hash-link" aria-label="Direct link to Generated gRPC Support" title="Direct link to Generated gRPC Support" translate="no"></a></h2> |
| <p>Fory 1.2.0 expands compiler-generated gRPC service companions. The generated |
| services use standard gRPC transports, channels, deadlines, metadata, |
| interceptors, status codes, and streaming shapes, while request and response |
| objects are encoded with Fory instead of protobuf message bytes. Use this mode |
| when both sides of the RPC are generated from the same Fory IDL, protobuf IDL, |
| or FlatBuffers IDL and you want gRPC operational semantics with Fory payload |
| encoding.</p> |
| <p>Generated gRPC support now covers Java, Python, Go, Rust, C#, Scala, Kotlin, |
| and JavaScript/TypeScript. JavaScript includes Node.js gRPC support and browser |
| gRPC-Web client generation.</p> |
| <p>The examples below use this shared schema:</p> |
| <div class="language-protobuf codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-protobuf codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">package</span><span class="token plain"> demo</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">greeter</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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">HelloRequest</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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">HelloReply</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token builtin">string</span><span class="token plain"> reply </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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">service</span><span class="token plain"> </span><span class="token class-name">Greeter</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">rpc</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">SayHello</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">HelloRequest</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">returns</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">HelloReply</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div> |
| <p>Rust generation emits tonic-based service API and binding modules:</p> |
| <div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">foryc service.fdl </span><span class="token parameter variable" style="color:#36acaa">--rust_out</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">./generated/rust </span><span class="token parameter variable" style="color:#36acaa">--grpc</span><br></div></code></pre></div></div> |
| <div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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">demo_greeter</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">HelloReply</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">HelloRequest</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div 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">demo_greeter_service</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">::</span><span class="token class-name">Greeter</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div 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">demo_greeter_service_grpc</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">::</span><span class="token namespace" style="opacity:0.7">greeter_client</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">::</span><span class="token class-name">GreeterClient</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div 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">demo_greeter_service_grpc</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">::</span><span class="token namespace" style="opacity:0.7">greeter_server</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">::</span><span class="token class-name">GreeterServer</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token namespace" style="opacity:0.7">tonic</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">::</span><span class="token namespace" style="opacity:0.7">transport</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">::</span><span class="token class-name">Server</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 plain"></span><br></div><div 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">add_service</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">GreeterServer</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">MyGreeter</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 punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div 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">serve</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">addr</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token keyword" style="color:#00009f">await</span><span class="token operator" style="color:#393A34">?</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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"> client </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">GreeterClient</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">connect</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"http://[::1]:50051"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token keyword" style="color:#00009f">await</span><span class="token operator" style="color:#393A34">?</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> reply </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> client</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">say_hello</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">HelloRequest</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">"Fory"</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 punctuation" style="color:#393A34">.</span><span class="token keyword" style="color:#00009f">await</span><span class="token operator" style="color:#393A34">?</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div> |
| <p>Go generation emits grpc-go interfaces and a Fory-backed <code>CodecV2</code>:</p> |
| <div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">foryc service.fdl </span><span class="token parameter variable" style="color:#36acaa">--go_out</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">./generated/go </span><span class="token parameter variable" style="color:#36acaa">--grpc</span><br></div></code></pre></div></div> |
| <div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">server </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> grpc</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">NewServer</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> grpc</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">ForceServerCodecV2</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">greeter</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">CodecV2</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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain">greeter</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">RegisterGreeterServer</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">server</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> greeterService</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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">client </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> greeter</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">NewGreeterClient</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">conn</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">reply</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"> client</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">SayHello</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ctx</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">greeter</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">HelloRequest</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">"Fory"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><br></div></code></pre></div></div> |
| <p>JavaScript generation supports both Node.js gRPC and browser gRPC-Web:</p> |
| <div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">foryc service.fdl </span><span class="token parameter variable" style="color:#36acaa">--javascript_out</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">./generated/javascript </span><span class="token parameter variable" style="color:#36acaa">--grpc</span><span class="token plain"> --grpc-web</span><br></div></code></pre></div></div> |
| <div class="language-ts codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-ts codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</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">as</span><span class="token plain"> grpc </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"@grpc/grpc-js"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div 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"> addGreeterService</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> createGreeterClient </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">"./service_grpc"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div 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"> createGreeterWebPromiseClient </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">"./service_grpc_web"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">addGreeterService</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">server</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> greeterHandlers</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> nodeClient </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">createGreeterClient</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token string" style="color:#e3116c">"localhost:50051"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> grpc</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">credentials</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">createInsecure</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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain">nodeClient</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">sayHello</span><span class="token punctuation" style="color:#393A34">(</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">"Fory"</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"> callback</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> webClient </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">createGreeterWebPromiseClient</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"https://api.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></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> reply </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> webClient</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">sayHello</span><span class="token punctuation" style="color:#393A34">(</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">"Fory"</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></div></code></pre></div></div> |
| <p>Browser gRPC-Web follows gRPC-Web transport limits: unary and server-streaming |
| methods are supported, while client-streaming and bidirectional streaming remain |
| Node.js/native gRPC shapes.</p> |
| <p>Kotlin generation emits grpc-kotlin coroutine companions:</p> |
| <div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">foryc service.fdl </span><span class="token parameter variable" style="color:#36acaa">--kotlin_out</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">./generated/kotlin </span><span class="token parameter variable" style="color:#36acaa">--grpc</span><br></div></code></pre></div></div> |
| <div class="language-kotlin codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-kotlin codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> GreeterService </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> GreeterGrpcKt</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">GreeterCoroutineImplBase</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></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">override</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">suspend</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">fun</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">sayHello</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">request</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> HelloRequest</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> HelloReply </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token function" style="color:#d73a49">HelloReply</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">reply </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string-literal singleline string" style="color:#e3116c">"Hello, </span><span class="token string-literal singleline interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token string-literal singleline interpolation expression">request</span><span class="token string-literal singleline interpolation expression punctuation" style="color:#393A34">.</span><span class="token string-literal singleline interpolation expression">name</span><span class="token string-literal singleline interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token string-literal singleline string" style="color:#e3116c">"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">val</span><span class="token plain"> server </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> ServerBuilder</span><br></div><div 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">forPort</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">50051</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div 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">addService</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">GreeterService</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></div><div 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 plain"></span><br></div><div 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">start</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">val</span><span class="token plain"> stub </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> GreeterGrpcKt</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">GreeterCoroutineStub</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">channel</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">val</span><span class="token plain"> reply </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> stub</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">sayHello</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">HelloRequest</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-literal singleline string" style="color:#e3116c">"Fory"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><br></div></code></pre></div></div> |
| <p>Scala generation emits Scala 3 grpc-java companions with Scala-friendly client |
| handles:</p> |
| <div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">foryc service.fdl </span><span class="token parameter variable" style="color:#36acaa">--scala_out</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">./generated/scala </span><span class="token parameter variable" style="color:#36acaa">--grpc</span><br></div></code></pre></div></div> |
| <div class="language-scala codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-scala codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> GreeterService </span><span class="token keyword" style="color:#00009f">extends</span><span class="token plain"> GreeterGrpc</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">GreeterImplBase </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">override</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> sayHello</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">request</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> HelloRequest</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> HelloReply </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> HelloReply</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-interpolation id function" style="color:#d73a49">s</span><span class="token string-interpolation string" style="color:#e3116c">"Hello, </span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">${</span><span class="token string-interpolation interpolation expression">request</span><span class="token string-interpolation interpolation expression punctuation" style="color:#393A34">.</span><span class="token string-interpolation interpolation expression">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 punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">val</span><span class="token plain"> server </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> ServerBuilder</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">forPort</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">50051</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">addService</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> GreeterService</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">build</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">start</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">val</span><span class="token plain"> client </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> GreeterGrpc</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">newClient</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">channel</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">val</span><span class="token plain"> reply </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Await</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 plain">client</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sayHello</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">HelloRequest</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"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">asFuture</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 plain">seconds</span><span class="token punctuation" style="color:#393A34">)</span><br></div></code></pre></div></div> |
| <p>The generated gRPC companions intentionally do not make gRPC a hard dependency |
| of the core Fory language packages. Applications add the transport libraries |
| they use: grpc-java for Java and Scala, <code>grpcio</code> for Python, grpc-go for Go, |
| <code>tonic</code>/<code>bytes</code> for Rust, .NET gRPC packages for C#, <code>@grpc/grpc-js</code> or |
| <code>grpc-web</code> for JavaScript, and grpc-java/grpc-kotlin for Kotlin.</p> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="features">Features<a href="https://fory.apache.org/blog/fory_1_2_0_release#features" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features" translate="no"></a></h2> |
| <ul> |
| <li class="">feat(java): add java9/16 module-info support by @chaokunyang in <a href="https://github.com/apache/fory/pull/3721" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3721</a></li> |
| <li class="">refactor(format): inline custom-codec dispatch in row codecs by @stevenschlansker in <a href="https://github.com/apache/fory/pull/3716" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3716</a></li> |
| <li class="">perf(format): cache compact row layout per nested slot by @stevenschlansker in <a href="https://github.com/apache/fory/pull/3717" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3717</a></li> |
| <li class="">feat(java): remove sun.misc.Unsafe for jdk25 by @chaokunyang in <a href="https://github.com/apache/fory/pull/3702" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3702</a></li> |
| <li class="">feat(rust): support thread safe <code>Arc<dyn Any + Send + Sync></code> type by @chaokunyang in <a href="https://github.com/apache/fory/pull/3736" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3736</a></li> |
| <li class="">refactor(rust): refactor sync send type by @chaokunyang in <a href="https://github.com/apache/fory/pull/3737" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3737</a></li> |
| <li class="">feat(xlang): refine register by name api by @chaokunyang in <a href="https://github.com/apache/fory/pull/3739" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3739</a></li> |
| <li class="">feat(xlang): support compatible scalar read conversions by @chaokunyang in <a href="https://github.com/apache/fory/pull/3740" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3740</a></li> |
| <li class="">feat: default compatible mode for native serialization by @chaokunyang in <a href="https://github.com/apache/fory/pull/3742" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3742</a></li> |
| <li class="">perf: optimize compatible mode read performance by @chaokunyang in <a href="https://github.com/apache/fory/pull/3743" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3743</a></li> |
| <li class="">feat(compiler): handle Rust identifier escaping and name collisions by @BaldDemian in <a href="https://github.com/apache/fory/pull/3744" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3744</a></li> |
| <li class="">feat(go): implement grpc stub generation by @ayush00git in <a href="https://github.com/apache/fory/pull/3698" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3698</a></li> |
| <li class="">refactor(compiler): generate C++ unordered map for Fory map by @BaldDemian in <a href="https://github.com/apache/fory/pull/3745" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3745</a></li> |
| <li class="">feat(compiler): handle nested container ref pointer options in C++ compiler correctly by @BaldDemian in <a href="https://github.com/apache/fory/pull/3735" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3735</a></li> |
| <li class="">feat: add more read checks by @chaokunyang in <a href="https://github.com/apache/fory/pull/3748" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3748</a></li> |
| <li class="">feat(compiler): support Rust gRPC code generation by @BaldDemian in <a href="https://github.com/apache/fory/pull/3738" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3738</a></li> |
| <li class="">feat(cpp): support struct property accessors by @chaokunyang in <a href="https://github.com/apache/fory/pull/3751" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3751</a></li> |
| <li class="">feat(python): make scalar wire markers typing-friendly by @chaokunyang in <a href="https://github.com/apache/fory/pull/3756" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3756</a></li> |
| <li class="">feat(kotlin): add kotlin grpc support by @chaokunyang in <a href="https://github.com/apache/fory/pull/3757" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3757</a></li> |
| <li class="">feat(rust): make fory-derive generated code use exported api in fory rust lib by @chaokunyang in <a href="https://github.com/apache/fory/pull/3759" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3759</a></li> |
| <li class="">feat(scala): add generated grpc service support for scala by @chaokunyang in <a href="https://github.com/apache/fory/pull/3762" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3762</a></li> |
| <li class="">feat(csharp): add generated grpc support for C# by @chaokunyang in <a href="https://github.com/apache/fory/pull/3761" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3761</a></li> |
| <li class="">feat(javascript): add javascript gRPC support for nodejs/browser by @chaokunyang in <a href="https://github.com/apache/fory/pull/3760" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3760</a></li> |
| </ul> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bug-fix">Bug Fix<a href="https://fory.apache.org/blog/fory_1_2_0_release#bug-fix" class="hash-link" aria-label="Direct link to Bug Fix" title="Direct link to Bug Fix" translate="no"></a></h2> |
| <ul> |
| <li class="">fix(go): return nil serializer on getTypeInfo err by @ayush00git in <a href="https://github.com/apache/fory/pull/3719" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3719</a></li> |
| <li class="">fix(benchmarks): uses outdated google-java-format, upgrade spotless by @stevenschlansker in <a href="https://github.com/apache/fory/pull/3722" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3722</a></li> |
| <li class="">fix(format): pass row body size, not full payload size, to BinaryRow.pointTo by @stevenschlansker in <a href="https://github.com/apache/fory/pull/3715" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3715</a></li> |
| <li class="">fix(java): fix deflater memory leak by @MNTMDEV in <a href="https://github.com/apache/fory/pull/3726" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3726</a></li> |
| <li class="">fix(compiler): handle nested container ref pointer options in Rust compiler correctly by @BaldDemian in <a href="https://github.com/apache/fory/pull/3731" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3731</a></li> |
| <li class="">fix(java): ignore non-Scala/Lombok-style default helper methods by @mandrean in <a href="https://github.com/apache/fory/pull/3733" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3733</a></li> |
| <li class="">fix(c++): std::unordered_map cannot be used in struct. (#3727) by @ruoruoniao in <a href="https://github.com/apache/fory/pull/3728" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3728</a></li> |
| <li class="">fix(grpc): fix rust/go grpc support by @chaokunyang in <a href="https://github.com/apache/fory/pull/3753" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3753</a></li> |
| <li class="">fix(cpp): align unsigned struct default encoding by @chaokunyang in <a href="https://github.com/apache/fory/pull/3754" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3754</a></li> |
| </ul> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="other-improvements">Other Improvements<a href="https://fory.apache.org/blog/fory_1_2_0_release#other-improvements" class="hash-link" aria-label="Direct link to Other Improvements" title="Direct link to Other Improvements" translate="no"></a></h2> |
| <ul> |
| <li class="">chore(deps): fix vulnerable dependencies by @chaokunyang in <a href="https://github.com/apache/fory/pull/3741" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3741</a></li> |
| <li class="">chore: Bump MessagePack from 2.5.187 to 2.5.301 by @dependabot[bot] in <a href="https://github.com/apache/fory/pull/3750" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3750</a></li> |
| <li class="">chore(deps): bump Go gRPC test dependencies by @chaokunyang in <a href="https://github.com/apache/fory/pull/3763" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3763</a></li> |
| </ul> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-contributors">New Contributors<a href="https://fory.apache.org/blog/fory_1_2_0_release#new-contributors" class="hash-link" aria-label="Direct link to New Contributors" title="Direct link to New Contributors" translate="no"></a></h2> |
| <ul> |
| <li class="">@MNTMDEV made their first contribution in <a href="https://github.com/apache/fory/pull/3726" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3726</a></li> |
| <li class="">@ruoruoniao made their first contribution in <a href="https://github.com/apache/fory/pull/3728" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3728</a></li> |
| </ul> |
| <p><strong>Full Changelog</strong>: <a href="https://github.com/apache/fory/compare/v1.1.0...v1.2.0" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/compare/v1.1.0...v1.2.0</a></p>]]></content> |
| <author> |
| <name>Shawn Yang</name> |
| <uri>https://github.com/chaokunyang</uri> |
| </author> |
| <category label="fory" term="fory"/> |
| <category label="java" term="java"/> |
| <category label="kotlin" term="kotlin"/> |
| <category label="scala" term="scala"/> |
| <category label="android" term="android"/> |
| <category label="python" term="python"/> |
| <category label="rust" term="rust"/> |
| <category label="c++" term="c++"/> |
| <category label="go" term="go"/> |
| <category label="c#" term="c#"/> |
| <category label="swift" term="swift"/> |
| <category label="dart" term="dart"/> |
| <category label="compiler" term="compiler"/> |
| </entry> |
| <entry> |
| <title type="html"><![CDATA[Fory v1.1.0 Released]]></title> |
| <id>https://fory.apache.org/blog/fory_1_1_0_release</id> |
| <link href="https://fory.apache.org/blog/fory_1_1_0_release"/> |
| <updated>2026-05-31T00:00:00.000Z</updated> |
| <summary type="html"><![CDATA[The Apache Fory team is pleased to announce the 1.1.0 release. This release includes 18 PRs from 4 distinct contributors and continues to improve the cross-language runtime across supported languages. See the Install page to get the libraries for your platform.]]></summary> |
| <content type="html"><![CDATA[<p>The Apache Fory team is pleased to announce the 1.1.0 release. This release includes <a href="https://github.com/apache/fory/compare/v1.0.0...v1.1.0" target="_blank" rel="noopener noreferrer" class="">18 PRs</a> from 4 distinct contributors and continues to improve the cross-language runtime across supported languages. See the <a href="https://fory.apache.org/docs/start/install" target="_blank" rel="noopener noreferrer" class="">Install</a> page to get the libraries for your platform.</p> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="highlights">Highlights<a href="https://fory.apache.org/blog/fory_1_1_0_release#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no"></a></h2> |
| <ul> |
| <li class="">Added Java/Python gRPC support in the compiler.</li> |
| <li class="">Improved xlang union handling with unknown union case support and sealed record generation for C# unions.</li> |
| </ul> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="features">Features<a href="https://fory.apache.org/blog/fory_1_1_0_release#features" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features" translate="no"></a></h2> |
| <ul> |
| <li class="">feat(compiler): add java/python gRPC support by @chaokunyang in <a href="https://github.com/apache/fory/pull/3692" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3692</a></li> |
| <li class="">refactor(csharp): split Fory object attributes by @chaokunyang in <a href="https://github.com/apache/fory/pull/3709" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3709</a></li> |
| <li class="">feat(c#): use sealed record for c# union by @chaokunyang in <a href="https://github.com/apache/fory/pull/3710" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3710</a></li> |
| <li class="">feat(xlang): support unknown union case in union type by @chaokunyang in <a href="https://github.com/apache/fory/pull/3711" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3711</a></li> |
| <li class="">refactor(compiler): rename generated schema owners to modules by @chaokunyang in <a href="https://github.com/apache/fory/pull/3713" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3713</a></li> |
| </ul> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bug-fixes">Bug Fixes<a href="https://fory.apache.org/blog/fory_1_1_0_release#bug-fixes" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes" translate="no"></a></h2> |
| <ul> |
| <li class="">fix(c++): propagate /Zc<!-- -->:preprocessor<!-- --> on MSVC for FORY_STRUCT consumers by @truffle-dev in <a href="https://github.com/apache/fory/pull/3694" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3694</a></li> |
| <li class="">fix(cpp): repair CMake tests and examples by @chaokunyang in <a href="https://github.com/apache/fory/pull/3699" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3699</a></li> |
| <li class="">fix(java): guard replace-resolve class reads by @chaokunyang in <a href="https://github.com/apache/fory/pull/3706" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3706</a></li> |
| <li class="">fix(python): make policy validators validation-only by @chaokunyang in <a href="https://github.com/apache/fory/pull/3708" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3708</a></li> |
| </ul> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="other-improvements">Other Improvements<a href="https://fory.apache.org/blog/fory_1_1_0_release#other-improvements" class="hash-link" aria-label="Direct link to Other Improvements" title="Direct link to Other Improvements" translate="no"></a></h2> |
| <ul> |
| <li class="">docs(cpp): clarify MSVC preprocessor requirement by @chaokunyang in <a href="https://github.com/apache/fory/pull/3695" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3695</a></li> |
| <li class="">chore: bump release version to 1.0 by @chaokunyang in <a href="https://github.com/apache/fory/pull/3696" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3696</a></li> |
| <li class="">chore(deps): bump io.grpc<!-- -->:grpc-netty-shaded<!-- --> from 1.62.2 to 1.75.0 in /integration_tests/grpc_tests/java by @dependabot[bot] in <a href="https://github.com/apache/fory/pull/3697" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3697</a></li> |
| <li class="">docs(xlang): update language support docs by @chaokunyang in <a href="https://github.com/apache/fory/pull/3700" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3700</a></li> |
| <li class="">docs: fix xlang type mapping MDX by @chaokunyang in <a href="https://github.com/apache/fory/pull/3701" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3701</a></li> |
| <li class="">chore(js): upgrade test dependencies by @chaokunyang in <a href="https://github.com/apache/fory/pull/3703" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3703</a></li> |
| <li class="">ci: declare workflow-level <code>contents: read</code> on ci and lint by @arpitjain099 in <a href="https://github.com/apache/fory/pull/3704" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3704</a></li> |
| <li class="">docs: update readme to add android support by @chaokunyang in <a href="https://github.com/apache/fory/pull/3705" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3705</a></li> |
| <li class="">chore: update java checks docs by @chaokunyang in <a href="https://github.com/apache/fory/pull/3707" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3707</a></li> |
| </ul> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-contributors">New Contributors<a href="https://fory.apache.org/blog/fory_1_1_0_release#new-contributors" class="hash-link" aria-label="Direct link to New Contributors" title="Direct link to New Contributors" translate="no"></a></h2> |
| <ul> |
| <li class="">@truffle-dev made their first contribution in <a href="https://github.com/apache/fory/pull/3694" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3694</a></li> |
| <li class="">@arpitjain099 made their first contribution in <a href="https://github.com/apache/fory/pull/3704" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3704</a></li> |
| </ul> |
| <p><strong>Full Changelog</strong>: <a href="https://github.com/apache/fory/compare/v1.0.0...v1.1.0" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/compare/v1.0.0...v1.1.0</a></p>]]></content> |
| <author> |
| <name>Shawn Yang</name> |
| <uri>https://github.com/chaokunyang</uri> |
| </author> |
| <category label="fory" term="fory"/> |
| <category label="java" term="java"/> |
| <category label="kotlin" term="kotlin"/> |
| <category label="scala" term="scala"/> |
| <category label="android" term="android"/> |
| <category label="python" term="python"/> |
| <category label="rust" term="rust"/> |
| <category label="c++" term="c++"/> |
| <category label="go" term="go"/> |
| <category label="c#" term="c#"/> |
| <category label="swift" term="swift"/> |
| <category label="dart" term="dart"/> |
| <category label="compiler" term="compiler"/> |
| </entry> |
| <entry> |
| <title type="html"><![CDATA[Fory v1.0.0 Released]]></title> |
| <id>https://fory.apache.org/blog/fory_1_0_0_release</id> |
| <link href="https://fory.apache.org/blog/fory_1_0_0_release"/> |
| <updated>2026-05-21T00:00:00.000Z</updated> |
| <summary type="html"><![CDATA[The Apache Fory team is pleased to announce the 1.0.0 release. This milestone release includes 84 PRs from 11 distinct contributors and turns the cross-language runtime into the default path across supported languages. See the Install page to get the libraries for your platform.]]></summary> |
| <content type="html"><![CDATA[<p>The Apache Fory team is pleased to announce the 1.0.0 release. This milestone release includes <a href="https://github.com/apache/fory/compare/v0.17.0...v1.0.0" target="_blank" rel="noopener noreferrer" class="">84 PRs</a> from 11 distinct contributors and turns the cross-language runtime into the default path across supported languages. See the <a href="https://fory.apache.org/docs/start/install" target="_blank" rel="noopener noreferrer" class="">Install</a> page to get the libraries for your platform.</p> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="highlights">Highlights<a href="https://fory.apache.org/blog/fory_1_0_0_release#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights" translate="no"></a></h2> |
| <p>Apache Fory 1.0.0 standardizes the cross-language serialization model. The unified xlang type system is now the default mode across languages, with compatible-mode reads, simplified field ordering, and better list/array compatibility. The release also adds decimal and bfloat16 support for xlang serialization.</p> |
| <p>The language runtimes continue to converge around the same schema and metadata model. Nested container and field codec support landed across Rust, C++, C#, Go, Dart, Python, and Swift. Kotlin gains xlang, KSP, and schema IDL support, while Scala adds schema IDL support and updated generated annotations.</p> |
| <p>This release also expands deployment coverage and performance work. Java gains Android serialization support, annotation processor support, schema typed row field accessors, and nested type-use serialization metadata. Dart typed-container fast paths and generated struct optimizations improve throughput, alongside refreshed benchmark plots.</p> |
| <p>Key Features:</p> |
| <ul> |
| <li class="">Unified xlang type system and default xlang mode: <a href="https://github.com/apache/fory/pull/3644" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3644</a>, <a href="https://github.com/apache/fory/pull/3685" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3685</a></li> |
| <li class="">Decimal and bfloat16 support for xlang serialization: <a href="https://github.com/apache/fory/pull/3599" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3599</a>, <a href="https://github.com/apache/fory/pull/3605" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3605</a></li> |
| <li class="">Nested container and field codec support: <a href="https://github.com/apache/fory/pull/3625" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3625</a>, <a href="https://github.com/apache/fory/pull/3630" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3630</a>, <a href="https://github.com/apache/fory/pull/3636" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3636</a>, <a href="https://github.com/apache/fory/pull/3639" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3639</a>, <a href="https://github.com/apache/fory/pull/3640" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3640</a>, <a href="https://github.com/apache/fory/pull/3641" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3641</a>, <a href="https://github.com/apache/fory/pull/3643" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3643</a></li> |
| <li class="">Kotlin xlang, KSP, and schema IDL support: <a href="https://github.com/apache/fory/pull/3679" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3679</a>, <a href="https://github.com/apache/fory/pull/3684" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3684</a></li> |
| <li class="">Scala schema IDL support and generated annotation updates: <a href="https://github.com/apache/fory/pull/3681" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3681</a>, <a href="https://github.com/apache/fory/pull/3682" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3682</a></li> |
| <li class="">Android serialization and Java annotation processor support: <a href="https://github.com/apache/fory/pull/3667" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3667</a>, <a href="https://github.com/apache/fory/pull/3670" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3670</a></li> |
| <li class="">Xlang compatible-mode improvements: <a href="https://github.com/apache/fory/pull/3648" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3648</a>, <a href="https://github.com/apache/fory/pull/3650" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3650</a>, <a href="https://github.com/apache/fory/pull/3675" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3675</a></li> |
| <li class="">Serialization performance improvements: <a href="https://github.com/apache/fory/pull/3609" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3609</a>, <a href="https://github.com/apache/fory/pull/3653" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3653</a>, <a href="https://github.com/apache/fory/pull/3656" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3656</a>, <a href="https://github.com/apache/fory/pull/3661" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3661</a></li> |
| <li class="">Java row accessors and nested type-use metadata: <a href="https://github.com/apache/fory/pull/3631" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3631</a>, <a href="https://github.com/apache/fory/pull/3633" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3633</a></li> |
| </ul> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="features">Features<a href="https://fory.apache.org/blog/fory_1_0_0_release#features" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features" translate="no"></a></h2> |
| <ul> |
| <li class="">feat(ci): fix release for csharp and dart by @chaokunyang in <a href="https://github.com/apache/fory/pull/3582" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3582</a></li> |
| <li class="">feat(rust): add configurable size guardrails by @ayush00git in <a href="https://github.com/apache/fory/pull/3579" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3579</a></li> |
| <li class="">refactor(rust): move Fory configuration to builder by @chaokunyang in <a href="https://github.com/apache/fory/pull/3593" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3593</a></li> |
| <li class="">feat(xlang): add decimal and align serializers for xlang by @chaokunyang in <a href="https://github.com/apache/fory/pull/3599" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3599</a></li> |
| <li class="">refactor(dart): aligned dart internal implementation by @Geethapranay1 in <a href="https://github.com/apache/fory/pull/3601" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3601</a></li> |
| <li class="">feat(xlang): add bfloat16 support by @chaokunyang in <a href="https://github.com/apache/fory/pull/3605" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3605</a></li> |
| <li class="">feat(dart): support dart web platform by @chaokunyang in <a href="https://github.com/apache/fory/pull/3608" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3608</a></li> |
| <li class="">perf(dart): typed-container write fast path with scan elimination by @yash-agarwa-l in <a href="https://github.com/apache/fory/pull/3609" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3609</a></li> |
| <li class="">feat(swift): nested container override support for swift by @chaokunyang in <a href="https://github.com/apache/fory/pull/3625" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3625</a></li> |
| <li class="">feat(java): add schema typed row fields accessor by @chaokunyang in <a href="https://github.com/apache/fory/pull/3631" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3631</a></li> |
| <li class="">feat: add nested container codec for rust by @chaokunyang in <a href="https://github.com/apache/fory/pull/3630" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3630</a></li> |
| <li class="">feat(java): support nested type-use serialization metadata by @chaokunyang in <a href="https://github.com/apache/fory/pull/3633" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3633</a></li> |
| <li class="">refactor(cpp): remove abseil dependency by @chaokunyang in <a href="https://github.com/apache/fory/pull/3634" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3634</a></li> |
| <li class="">feat(cpp): add nested field codec support by @chaokunyang in <a href="https://github.com/apache/fory/pull/3636" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3636</a></li> |
| <li class="">feat(csharp): support nested container field codec by @chaokunyang in <a href="https://github.com/apache/fory/pull/3639" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3639</a></li> |
| <li class="">feat(go): support nested field annotation type specs by @chaokunyang in <a href="https://github.com/apache/fory/pull/3640" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3640</a></li> |
| <li class="">feat(dart): support nested container field codec for dart by @chaokunyang in <a href="https://github.com/apache/fory/pull/3641" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3641</a></li> |
| <li class="">feat(python): support nested field schema encodings by @chaokunyang in <a href="https://github.com/apache/fory/pull/3643" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3643</a></li> |
| <li class="">feat(xlang): unified xlang type system by @chaokunyang in <a href="https://github.com/apache/fory/pull/3644" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3644</a></li> |
| <li class="">feat(xlang): add comprehensive read checks by @chaokunyang in <a href="https://github.com/apache/fory/pull/3647" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3647</a></li> |
| <li class="">feat(xlang): use compatible for xlang by default by @chaokunyang in <a href="https://github.com/apache/fory/pull/3648" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3648</a></li> |
| <li class="">feat(xlang): compatible read between list array field by @chaokunyang in <a href="https://github.com/apache/fory/pull/3650" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3650</a></li> |
| <li class="">perf(dart): remove generated struct slot bridge by @chaokunyang in <a href="https://github.com/apache/fory/pull/3653" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3653</a></li> |
| <li class="">perf: optimize serialization perf by @chaokunyang in <a href="https://github.com/apache/fory/pull/3656" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3656</a></li> |
| <li class="">perf: update benchmark plots by @chaokunyang in <a href="https://github.com/apache/fory/pull/3661" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3661</a></li> |
| <li class="">refactor(rust): use absolute path in generated Rust code by @BaldDemian in <a href="https://github.com/apache/fory/pull/3666" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3666</a></li> |
| <li class="">feat: add android support by @chaokunyang in <a href="https://github.com/apache/fory/pull/3667" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3667</a></li> |
| <li class="">feat(compiler): add helpers to generate unified gRPC service/method names by @BaldDemian in <a href="https://github.com/apache/fory/pull/3672" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3672</a></li> |
| <li class="">feat(java): annotation processor for android serialization by @chaokunyang in <a href="https://github.com/apache/fory/pull/3670" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3670</a></li> |
| <li class="">feat(xlang): simplify xlang field ordering by @chaokunyang in <a href="https://github.com/apache/fory/pull/3675" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3675</a></li> |
| <li class="">feat(kotlin): add kotlin xlang and ksp support by @chaokunyang in <a href="https://github.com/apache/fory/pull/3679" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3679</a></li> |
| <li class="">refactor(java): replace static serializer spi lookup by @chaokunyang in <a href="https://github.com/apache/fory/pull/3680" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3680</a></li> |
| <li class="">feat(scala): add scala schema idl support by @chaokunyang in <a href="https://github.com/apache/fory/pull/3681" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3681</a></li> |
| <li class="">feat(scala): update generated annotation by @chaokunyang in <a href="https://github.com/apache/fory/pull/3682" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3682</a></li> |
| <li class="">feat(rust): make rust chrono optional by @chaokunyang in <a href="https://github.com/apache/fory/pull/3683" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3683</a></li> |
| <li class="">feat(kotlin): add schema idl support to kotlin by @chaokunyang in <a href="https://github.com/apache/fory/pull/3684" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3684</a></li> |
| <li class="">feat(xlang): use xlang as default mode for all languages by @chaokunyang in <a href="https://github.com/apache/fory/pull/3685" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3685</a></li> |
| </ul> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bug-fixes">Bug Fixes<a href="https://fory.apache.org/blog/fory_1_0_0_release#bug-fixes" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes" translate="no"></a></h2> |
| <ul> |
| <li class="">fix(dart): resolve fory pub.dev score issues by @chaokunyang in <a href="https://github.com/apache/fory/pull/3585" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3585</a></li> |
| <li class="">fix(dart): fix dart ci by @chaokunyang in <a href="https://github.com/apache/fory/pull/3586" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3586</a></li> |
| <li class="">fix(dart): use getUint32 for correctly encoding u64 value by @ayush00git in <a href="https://github.com/apache/fory/pull/3592" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3592</a></li> |
| <li class="">fix(c++): fix c++ duration serialization by @chaokunyang in <a href="https://github.com/apache/fory/pull/3598" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3598</a></li> |
| <li class="">fix(javascript): align TypeMeta preamble constants with python/java/rust/go xlang bindings by @emrul in <a href="https://github.com/apache/fory/pull/3603" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3603</a></li> |
| <li class="">fix(javascript): fix javascript schema idl tests by @chaokunyang in <a href="https://github.com/apache/fory/pull/3604" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3604</a></li> |
| <li class="">fix(dart): added <code>>>></code> for correct logical right shift semantics in uint by @ayush00git in <a href="https://github.com/apache/fory/pull/3607" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3607</a></li> |
| <li class="">fix(go): ensure physical buffer space for unsafe varint fast-paths by @ayush00git in <a href="https://github.com/apache/fory/pull/3613" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3613</a></li> |
| <li class="">fix(go): add bound checking for refResolver and metaStringResolver reads by @ayush00git in <a href="https://github.com/apache/fory/pull/3615" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3615</a></li> |
| <li class="">fix(go): added pre-allocation bounds checks for slices and strings by @ayush00git in <a href="https://github.com/apache/fory/pull/3618" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3618</a></li> |
| <li class="">fix(go): added maxBinarySize limit to decimal deserialization by @ayush00git in <a href="https://github.com/apache/fory/pull/3623" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3623</a></li> |
| <li class="">fix(go): add configurable fieldCount and fieldDepth guardrails by @ayush00git in <a href="https://github.com/apache/fory/pull/3620" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3620</a></li> |
| <li class="">fix(java): honor record field encoding in generated decode by @mandrean in <a href="https://github.com/apache/fory/pull/3626" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3626</a></li> |
| <li class="">fix(java): preserve externalizable containers in compatible mode by @mandrean in <a href="https://github.com/apache/fory/pull/3628" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3628</a></li> |
| <li class="">fix(python): enforce more checks in read by @chaokunyang in <a href="https://github.com/apache/fory/pull/3632" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3632</a></li> |
| <li class="">fix(xlang): fix xlang type system by @chaokunyang in <a href="https://github.com/apache/fory/pull/3646" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3646</a></li> |
| <li class="">fix(java): use REPLACE_STUB_ID for unregistered writeReplace classes to prevent cross-JVM ClassNotFoundException by @wakilurislam in <a href="https://github.com/apache/fory/pull/3638" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3638</a></li> |
| <li class="">fix(java): fix set view ref tracking by @chaokunyang in <a href="https://github.com/apache/fory/pull/3649" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3649</a></li> |
| <li class="">fix(java): recover map declared serializers for compatible reads by @mandrean in <a href="https://github.com/apache/fory/pull/3654" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3654</a></li> |
| <li class="">fix: include TypeMeta header bits in hash by @chaokunyang in <a href="https://github.com/apache/fory/pull/3659" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3659</a></li> |
| <li class="">fix(java): serialize suppressed exceptions by @chaokunyang in <a href="https://github.com/apache/fory/pull/3663" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3663</a></li> |
| <li class="">fix(javascript): preserve getTypeInfo in regenerated read serializer by @xhzq233 in <a href="https://github.com/apache/fory/pull/3669" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3669</a></li> |
| <li class="">fix(java): validate subclass serializer layer counts by @chaokunyang in <a href="https://github.com/apache/fory/pull/3676" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3676</a></li> |
| <li class="">fix(java): avoid instantiating abstract meta-share types by @chaokunyang in <a href="https://github.com/apache/fory/pull/3677" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3677</a></li> |
| <li class="">fix: fix release script by @chaokunyang in <a href="https://github.com/apache/fory/pull/3687" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3687</a></li> |
| </ul> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="other-improvements">Other Improvements<a href="https://fory.apache.org/blog/fory_1_0_0_release#other-improvements" class="hash-link" aria-label="Direct link to Other Improvements" title="Direct link to Other Improvements" translate="no"></a></h2> |
| <ul> |
| <li class="">chore: skip auto release for tag starts with go by @chaokunyang in <a href="https://github.com/apache/fory/pull/3584" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3584</a></li> |
| <li class="">docs: add NuGet badge by @chaokunyang in <a href="https://github.com/apache/fory/pull/3587" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3587</a></li> |
| <li class="">docs(java): update graalvm guide location by @chaokunyang in <a href="https://github.com/apache/fory/pull/3588" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3588</a></li> |
| <li class="">docs: rename graalvm_support.md to graalvm-support.md by @chaokunyang in <a href="https://github.com/apache/fory/pull/3589" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3589</a></li> |
| <li class="">chore(rust): refine varint read/write method name by @chaokunyang in <a href="https://github.com/apache/fory/pull/3590" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3590</a></li> |
| <li class="">docs: move development guide to docs root by @chaokunyang in <a href="https://github.com/apache/fory/pull/3591" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3591</a></li> |
| <li class="">chore(dart): add missing license headers by @chaokunyang in <a href="https://github.com/apache/fory/pull/3594" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3594</a></li> |
| <li class="">chore(csharp): add more csharp and swift tests by @chaokunyang in <a href="https://github.com/apache/fory/pull/3597" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3597</a></li> |
| <li class="">chore(dart): refine dart xlang serialization by @chaokunyang in <a href="https://github.com/apache/fory/pull/3596" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3596</a></li> |
| <li class="">docs: add more agent harness rules by @chaokunyang in <a href="https://github.com/apache/fory/pull/3610" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3610</a></li> |
| <li class="">chore(dart): remove stale dart note files by @chaokunyang in <a href="https://github.com/apache/fory/pull/3642" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3642</a></li> |
| <li class="">chore(java): configure default Fory log level by @chaokunyang in <a href="https://github.com/apache/fory/pull/3657" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3657</a></li> |
| <li class="">chore: clean up code and add compiler warning checks by @chaokunyang in <a href="https://github.com/apache/fory/pull/3660" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3660</a></li> |
| <li class="">docs: tighten benchmark throughput plots by @chaokunyang in <a href="https://github.com/apache/fory/pull/3662" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3662</a></li> |
| <li class="">docs: update readme by @chaokunyang in <a href="https://github.com/apache/fory/pull/3664" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3664</a></li> |
| <li class="">docs: add README schema IDL example by @chaokunyang in <a href="https://github.com/apache/fory/pull/3665" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3665</a></li> |
| <li class="">docs: update xlang/native serialization doc by @chaokunyang in <a href="https://github.com/apache/fory/pull/3686" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3686</a></li> |
| </ul> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-contributors">New Contributors<a href="https://fory.apache.org/blog/fory_1_0_0_release#new-contributors" class="hash-link" aria-label="Direct link to New Contributors" title="Direct link to New Contributors" translate="no"></a></h2> |
| <ul> |
| <li class="">@emrul made their first contribution in <a href="https://github.com/apache/fory/pull/3603" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3603</a></li> |
| <li class="">@wakilurislam made their first contribution in <a href="https://github.com/apache/fory/pull/3638" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3638</a></li> |
| <li class="">@xhzq233 made their first contribution in <a href="https://github.com/apache/fory/pull/3669" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3669</a></li> |
| </ul> |
| <p><strong>Full Changelog</strong>: <a href="https://github.com/apache/fory/compare/v0.17.0...v1.0.0" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/compare/v0.17.0...v1.0.0</a></p>]]></content> |
| <author> |
| <name>Shawn Yang</name> |
| <uri>https://github.com/chaokunyang</uri> |
| </author> |
| <category label="fory" term="fory"/> |
| <category label="java" term="java"/> |
| <category label="kotlin" term="kotlin"/> |
| <category label="scala" term="scala"/> |
| <category label="android" term="android"/> |
| <category label="python" term="python"/> |
| <category label="rust" term="rust"/> |
| <category label="c++" term="c++"/> |
| <category label="go" term="go"/> |
| <category label="c#" term="c#"/> |
| <category label="swift" term="swift"/> |
| <category label="dart" term="dart"/> |
| <category label="compiler" term="compiler"/> |
| </entry> |
| <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" class="">71 PR</a> from 19 distinct contributors. See the <a href="https://fory.apache.org/docs/start/install" target="_blank" rel="noopener noreferrer" class="">Install</a> Page to learn how to get the libraries for your platform.</p> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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 class="">High-performance serialization for JavaScript and TypeScript objects in Node.js</li> |
| <li class="">Cross-language compatibility with Java, Python, Go, Rust, C#, Swift, and Dart</li> |
| <li class="">Schema-driven APIs via <code>Type.*</code> builders and TypeScript decorators</li> |
| <li class="">Optional reference tracking for shared and circular object graphs</li> |
| <li class="">Compatible mode for schema evolution</li> |
| <li class="">Configurable depth, binary size, and collection size guardrails</li> |
| <li class="">JavaScript/TypeScript target support in the Fory IDL/compiler workflow</li> |
| <li class="">Optional <code>@apache-fory/hps</code> fast string path for Node.js 20+</li> |
| </ul> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h3> |
| <div class="language-ts codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-ts codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div></code></pre></div></div> |
| <ul> |
| <li class="">JavaScript guide: <a href="https://fory.apache.org/docs/guide/javascript/" target="_blank" rel="noopener noreferrer" class="">https://fory.apache.org/docs/guide/javascript/</a></li> |
| <li class="">Compiler docs: <a href="https://fory.apache.org/docs/compiler/" target="_blank" rel="noopener noreferrer" class="">https://fory.apache.org/docs/compiler/</a></li> |
| </ul> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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" class="">https://github.com/apache/fory/tree/v0.17.0/benchmarks/javascript</a></p> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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 class="">High-performance Dart serialization with generated code instead of reflection</li> |
| <li class="">Cross-language compatibility with Java, Python, Go, Rust, C#, Swift, and JavaScript</li> |
| <li class=""><code>@ForyStruct</code> and <code>@ForyField</code> annotations with <code>build_runner</code> code generation</li> |
| <li class="">Compatible mode for schema evolution across versions</li> |
| <li class="">Optional reference tracking for shared and circular object graphs</li> |
| <li class="">Manual <code>Serializer<T></code> extension points for advanced or custom types</li> |
| <li class="">Dart target support in the Fory IDL/compiler workflow</li> |
| </ul> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h3> |
| <div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e3116c">'package:fory/fory.dart'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">part</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e3116c">'person.fory.dart'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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">Color</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> red</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> blue</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token metadata function" style="color:#d73a49">@ForyStruct</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div 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 plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">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><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">String</span><span class="token plain"> name </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 punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">Int32</span><span class="token plain"> age </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">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></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">Color</span><span class="token plain"> favoriteColor </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Color</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">red</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">void</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></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</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 punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">PersonFory</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"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> fory</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">Color</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e3116c">'example'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> typeName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e3116c">'Color'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">PersonFory</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"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> fory</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><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></div><div class="token-line" style="color:#393A34"><span class="token plain"> namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e3116c">'example'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> typeName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e3116c">'Person'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</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 class-name">Person</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div 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">name </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e3116c">'Ada'</span><span class="token plain"></span><br></div><div 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">age </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Int32</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">36</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div 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">favoriteColor </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Color</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">blue</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> roundTrip </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 generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">Person</span><span class="token generics 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 punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div 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 plain">roundTrip</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 punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div> |
| <ul> |
| <li class="">Dart guide: <a href="https://fory.apache.org/docs/guide/dart/" target="_blank" rel="noopener noreferrer" class="">https://fory.apache.org/docs/guide/dart/</a></li> |
| <li class="">Compiler docs: <a href="https://fory.apache.org/docs/compiler/" target="_blank" rel="noopener noreferrer" class="">https://fory.apache.org/docs/compiler/</a></li> |
| </ul> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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" class="">https://github.com/apache/fory/tree/v0.17.0/benchmarks/dart</a></p> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <ul> |
| <li class="">refactor(java): refactor fory java serialization api by @chaokunyang in <a href="https://github.com/apache/fory/pull/3537" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3537</a></li> |
| <li class="">refactor(python): refactor python serialization api by @chaokunyang in <a href="https://github.com/apache/fory/pull/3543" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3543</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3546</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3557</a></li> |
| <li class="">refactor(dart): new dart implementation by @chaokunyang in <a href="https://github.com/apache/fory/pull/3551" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3551</a></li> |
| </ul> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <ul> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3489</a></li> |
| <li class="">feat(ci): add bazel downloads retry by @BaldDemian in <a href="https://github.com/apache/fory/pull/3492" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3492</a></li> |
| <li class="">feat(go): add configurable size guardrails by @ayush00git in <a href="https://github.com/apache/fory/pull/3475" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3475</a></li> |
| <li class="">refactor(ci): install Bazel using setup-bazel by @BaldDemian in <a href="https://github.com/apache/fory/pull/3494" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3494</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3497</a></li> |
| <li class="">feat(cpp): add float16 to c++ by @UninspiredCarrot in <a href="https://github.com/apache/fory/pull/3487" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3487</a></li> |
| <li class="">feat(java): add float support by @mengnankkkk in <a href="https://github.com/apache/fory/pull/3254" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3254</a></li> |
| <li class="">feat(java): support java virtual threads by @chaokunyang in <a href="https://github.com/apache/fory/pull/3522" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3522</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3529</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3531</a></li> |
| <li class="">feat(java): add dedicated exception serializers by @chaokunyang in <a href="https://github.com/apache/fory/pull/3536" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3536</a></li> |
| <li class="">refactor(java): refactor fory java serialization api by @chaokunyang in <a href="https://github.com/apache/fory/pull/3537" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3537</a></li> |
| <li class="">refactor(python): refactor python serialization api by @chaokunyang in <a href="https://github.com/apache/fory/pull/3543" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3543</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3482</a></li> |
| <li class="">feat(javascript): add configurable size guardrails by @ayush00git in <a href="https://github.com/apache/fory/pull/3539" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3539</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3546</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3549</a></li> |
| <li class="">refactor(swift): refine swift api by @chaokunyang in <a href="https://github.com/apache/fory/pull/3554" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3554</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3555</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3557</a></li> |
| <li class="">refactor(dart): new dart implementation by @chaokunyang in <a href="https://github.com/apache/fory/pull/3551" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3551</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3394</a></li> |
| <li class="">perf(javascript): add javascript benchmark by @chaokunyang in <a href="https://github.com/apache/fory/pull/3562" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3562</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3563</a></li> |
| <li class="">feat(dart): add dart IDL support by @chaokunyang in <a href="https://github.com/apache/fory/pull/3571" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3571</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3574</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3576</a></li> |
| </ul> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <ul> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3478</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3481</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3490</a></li> |
| <li class="">fix(compiler): validate rpc request/response types by @retryoos in <a href="https://github.com/apache/fory/pull/3493" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3493</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3479</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3495</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3483</a></li> |
| <li class="">fix(java): handle private final map codegen by @chaokunyang in <a href="https://github.com/apache/fory/pull/3504" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3504</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3505</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3511</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3516</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3518</a></li> |
| <li class="">fix(java): preserve ConcurrentSkipListSet comparator on copy by @mandrean in <a href="https://github.com/apache/fory/pull/3520" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3520</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3528</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3532</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3534</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3535</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3542</a></li> |
| <li class="">fix(js): corrected the float64 array size by @ayush00git in <a href="https://github.com/apache/fory/pull/3541" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3541</a></li> |
| <li class="">fix(java): configure type checker during build by @chaokunyang in <a href="https://github.com/apache/fory/pull/3550" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3550</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3552</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3553</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3548</a></li> |
| <li class="">fix(javascript): fix flaky javascript idl tests by @chaokunyang in <a href="https://github.com/apache/fory/pull/3565" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3565</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3566</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3573</a></li> |
| </ul> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <ul> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3476</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3477</a></li> |
| <li class="">chore: bump version to 0.16.0 by @chaokunyang in <a href="https://github.com/apache/fory/pull/3488" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3488</a></li> |
| <li class="">docs: add python benchmark result to readme by @chaokunyang in <a href="https://github.com/apache/fory/pull/3496" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3496</a></li> |
| <li class="">docs: fix benchmark plots by @chaokunyang in <a href="https://github.com/apache/fory/pull/3498" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3498</a></li> |
| <li class="">docs: add fory code review skill by @chaokunyang in <a href="https://github.com/apache/fory/pull/3500" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3500</a></li> |
| <li class="">chore: adjust skills softlinks by @chaokunyang in <a href="https://github.com/apache/fory/pull/3501" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3501</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3381</a></li> |
| <li class="">docs: improve comments in Java generator by @codewithtarun2005 in <a href="https://github.com/apache/fory/pull/3507" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3507</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3538</a></li> |
| <li class="">docs: add ai-review policy by @chaokunyang in <a href="https://github.com/apache/fory/pull/3545" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3545</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3556</a></li> |
| <li class="">chore(javascript): rename ref tracking to ref by @chaokunyang in <a href="https://github.com/apache/fory/pull/3559" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3559</a></li> |
| <li class="">docs(dart): add dart docs by @chaokunyang in <a href="https://github.com/apache/fory/pull/3560" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3560</a></li> |
| <li class="">docs(javascript): add javascript docs by @chaokunyang in <a href="https://github.com/apache/fory/pull/3561" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3561</a></li> |
| <li class="">docs: refine dart and javascript docs by @chaokunyang in <a href="https://github.com/apache/fory/pull/3567" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3567</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3568</a></li> |
| <li class="">docs: update readme by @chaokunyang in <a href="https://github.com/apache/fory/pull/3575" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3575</a></li> |
| </ul> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <ul> |
| <li class="">@utafrali made their first contribution in <a href="https://github.com/apache/fory/pull/3481" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3481</a></li> |
| <li class="">@BaldDemian made their first contribution in <a href="https://github.com/apache/fory/pull/3490" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3490</a></li> |
| <li class="">@retryoos made their first contribution in <a href="https://github.com/apache/fory/pull/3493" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3493</a></li> |
| <li class="">@Tyooughtul made their first contribution in <a href="https://github.com/apache/fory/pull/3381" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3381</a></li> |
| <li class="">@UninspiredCarrot made their first contribution in <a href="https://github.com/apache/fory/pull/3487" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3487</a></li> |
| <li class="">@VikingDeng made their first contribution in <a href="https://github.com/apache/fory/pull/3505" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3505</a></li> |
| <li class="">@codewithtarun2005 made their first contribution in <a href="https://github.com/apache/fory/pull/3507" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3507</a></li> |
| <li class="">@darius024 made their first contribution in <a href="https://github.com/apache/fory/pull/3528" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3528</a></li> |
| <li class="">@rakow made their first contribution in <a href="https://github.com/apache/fory/pull/3532" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3532</a></li> |
| <li class="">@PiotrDuz made their first contribution in <a href="https://github.com/apache/fory/pull/3573" target="_blank" rel="noopener noreferrer" class="">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" class="">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="c++" term="c++"/> |
| <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" class="">91 PR</a> from 17 distinct contributors. See the <a href="https://fory.apache.org/docs/start/install" target="_blank" rel="noopener noreferrer" class="">Install</a> Page to learn how to get the libraries for your platform.</p> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <ul> |
| <li class="">feat(c#): c# serialization implementation by @chaokunyang in <a href="https://github.com/apache/fory/pull/3383" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3383</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3406</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3359</a></li> |
| <li class="">feat(swift): fory swift schema idl codegen by @chaokunyang in <a href="https://github.com/apache/fory/pull/3433" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3433</a></li> |
| <li class="">feat(JavaScript): Support EXT,NAMED_EXT by @theweipeng in <a href="https://github.com/apache/fory/pull/3312" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3312</a></li> |
| <li class="">feat(JavaScript): align xlang protocol by @theweipeng in <a href="https://github.com/apache/fory/pull/3316" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3316</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3348</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3307</a></li> |
| <li class="">feat(python): fast cython struct serializer by @chaokunyang in <a href="https://github.com/apache/fory/pull/3443" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3443</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3400</a></li> |
| </ul> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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 class="">High-performance binary serialization for .NET 8+ with source-generator-based serializers for <code>[ForyObject]</code> types</li> |
| <li class="">Cross-language mode with Java, Python, C++, Go, Rust, and JavaScript</li> |
| <li class="">Optional reference tracking for shared and circular object graphs</li> |
| <li class="">Compatible mode for schema evolution</li> |
| <li class="">Dynamic object payloads, custom serializers, and namespace/name registration APIs</li> |
| <li class=""><code>ThreadSafeFory</code> wrapper for concurrent service workloads</li> |
| <li class="">C# target support in the Fory IDL/compiler workflow</li> |
| </ul> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h3> |
| <div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">using</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">Apache</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">.</span><span class="token namespace" style="opacity:0.7">Fory</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token attribute class-name">ForyObject</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div 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">sealed</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">User</span><span class="token plain"></span><br></div><div 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></div><div 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 return-type class-name keyword" style="color:#00009f">long</span><span class="token plain"> Id </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">get</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">set</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></div><div 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 return-type class-name keyword" style="color:#00009f">string</span><span class="token plain"> Name </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">get</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">set</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 keyword" style="color:#00009f">string</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Empty</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div 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 return-type class-name keyword" style="color:#00009f">string</span><span class="token return-type class-name 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 keyword" style="color:#00009f">get</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">set</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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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"> 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 plain"></span><br></div><div 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><br></div><div 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><br></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain">fory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token generic-method function" style="color:#d73a49">Register</span><span class="token generic-method generic class-name punctuation" style="color:#393A34"><</span><span class="token generic-method generic class-name">User</span><span class="token generic-method generic class-name punctuation" style="color:#393A34">></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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token class-name keyword" style="color:#00009f">byte</span><span class="token class-name punctuation" style="color:#393A34">[</span><span class="token class-name punctuation" style="color:#393A34">]</span><span class="token plain"> payload </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 keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">User</span><span class="token plain"></span><br></div><div 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></div><div 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">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div 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></div><div class="token-line" style="color:#393A34"><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">"alice@example.com"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token class-name">User</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-method function" style="color:#d73a49">Deserialize</span><span class="token generic-method generic class-name punctuation" style="color:#393A34"><</span><span class="token generic-method generic class-name">User</span><span class="token generic-method generic class-name punctuation" style="color:#393A34">></span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">payload</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div> |
| <ul> |
| <li class="">C# guide: <a href="https://fory.apache.org/docs/guide/csharp/" target="_blank" rel="noopener noreferrer" class="">https://fory.apache.org/docs/guide/csharp/</a></li> |
| <li class="">Compiler docs: <a href="https://fory.apache.org/docs/compiler/" target="_blank" rel="noopener noreferrer" class="">https://fory.apache.org/docs/compiler/</a></li> |
| </ul> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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" class="">https://fory.apache.org/docs/benchmarks/csharp/</a></p> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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 class="">High-performance serialization for Swift value and reference types</li> |
| <li class=""><code>@ForyObject</code> macro for zero-boilerplate model serialization</li> |
| <li class="">Cross-language protocol compatibility with Java, Python, C++, Go, Rust, and JavaScript</li> |
| <li class="">Compatible mode for schema evolution across versions</li> |
| <li class="">Dynamic value support for <code>Any</code>, <code>AnyObject</code>, <code>any Serializer</code>, and <code>AnyHashable</code></li> |
| <li class="">Reference tracking for shared/circular graphs, including weak references on classes</li> |
| <li class="">Swift target support in the Fory IDL/compiler workflow</li> |
| </ul> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h3> |
| <div class="language-swift codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-swift codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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></div></code></pre></div></div> |
| <ul> |
| <li class="">Swift guide: <a href="https://fory.apache.org/docs/guide/swift/" target="_blank" rel="noopener noreferrer" class="">https://fory.apache.org/docs/guide/swift/</a></li> |
| <li class="">Compiler docs: <a href="https://fory.apache.org/docs/compiler/" target="_blank" rel="noopener noreferrer" class="">https://fory.apache.org/docs/compiler/</a></li> |
| </ul> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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" class="">https://fory.apache.org/docs/benchmarks/swift/</a></p> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <ul> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3308</a></li> |
| <li class="">feat(JavaScript): Support EXT,NAMED_EXT by @theweipeng in <a href="https://github.com/apache/fory/pull/3312" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3312</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3311</a></li> |
| <li class="">feat(JavaScript): support ForyField by @theweipeng in <a href="https://github.com/apache/fory/pull/3314" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3314</a></li> |
| <li class="">feat(JavaScript): align xlang protocol by @theweipeng in <a href="https://github.com/apache/fory/pull/3316" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3316</a></li> |
| <li class="">feat(javascript): add float16 support by @ayush00git in <a href="https://github.com/apache/fory/pull/3253" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3253</a></li> |
| <li class="">feat(JavaScript): Align testcases by @theweipeng in <a href="https://github.com/apache/fory/pull/3319" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3319</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3318</a></li> |
| <li class="">feat(JavaScript): Align testcase by @theweipeng in <a href="https://github.com/apache/fory/pull/3320" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3320</a></li> |
| <li class="">feat(JavaScript): Align testcases by @theweipeng in <a href="https://github.com/apache/fory/pull/3321" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3321</a></li> |
| <li class="">feat(dart): align dart xlang serialization by @chaokunyang in <a href="https://github.com/apache/fory/pull/3322" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3322</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3313</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3323</a></li> |
| <li class="">feat(JavaScript): Align xlang protocol by @theweipeng in <a href="https://github.com/apache/fory/pull/3326" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3326</a></li> |
| <li class="">feat(JavaScript): fix test_polymorphic_map by @theweipeng in <a href="https://github.com/apache/fory/pull/3327" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3327</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3325</a></li> |
| <li class="">feat(go): add support for bfloat16 by @BrianLii in <a href="https://github.com/apache/fory/pull/3310" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3310</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3328</a></li> |
| <li class="">feat(JavaScript): fix testcase by @theweipeng in <a href="https://github.com/apache/fory/pull/3334" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3334</a></li> |
| <li class="">refactor(dart): register xlang types by Type by @chaokunyang in <a href="https://github.com/apache/fory/pull/3332" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3332</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3346</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3348</a></li> |
| <li class="">feat(dart): add float16 to dart by @ayush00git in <a href="https://github.com/apache/fory/pull/3336" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3336</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3359</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3361</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3363</a></li> |
| <li class="">feat(swift): dynamic any serializer for polymorphism by @chaokunyang in <a href="https://github.com/apache/fory/pull/3368" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3368</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3371</a></li> |
| <li class="">feat(c++): add msgpack cpp benchmark by @chaokunyang in <a href="https://github.com/apache/fory/pull/3365" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3365</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3373</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3252</a></li> |
| <li class="">feat(c#): c# serialization implementation by @chaokunyang in <a href="https://github.com/apache/fory/pull/3383" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3383</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3396</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3398</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3400</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3395</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3403</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3406</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3427</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3428</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3307</a></li> |
| <li class="">feat(swift): fory swift schema idl codegen by @chaokunyang in <a href="https://github.com/apache/fory/pull/3433" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3433</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3434</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3436</a></li> |
| <li class="">perf(python): optimize pyfory collection serialization performance by @chaokunyang in <a href="https://github.com/apache/fory/pull/3441" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3441</a></li> |
| <li class="">feat(python): fast cython struct serializer by @chaokunyang in <a href="https://github.com/apache/fory/pull/3443" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3443</a></li> |
| <li class="">perf(python): add python benchmark suite by @chaokunyang in <a href="https://github.com/apache/fory/pull/3448" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3448</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3449</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3453</a></li> |
| <li class="">perf(c#): add csharp benchmark results by @chaokunyang in <a href="https://github.com/apache/fory/pull/3451" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3451</a></li> |
| <li class="">refactor: clean java serialize api by @chaokunyang in <a href="https://github.com/apache/fory/pull/3454" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3454</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3435</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3431</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3429</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3374</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3456</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3455</a></li> |
| <li class="">perf(swift): optimize swift performance by @chaokunyang in <a href="https://github.com/apache/fory/pull/3457" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3457</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3462</a></li> |
| <li class="">perf: add fory performance optimization skill by @chaokunyang in <a href="https://github.com/apache/fory/pull/3463" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3463</a></li> |
| <li class="">feat(xlang): support per-type evolution override by @chaokunyang in <a href="https://github.com/apache/fory/pull/3465" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3465</a></li> |
| <li class="">feat(javascript): limit the depth of deserialize & serialize by @miantalha45 in <a href="https://github.com/apache/fory/pull/3382" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3382</a></li> |
| </ul> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <ul> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3315</a></li> |
| <li class="">fix(java): Deserialize nested HashMap subclasses by @mandrean in <a href="https://github.com/apache/fory/pull/3342" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3342</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3344</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3418</a></li> |
| <li class="">fix: avoid NoClassDefFoundError in supportCodegenForJavaSerialization by @siy in <a href="https://github.com/apache/fory/pull/3424" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3424</a></li> |
| <li class="">fix(docs): updated the compiler guide by @ayush00git in <a href="https://github.com/apache/fory/pull/3420" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3420</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3439</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3450</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3468</a></li> |
| <li class="">fix(python): fix python wheel build by @chaokunyang in <a href="https://github.com/apache/fory/pull/3469" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3469</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3472</a></li> |
| </ul> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <ul> |
| <li class="">docs: update guide and compiler docs by @chaokunyang in <a href="https://github.com/apache/fory/pull/3298" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3298</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3299</a></li> |
| <li class="">docs(java): fix benchmark images by @chaokunyang in <a href="https://github.com/apache/fory/pull/3304" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3304</a></li> |
| <li class="">docs(c++): update readme and benchmarks docs by @chaokunyang in <a href="https://github.com/apache/fory/pull/3305" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3305</a></li> |
| <li class="">docs: fix incorrect docs by @chaokunyang in <a href="https://github.com/apache/fory/pull/3309" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3309</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3317</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3338</a></li> |
| <li class="">chore(python): define dependencies for development environment by @yuta4895 in <a href="https://github.com/apache/fory/pull/3360" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3360</a></li> |
| <li class="">docs(java): update java benchmark plots by @chaokunyang in <a href="https://github.com/apache/fory/pull/3366" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3366</a></li> |
| <li class="">docs(swift): refine swift api and docs by @chaokunyang in <a href="https://github.com/apache/fory/pull/3372" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3372</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3401</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3404</a></li> |
| <li class="">docs: adjust guide docs sidebar by @chaokunyang in <a href="https://github.com/apache/fory/pull/3407" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3407</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3384</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3442</a></li> |
| <li class="">chore(c#): prepare for c# release by @chaokunyang in <a href="https://github.com/apache/fory/pull/3464" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3464</a></li> |
| <li class="">docs: add ai contributing policy by @chaokunyang in <a href="https://github.com/apache/fory/pull/3437" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3437</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3470</a></li> |
| </ul> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <ul> |
| <li class="">@BrianLii made their first contribution in <a href="https://github.com/apache/fory/pull/3311" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3311</a></li> |
| <li class="">@NotLebedev made their first contribution in <a href="https://github.com/apache/fory/pull/3315" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3315</a></li> |
| <li class="">@miantalha45 made their first contribution in <a href="https://github.com/apache/fory/pull/3328" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3328</a></li> |
| <li class="">@yuta4895 made their first contribution in <a href="https://github.com/apache/fory/pull/3360" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3360</a></li> |
| <li class="">@AshharAhmadKhan made their first contribution in <a href="https://github.com/apache/fory/pull/3252" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3252</a></li> |
| <li class="">@siy made their first contribution in <a href="https://github.com/apache/fory/pull/3424" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3424</a></li> |
| <li class="">@yash-agarwa-l made their first contribution in <a href="https://github.com/apache/fory/pull/3434" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3434</a></li> |
| <li class="">@eyad-hazem-elmorsy made their first contribution in <a href="https://github.com/apache/fory/pull/3384" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3384</a></li> |
| <li class="">@04cb made their first contribution in <a href="https://github.com/apache/fory/pull/3442" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3442</a></li> |
| <li class="">@Geethapranay1 made their first contribution in <a href="https://github.com/apache/fory/pull/3435" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3435</a></li> |
| <li class="">@moon3482 made their first contribution in <a href="https://github.com/apache/fory/pull/3431" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3431</a></li> |
| <li class="">@shivendra-dev54 made their first contribution in <a href="https://github.com/apache/fory/pull/3455" target="_blank" rel="noopener noreferrer" class="">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" class="">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="c++" term="c++"/> |
| <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 class="">GitHub: <a href="https://github.com/apache/fory" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory</a></li> |
| <li class="">Compiler docs: <a href="https://fory.apache.org/docs/compiler" target="_blank" rel="noopener noreferrer" class="">https://fory.apache.org/docs/compiler</a></li> |
| <li class="">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 anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <p>Many production models are object graphs, not pure value trees:</p> |
| <ul> |
| <li class="">Parent pointers (<code>child.parent</code>)</li> |
| <li class="">Shared nodes (two edges pointing to the same object)</li> |
| <li class="">Cycles (A -> B -> 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 anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <p>You do not need to rewrite everything into <code>.fdl</code> first.</p> |
| <ul> |
| <li class="">For protobuf input, use <code>(fory).ref</code>, <code>(fory).weak_ref</code>, and related options.</li> |
| <li class="">For FlatBuffers input, use <code>fory_ref:true</code>, <code>fory_weak_ref:true</code>, and related attributes.</li> |
| <li class="">Compile with <code>foryc</code>.</li> |
| <li class="">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 anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" 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)" translate="no"></a></h3> |
| <div class="language-protobuf codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-protobuf codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" 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)" translate="no"></a></h3> |
| <div class="language-protobuf codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-protobuf codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div> |
| <p>What this means:</p> |
| <ul> |
| <li class=""><code>weak_ref = true</code> implies ref tracking and generates weak-pointer semantics where relevant (for example C++/Rust).</li> |
| <li class="">For <code>repeated</code> fields, <code>(fory).ref = true</code> applies to list elements.</li> |
| <li class="">For <code>map<K, V></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_QJqH"><pre tabindex="0" class="prism-code language-protobuf codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div> |
| <hr> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h3> |
| <div class="language-fbs codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-fbs codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">namespace demo;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">table Node {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> parent: Node (fory_weak_ref: true);</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> children: [Node] (fory_ref: true);</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> cached: Node (fory_ref: true, fory_thread_safe_pointer: false);</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div></code></pre></div></div> |
| <p>Semantics:</p> |
| <ul> |
| <li class=""><code>fory_weak_ref:true</code> implies reference tracking.</li> |
| <li class=""><code>fory_thread_safe_pointer</code> affects pointer flavor on ref-tracked fields.</li> |
| <li class="">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 anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain">foryc schema.proto --emit-fdl</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain">foryc schema.fbs --emit-fdl --emit-fdl-path ./translated</span><br></div></code></pre></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_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div></code></pre></div></div> |
| <p>This is the migration-friendly loop:</p> |
| <ol> |
| <li class="">Keep existing schema files.</li> |
| <li class="">Add only Fory reference options where graph semantics are required.</li> |
| <li class="">Inspect translated <code>.fdl</code>.</li> |
| <li class="">Generate and run roundtrip tests.</li> |
| </ol> |
| <hr> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <p>With Fory codegen, you get native language models and reference-aware serialization behavior:</p> |
| <ul> |
| <li class="">Java: POJOs/records with Fory metadata</li> |
| <li class="">Python: dataclasses + registration helpers</li> |
| <li class="">Go: structs with tags</li> |
| <li class="">Rust: native structs with ref-pointer mapping</li> |
| <li class="">C++: native classes/structs with shared/weak pointer mapping</li> |
| <li class="">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 anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <ol> |
| <li class=""> |
| <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 class=""> |
| <p>Protobuf unknown-field behavior is different. |
| Protobuf preserves unknown fields; Fory does not preserve protobuf unknown-field payloads.</p> |
| </li> |
| <li class=""> |
| <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 anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <p>If you already run protobuf or FlatBuffers in production:</p> |
| <ol> |
| <li class="">Keep package/namespace names stable.</li> |
| <li class="">Add Fory reference options only to graph-shaped fields.</li> |
| <li class="">Generate code with <code>foryc</code> and run roundtrip tests.</li> |
| <li class="">Migrate internal object-heavy paths first.</li> |
| <li class="">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 anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain">foryc </span><span class="token parameter variable" style="color:#36acaa">--help</span><br></div></code></pre></div></div> |
| <p><strong>References:</strong></p> |
| <ul> |
| <li class="">Object-graph Schema IDL reference article: <a href="https://fory.apache.org/blog/fory_schema_idl_for_object_graph" target="_blank" rel="noopener noreferrer" class="">https://fory.apache.org/blog/fory_schema_idl_for_object_graph</a></li> |
| <li class="">Protobuf IDL support: <a href="https://fory.apache.org/docs/compiler/protobuf_idl_support" target="_blank" rel="noopener noreferrer" class="">https://fory.apache.org/docs/compiler/protobuf_idl_support</a></li> |
| <li class="">FlatBuffers IDL support: <a href="https://fory.apache.org/docs/compiler/flatbuffers_idl" target="_blank" rel="noopener noreferrer" class="">https://fory.apache.org/docs/compiler/flatbuffers_idl</a></li> |
| <li class="">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" class="">https://fory.apache.org/docs/compiler/syntax</a></li> |
| <li class="">Generated code overview: <a href="https://fory.apache.org/docs/compiler/generated_code" target="_blank" rel="noopener noreferrer" class="">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 class="">GitHub: <a href="https://github.com/apache/fory" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory</a></li> |
| <li class="">Docs: <a href="https://fory.apache.org/docs/compiler" target="_blank" rel="noopener noreferrer" class="">https://fory.apache.org/docs/compiler</a></li> |
| <li class="">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 anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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 class=""> |
| <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 class=""> |
| <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 class=""> |
| <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 anchorTargetStickyNavbar_Vzrq" 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?" translate="no"></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 class=""><code>ref</code> makes shared references and cycles part of the schema contract.</li> |
| <li class=""><code>union</code> and <code>any</code> make polymorphism a reusable schema feature rather than only an inline transport detail.</li> |
| <li class="">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 anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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_QJqH"><pre tabindex="0" class="prism-code language-protobuf codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain"> list</span><span class="token operator" style="color:#393A34"><</span><span class="token plain">ref TreeNode</span><span class="token operator" style="color:#393A34">></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></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></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<Node></code> in Rust, <code>std::weak_ptr</code> in C++).</p> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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 class=""><strong>Java</strong>: Plain POJOs with <code>@ForyField</code> annotations — usable directly in Spring, Hibernate, or any framework</li> |
| <li class=""><strong>Python</strong>: <code>@dataclass</code> types with standard type hints</li> |
| <li class=""><strong>Go</strong>: Structs with <code>fory:"id=..."</code> struct tags</li> |
| <li class=""><strong>Rust</strong>: Structs with <code>#[derive(ForyObject)]</code></li> |
| <li class=""><strong>C++</strong>: <code>final</code> classes with <code>FORY_STRUCT</code> macros — zero runtime reflection</li> |
| <li class=""><strong>C#</strong>: Classes with <code>[ForyObject]</code> attributes</li> |
| <li class=""><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 anchorTargetStickyNavbar_Vzrq" 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)" translate="no"></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_QJqH"><pre tabindex="0" class="prism-code language-protobuf codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div> |
| <p>This generates:</p> |
| <ul> |
| <li class=""><strong>Rust</strong>: <code>enum Animal { Dog(Dog), Cat(Cat) }</code></li> |
| <li class=""><strong>C++</strong>: <code>std::variant</code>-based wrapper with <code>is_dog()</code>, <code>as_dog()</code>, <code>visit()</code> APIs</li> |
| <li class=""><strong>Swift</strong>: Tagged enum with associated values</li> |
| <li class=""><strong>Java</strong>: <code>Union</code> subclass with typed case accessors</li> |
| <li class=""><strong>Python</strong>: <code>Union</code> subclass with <code>is_dog()</code> / <code>dog_value()</code> helpers</li> |
| <li class=""><strong>Go</strong>: Typed case struct with <code>AsDog()</code> / visitor pattern</li> |
| <li class=""><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 anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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_QJqH"><pre tabindex="0" class="prism-code language-protobuf codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></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<dyn Any></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 anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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_QJqH"><pre tabindex="0" class="prism-code language-protobuf codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></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 anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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 anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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_QJqH"><pre tabindex="0" class="prism-code language-protobuf codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain"> list</span><span class="token operator" style="color:#393A34"><</span><span class="token plain">OrderItem</span><span class="token operator" style="color:#393A34">></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></div><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain"> list</span><span class="token operator" style="color:#393A34"><</span><span class="token plain">Order</span><span class="token operator" style="color:#393A34">></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></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h3> |
| <div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div></code></pre></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 anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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></div></code></pre></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_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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></div><div 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></div></code></pre></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_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div></code></pre></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_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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">&</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></div><div 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></div></code></pre></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_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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"><<</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"><<</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"><<</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></div><div class="token-line" style="color:#393A34"><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">" — $"</span><span class="token plain"> </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">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"><<</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></div></code></pre></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_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">using</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">Ecommerce</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token class-name keyword" style="color:#00009f">var</span><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 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"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">WriteLine</span><span class="token punctuation" style="color:#393A34">(</span><span class="token interpolation-string string" style="color:#e3116c">$"</span><span class="token interpolation-string interpolation punctuation" style="color:#393A34">{</span><span class="token interpolation-string interpolation expression language-csharp">order</span><span class="token interpolation-string interpolation expression language-csharp punctuation" style="color:#393A34">.</span><span class="token interpolation-string interpolation expression language-csharp">OrderId</span><span class="token interpolation-string interpolation punctuation" style="color:#393A34">}</span><span class="token interpolation-string string" style="color:#e3116c">: </span><span class="token interpolation-string interpolation punctuation" style="color:#393A34">{</span><span class="token interpolation-string interpolation expression language-csharp">order</span><span class="token interpolation-string interpolation expression language-csharp punctuation" style="color:#393A34">.</span><span class="token interpolation-string interpolation expression language-csharp">Customer</span><span class="token interpolation-string interpolation expression language-csharp punctuation" style="color:#393A34">.</span><span class="token interpolation-string interpolation expression language-csharp">Name</span><span class="token interpolation-string interpolation punctuation" style="color:#393A34">}</span><span class="token interpolation-string string" style="color:#e3116c"> — $</span><span class="token interpolation-string interpolation punctuation" style="color:#393A34">{</span><span class="token interpolation-string interpolation expression language-csharp">order</span><span class="token interpolation-string interpolation expression language-csharp punctuation" style="color:#393A34">.</span><span class="token interpolation-string interpolation expression language-csharp">Total</span><span class="token interpolation-string interpolation punctuation" style="color:#393A34">}</span><span class="token interpolation-string string" style="color:#e3116c">"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></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_QJqH"><pre tabindex="0" class="prism-code language-swift codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div></code></pre></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 anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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></div></code></pre></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 anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h3> |
| <div class="language-protobuf codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-protobuf codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></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<String></code></td></tr><tr><td>C++</td><td><code>std::string</code></td><td><code>std::optional<std::string></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 anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h3> |
| <div class="language-protobuf codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-protobuf codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain"> list</span><span class="token operator" style="color:#393A34"><</span><span class="token builtin">string</span><span class="token operator" style="color:#393A34">></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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain"> list</span><span class="token operator" style="color:#393A34"><</span><span class="token plain">Result</span><span class="token operator" style="color:#393A34">></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></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></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 anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h3> |
| <div class="language-protobuf codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-protobuf codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div> |
| <div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div></code></pre></div></div> |
| <p>The compiler resolves imports, catches import cycles, and keeps generated type registration consistent across imported schemas.</p> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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_QJqH"><pre tabindex="0" class="prism-code language-protobuf codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div 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></div><div 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></div><div 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></div></code></pre></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 anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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<T></code>, <code>map<K, V></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 anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div></code></pre></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 class=""><code>repeated T</code> → <code>list<T></code></li> |
| <li class=""><code>oneof</code> → Fory <code>union</code> + optional field</li> |
| <li class=""><code>google.protobuf.Timestamp</code> → <code>timestamp</code></li> |
| <li class=""><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_QJqH"><pre tabindex="0" class="prism-code language-protobuf codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div></code></pre></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 anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">foryc schema.proto --emit-fdl</span><br></div></code></pre></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 anchorTargetStickyNavbar_Vzrq" 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?" translate="no"></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" class="">benchmark reports</a>.</p> |
| <hr> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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_QJqH"><pre tabindex="0" class="prism-code language-xml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34"><</span><span class="token tag" style="color:#00009f">execution</span><span class="token tag punctuation" style="color:#393A34">></span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34"><</span><span class="token tag" style="color:#00009f">id</span><span class="token tag punctuation" style="color:#393A34">></span><span class="token plain">generate-fory-types</span><span class="token tag punctuation" style="color:#393A34"></</span><span class="token tag" style="color:#00009f">id</span><span class="token tag punctuation" style="color:#393A34">></span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34"><</span><span class="token tag" style="color:#00009f">phase</span><span class="token tag punctuation" style="color:#393A34">></span><span class="token plain">generate-sources</span><span class="token tag punctuation" style="color:#393A34"></</span><span class="token tag" style="color:#00009f">phase</span><span class="token tag punctuation" style="color:#393A34">></span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34"><</span><span class="token tag" style="color:#00009f">goals</span><span class="token tag punctuation" style="color:#393A34">></span><span class="token tag punctuation" style="color:#393A34"><</span><span class="token tag" style="color:#00009f">goal</span><span class="token tag punctuation" style="color:#393A34">></span><span class="token plain">exec</span><span class="token tag punctuation" style="color:#393A34"></</span><span class="token tag" style="color:#00009f">goal</span><span class="token tag punctuation" style="color:#393A34">></span><span class="token tag punctuation" style="color:#393A34"></</span><span class="token tag" style="color:#00009f">goals</span><span class="token tag punctuation" style="color:#393A34">></span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34"><</span><span class="token tag" style="color:#00009f">configuration</span><span class="token tag punctuation" style="color:#393A34">></span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34"><</span><span class="token tag" style="color:#00009f">executable</span><span class="token tag punctuation" style="color:#393A34">></span><span class="token plain">foryc</span><span class="token tag punctuation" style="color:#393A34"></</span><span class="token tag" style="color:#00009f">executable</span><span class="token tag punctuation" style="color:#393A34">></span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34"><</span><span class="token tag" style="color:#00009f">arguments</span><span class="token tag punctuation" style="color:#393A34">></span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34"><</span><span class="token tag" style="color:#00009f">argument</span><span class="token tag punctuation" style="color:#393A34">></span><span class="token plain">${basedir}/src/main/fdl/schema.fdl</span><span class="token tag punctuation" style="color:#393A34"></</span><span class="token tag" style="color:#00009f">argument</span><span class="token tag punctuation" style="color:#393A34">></span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34"><</span><span class="token tag" style="color:#00009f">argument</span><span class="token tag punctuation" style="color:#393A34">></span><span class="token plain">--java_out</span><span class="token tag punctuation" style="color:#393A34"></</span><span class="token tag" style="color:#00009f">argument</span><span class="token tag punctuation" style="color:#393A34">></span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34"><</span><span class="token tag" style="color:#00009f">argument</span><span class="token tag punctuation" style="color:#393A34">></span><span class="token plain">${project.build.directory}/generated-sources/fory</span><span class="token tag punctuation" style="color:#393A34"></</span><span class="token tag" style="color:#00009f">argument</span><span class="token tag punctuation" style="color:#393A34">></span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34"></</span><span class="token tag" style="color:#00009f">arguments</span><span class="token tag punctuation" style="color:#393A34">></span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34"></</span><span class="token tag" style="color:#00009f">configuration</span><span class="token tag punctuation" style="color:#393A34">></span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34"></</span><span class="token tag" style="color:#00009f">execution</span><span class="token tag punctuation" style="color:#393A34">></span><br></div></code></pre></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_QJqH"><pre tabindex="0" class="prism-code language-groovy codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">task generateForyTypes(type: Exec) {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> commandLine 'foryc', "${projectDir}/src/main/fdl/schema.fdl",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> '--java_out', "${buildDir}/generated/sources/fory"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">compileJava.dependsOn generateForyTypes</span><br></div></code></pre></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_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div 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></div></code></pre></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_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div 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></div><div 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></div><div 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></div></code></pre></div></div> |
| <hr> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <ol> |
| <li class=""> |
| <p><strong>Use meaningful package names</strong>: <code>com.myapp.models</code> groups types logically and drives namespace generation.</p> |
| </li> |
| <li class=""> |
| <p><strong>Use <code>optional</code> explicitly</strong>: Don't rely on default nullability — make the intent clear in the schema.</p> |
| </li> |
| <li class=""> |
| <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 class=""> |
| <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 class=""> |
| <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 anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain">foryc </span><span class="token parameter variable" style="color:#36acaa">--help</span><br></div></code></pre></div></div> |
| <p><strong>Documentation:</strong></p> |
| <ul> |
| <li class="">Fory IDL Syntax: <a href="https://fory.apache.org/docs/compiler/syntax" target="_blank" rel="noopener noreferrer" class="">fory.apache.org/docs/compiler/syntax</a></li> |
| <li class="">Compiler CLI Guide: <a href="https://fory.apache.org/docs/compiler/compiler_guide" target="_blank" rel="noopener noreferrer" class="">fory.apache.org/docs/compiler/compiler_guide</a></li> |
| <li class="">Generated Code Reference: <a href="https://fory.apache.org/docs/compiler/generated_code" target="_blank" rel="noopener noreferrer" class="">fory.apache.org/docs/compiler/generated_code</a></li> |
| <li class="">Cross-Language Serialization: <a href="https://fory.apache.org/docs/guide/xlang/serialization_index" target="_blank" rel="noopener noreferrer" class="">fory.apache.org/docs/guide/xlang</a></li> |
| <li class="">Protobuf Migration: <a href="https://fory.apache.org/docs/compiler/protobuf_idl_support" target="_blank" rel="noopener noreferrer" class="">fory.apache.org/docs/compiler/protobuf_idl_support</a></li> |
| <li class="">Benchmark Reports: <a href="https://github.com/apache/fory/tree/main/docs/benchmarks" target="_blank" rel="noopener noreferrer" class="">github.com/apache/fory/tree/main/docs/benchmarks</a></li> |
| </ul> |
| <p><strong>Community:</strong></p> |
| <ul> |
| <li class="">GitHub: <a href="https://github.com/apache/fory" target="_blank" rel="noopener noreferrer" class="">apache/fory</a></li> |
| <li class="">Slack: <a href="https://join.slack.com/t/fory-project/shared_invite/zt-1u8soj4qc-ieYEu7ciHOqA2mo47llS8A" target="_blank" rel="noopener noreferrer" class="">Join our community</a></li> |
| <li class="">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 class="">🐙 GitHub: <a href="https://github.com/apache/fory" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory</a></li> |
| <li class="">📚 Docs: <a href="https://fory.apache.org/docs/guide/cpp" target="_blank" rel="noopener noreferrer" class="">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 anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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 class=""><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 class=""><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 class=""><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 anchorTargetStickyNavbar_Vzrq" 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?" translate="no"></a></h2> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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></div><div 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"><</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">></span><span class="token plain"> hobbies</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div 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"><</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">></span><span class="token plain"> metadata</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div 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"><</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">></span><span class="token plain"> nickname</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div 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></div><div 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></div></code></pre></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 anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div 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></div><div 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"><</span><span class="token generic-function generic class-name">Person</span><span class="token generic-function generic class-name operator" style="color:#393A34">></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></div><div 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></div></code></pre></div></div> |
| <div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div 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></div><div 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></div><div 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></div></code></pre></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 anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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<T></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<Animal></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_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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"><</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"><</span><span class="token plain">Animal</span><span class="token operator" style="color:#393A34">>></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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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"><</span><span class="token generic-function generic class-name">Shelter</span><span class="token generic-function generic class-name operator" style="color:#393A34">></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"><</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 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"><</span><span class="token generic-function generic class-name">Cat</span><span class="token generic-function generic class-name operator" style="color:#393A34">></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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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"><</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 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></div><div 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"><</span><span class="token generic-function generic class-name">Cat</span><span class="token generic-function generic class-name operator" 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><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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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"><</span><span class="token generic-function generic class-name">Shelter</span><span class="token generic-function generic class-name operator" 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 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></div><div 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"><</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">></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></div></code></pre></div></div> |
| <p>Fory also supports <code>std::unique_ptr</code> for exclusive-ownership polymorphic fields, and collections of smart pointers (<code>std::vector<std::shared_ptr<Base>></code>, <code>std::map<K, std::unique_ptr<Base>></code>).</p> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div 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></div><div 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></div><div 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"><</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"><</span><span class="token plain">Node</span><span class="token operator" style="color:#393A34">>></span><span class="token plain"> neighbors</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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"><</span><span class="token generic-function generic class-name">Node</span><span class="token generic-function generic class-name operator" style="color:#393A34">></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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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"><</span><span class="token generic-function generic class-name">Node</span><span class="token generic-function generic class-name operator" 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"> node1</span><span class="token operator" 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></div><div 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"><</span><span class="token generic-function generic class-name">Node</span><span class="token generic-function generic class-name operator" 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"> node2</span><span class="token operator" 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"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">node1</span><span class="token operator" style="color:#393A34">-></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></div><div class="token-line" style="color:#393A34"><span class="token plain">node2</span><span class="token operator" style="color:#393A34">-></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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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"><</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"><</span><span class="token generic-function generic class-name">Node</span><span class="token generic-function generic class-name operator" 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 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></div></code></pre></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 anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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"><</span><span class="token generic-function generic class-name">UserV1</span><span class="token generic-function generic class-name operator" style="color:#393A34">></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></div><div 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"><</span><span class="token generic-function generic class-name">UserV2</span><span class="token generic-function generic class-name operator" style="color:#393A34">></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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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"><</span><span class="token generic-function generic class-name">UserV2</span><span class="token generic-function generic class-name operator" 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 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></div><div 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">&&</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></div></code></pre></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 anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">RowEncoder</span><span class="token operator" style="color:#393A34"><</span><span class="token plain">SensorReading</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 plain"></span><br></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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">-></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></div><div 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">-></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></div><div 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">-></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></div></code></pre></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_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div 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">-></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></div><div 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">-></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">-></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">-></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></div><div 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></div></code></pre></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 anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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 anchorTargetStickyNavbar_Vzrq" 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)" translate="no"></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_QJqH"><pre tabindex="0" class="prism-code language-cmake codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">cmake_minimum_required(VERSION 3.16)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">project(my_project LANGUAGES CXX)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">set(CMAKE_CXX_STANDARD 17)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">include(FetchContent)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">FetchContent_Declare(fory</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> GIT_REPOSITORY https://github.com/apache/fory.git</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> GIT_TAG v0.15.0</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> SOURCE_SUBDIR cpp)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">FetchContent_MakeAvailable(fory)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">add_executable(my_app main.cc)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">target_link_libraries(my_app PRIVATE fory::serialization)</span><br></div></code></pre></div></div> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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_QJqH"><pre tabindex="0" class="prism-code language-bazel codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">bazel_dep(name = "fory", version = "0.15.0")</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">git_override(module_name = "fory",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> remote = "https://github.com/apache/fory.git",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> commit = "v0.15.0")</span><br></div></code></pre></div></div> |
| <div class="language-bazel codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bazel codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">cc_binary(name = "my_app", srcs = ["main.cc"],</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> deps = ["@fory//cpp/fory/serialization:fory_serialization"])</span><br></div></code></pre></div></div> |
| <hr> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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"><</span><span class="token generic-function generic class-name">Address</span><span class="token generic-function generic class-name operator" style="color:#393A34">></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></div><div 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"><</span><span class="token generic-function generic class-name">Person</span><span class="token generic-function generic class-name operator" style="color:#393A34">></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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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"><<</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></div><div 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"><</span><span class="token keyword" style="color:#00009f">uint8_t</span><span class="token operator" style="color:#393A34">></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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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"><</span><span class="token generic-function generic class-name">Person</span><span class="token generic-function generic class-name operator" 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 punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div 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">&&</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></div></code></pre></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_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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></div></code></pre></div></div> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h3> |
| <p>All Fory operations return <code>Result<T, Error></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_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div 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></div><div 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></div><div 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"><<</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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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></div></code></pre></div></div> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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"><</span><span class="token generic-function generic class-name">MyType</span><span class="token generic-function generic class-name operator" style="color:#393A34">></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></div><div 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">&</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></div></code></pre></div></div> |
| <hr> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// C++</span><span class="token plain"></span><br></div><div 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></div><div 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"><</span><span class="token generic-function generic class-name">Order</span><span class="token generic-function generic class-name operator" style="color:#393A34">></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></div><div 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></div></code></pre></div></div> |
| <div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div 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></div><div 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></div><div 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></div></code></pre></div></div> |
| <div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div 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></div><div 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></div><div 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></div></code></pre></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 anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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 anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h4> |
| <div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain">foryc </span><span class="token parameter variable" style="color:#36acaa">--help</span><br></div></code></pre></div></div> |
| <h4 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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_QJqH"><pre tabindex="0" class="prism-code language-protobuf codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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></div><div 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<std::string></span><span class="token plain"></span><br></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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<FixedDiscount, PercentDiscount> in C++</span><span class="token plain"></span><br></div><div 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></div><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain"> list</span><span class="token operator" style="color:#393A34"><</span><span class="token plain">OrderItem</span><span class="token operator" style="color:#393A34">></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<OrderItem></span><span class="token plain"></span><br></div><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></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<T></code></td><td>Nullable field</td></tr><tr><td><code>ref T</code></td><td><code>std::shared_ptr<T></code></td><td>Shared / circular reference</td></tr><tr><td><code>ref(weak=true) T</code></td><td><code>fory::serialization::SharedWeak<T></code></td><td>Weak reference (breaks cycles)</td></tr><tr><td><code>list<T></code></td><td><code>std::vector<T></code></td><td>Ordered list</td></tr><tr><td><code>map<K,V></code></td><td><code>std::map<K,V></code></td><td>Key-value map</td></tr></tbody></table> |
| <h4 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div></code></pre></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 anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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">-></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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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></div><div 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></div></code></pre></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 anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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<T></code>, <code>std::set<T></code>, <code>std::unordered_set<T></code>, <code>std::map<K,V></code>, <code>std::unordered_map<K,V></code></td></tr><tr><td>Optional/Union</td><td><code>std::optional<T></code>, <code>std::variant<Ts...></code></td></tr><tr><td>Smart Pointers</td><td><code>std::shared_ptr<T></code> (ref tracking + polymorphism), <code>std::unique_ptr<T></code>, <code>fory::serialization::SharedWeak<T></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 anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div></code></pre></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 anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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 anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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 class=""><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 class=""><strong>Cross-language</strong>: The same binary format works natively with Java, Python, Go, Rust, and JavaScript</li> |
| <li class=""><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 class=""><strong>Production-ready features</strong>: Polymorphism, circular references, schema evolution, thread safety out of the box</li> |
| <li class=""><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_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div 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></div><div 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">&&</span><span class="token plain"> cmake </span><span class="token parameter variable" style="color:#36acaa">--build</span><span class="token plain"> build</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">./build/hello_world</span><br></div></code></pre></div></div> |
| <p><strong>Documentation:</strong></p> |
| <ul> |
| <li class="">C++ Serialization Guide: <a href="https://fory.apache.org/docs/guide/cpp" target="_blank" rel="noopener noreferrer" class="">fory.apache.org/docs/guide/cpp</a></li> |
| <li class="">Fory Schema IDL Compiler: <a href="https://fory.apache.org/docs/compiler" target="_blank" rel="noopener noreferrer" class="">fory.apache.org/docs/compiler</a></li> |
| <li class="">Xlang Serialization Spec: <a href="https://fory.apache.org/docs/specification/xlang_serialization_spec/" target="_blank" rel="noopener noreferrer" class="">fory.apache.org/docs/specification</a></li> |
| </ul> |
| <p><strong>Community:</strong></p> |
| <ul> |
| <li class="">GitHub: <a href="https://github.com/apache/fory" target="_blank" rel="noopener noreferrer" class="">apache/fory</a></li> |
| <li class="">Slack: <a href="https://join.slack.com/t/fory-project/shared_invite/zt-1u8soj4qc-ieYEu7ciHOqA2mo47llS8A" target="_blank" rel="noopener noreferrer" class="">Join our community</a></li> |
| <li class="">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" class="">144 PR</a> from 17 distinct contributors. See the <a href="https://fory.apache.org/docs/start/install" target="_blank" rel="noopener noreferrer" class="">Install</a> Page to learn how to get the libraries for your platform.</p> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <ul> |
| <li class="">feat(go): new golang xlang serialization implementation by @chaokunyang in <a href="https://github.com/apache/fory/pull/3063" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3063</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3087</a></li> |
| <li class="">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" class="">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" class="">https://github.com/apache/fory/pull/3093</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3107</a></li> |
| <li class="">feat(cpp): add <code>SharedWeak<T></code> for circular reference support by @chaokunyang in <a href="https://github.com/apache/fory/pull/3109" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3109</a></li> |
| <li class="">feat(xlang): support unsigned int for xlang by @chaokunyang in <a href="https://github.com/apache/fory/pull/3111" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3111</a> and <a href="https://github.com/apache/fory/pull/3113" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3113</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3153</a></li> |
| <li class="">feat(xlang): fory schema idl and compiler by @chaokunyang in <a href="https://github.com/apache/fory/pull/3106" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3106</a></li> |
| <li class="">feat(compiler): add flatbuffers idl support by @chaokunyang in <a href="https://github.com/apache/fory/pull/3184" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3184</a></li> |
| </ul> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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 class="">Cross-language mode with Java, Python, <code>cpp</code>, Rust, and JavaScript (<code>fory.WithXlang(true)</code>)</li> |
| <li class="">Reflection-based serialization by default, plus optional experimental AOT code generation for hot paths</li> |
| <li class="">Reference tracking for shared/circular object graphs (<code>fory.WithTrackRef(true)</code> + <code>fory:"ref"</code> tags)</li> |
| <li class="">Compatible mode for schema evolution (<code>fory.WithCompatible(true)</code>) supporting add/remove/reorder field changes</li> |
| <li class="">Thread-safe wrapper (<code>github.com/apache/fory/go/fory/threadsafe</code>) for concurrent workloads</li> |
| </ul> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h3> |
| <div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">package</span><span class="token plain"> main</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain"> ID </span><span class="token builtin">int64</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> Name </span><span class="token builtin">string</span><span class="token plain"></span><br></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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">&</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></div><div 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></div><div 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">&</span><span class="token plain">out</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div> |
| <ul> |
| <li class="">Go guide: <a href="https://fory.apache.org/docs/guide/go/" target="_blank" rel="noopener noreferrer" class="">https://fory.apache.org/docs/guide/go/</a></li> |
| </ul> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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" class="">https://fory.apache.org/docs/benchmarks/go/</a></p> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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 class="">Schema-first development with <code>enum</code>, <code>message</code>, and <code>union</code></li> |
| <li class="">Fory-native field semantics: <code>optional</code> (nullability), <code>ref</code> (shared/circular references), <code>list</code>, and <code>map</code></li> |
| <li class="">Multi-language code generation for Java, Python, Go, Rust, and <code>cpp</code></li> |
| <li class="">Protobuf (<code>.proto</code>) and FlatBuffers (<code>.fbs</code>) frontend support, translated into Fory IR/codegen</li> |
| <li class="">Idiomatic generated APIs with <code>to/from bytes</code> helpers</li> |
| </ul> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h3> |
| <div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div 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></div></code></pre></div></div> |
| <div class="language-protobuf codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-protobuf codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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_QJqH"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div> |
| <div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div> |
| <div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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">></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></div><div 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></div><div 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">></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></div></code></pre></div></div> |
| <ul> |
| <li class="">Compiler docs: <a href="https://fory.apache.org/docs/compiler/" target="_blank" rel="noopener noreferrer" class="">https://fory.apache.org/docs/compiler/</a></li> |
| </ul> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <ul> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3048</a></li> |
| <li class="">perf: add cpp benchmark report by @chaokunyang in <a href="https://github.com/apache/fory/pull/3051" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3051</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3059</a></li> |
| <li class="">feat(go): new golang xlang serialization implementation by @chaokunyang in <a href="https://github.com/apache/fory/pull/3063" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3063</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3021</a></li> |
| <li class="">feat(cpp): add iterator container serialization support by @zhan7236 in <a href="https://github.com/apache/fory/pull/3068" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3068</a></li> |
| <li class="">refactor(go): refactor go error processing by @chaokunyang in <a href="https://github.com/apache/fory/pull/3069" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3069</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3074</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3062</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3071</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3077</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3080</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3081</a></li> |
| <li class="">refactor(python): refactor pyfory serializers code structure by @chaokunyang in <a href="https://github.com/apache/fory/pull/3083" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3083</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3084</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3082</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3087</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3089</a></li> |
| <li class="">feat(cpp): support customize cpp field meta by @chaokunyang in <a href="https://github.com/apache/fory/pull/3088" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3088</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3090</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3091</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3092</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3070</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3093</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3101</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3103</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3104</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3107</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3108</a></li> |
| <li class="">feat(cpp): add <code>SharedWeak<T></code> for circular reference support by @chaokunyang in <a href="https://github.com/apache/fory/pull/3109" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3109</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3100</a></li> |
| <li class="">feat(xlang): support unsigned int for xlang by @chaokunyang in <a href="https://github.com/apache/fory/pull/3111" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3111</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3115</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3113</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3120</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3124</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3126</a></li> |
| <li class="">refactor(go): rename go interface<!-- --> to any by @chaokunyang in <a href="https://github.com/apache/fory/pull/3128" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3128</a></li> |
| <li class="">refactor(xlang): remove magic number from protocol by @chaokunyang in <a href="https://github.com/apache/fory/pull/3137" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3137</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3140</a></li> |
| <li class="">refactor(java/cpp): rename morphic to dynamic by @chaokunyang in <a href="https://github.com/apache/fory/pull/3142" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3142</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3139</a></li> |
| <li class="">feat: add unsigned number for dart by @ayush00git in <a href="https://github.com/apache/fory/pull/3144" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3144</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3153</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3155</a></li> |
| <li class="">feat(xlang): fory schema idl and compiler by @chaokunyang in <a href="https://github.com/apache/fory/pull/3106" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3106</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3180</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3179</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3161</a></li> |
| <li class="">feat(dart): add dart ci by @chaokunyang in <a href="https://github.com/apache/fory/pull/3189" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3189</a></li> |
| <li class="">feat(compiler): add flatbuffers idl support by @chaokunyang in <a href="https://github.com/apache/fory/pull/3184" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3184</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3190</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3181</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3192</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3195</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3193</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3199</a></li> |
| <li class="">feat(JavaScript): impl the xlang string by @theweipeng in <a href="https://github.com/apache/fory/pull/3197" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3197</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3200</a></li> |
| <li class="">feat(go): use option for optional fields by @chaokunyang in <a href="https://github.com/apache/fory/pull/3202" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3202</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3214</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3201</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3204</a></li> |
| <li class="">feat(go): remove murmur hash go deps by @chaokunyang in <a href="https://github.com/apache/fory/pull/3217" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3217</a></li> |
| <li class="">feat(compiler): refine generated cpp API by @chaokunyang in <a href="https://github.com/apache/fory/pull/3221" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3221</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3219</a></li> |
| <li class="">ci: speed up setup-python on windows by @chaokunyang in <a href="https://github.com/apache/fory/pull/3222" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3222</a></li> |
| <li class="">feat(python): add buffer index accessors by @chaokunyang in <a href="https://github.com/apache/fory/pull/3223" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3223</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3226</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3232</a></li> |
| <li class="">feat(JavaScript): impl xlang writer by @theweipeng in <a href="https://github.com/apache/fory/pull/3234" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3234</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3236</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3238</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3240</a></li> |
| <li class="">perf(go): optimize go perf by @chaokunyang in <a href="https://github.com/apache/fory/pull/3241" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3241</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3242</a></li> |
| <li class="">refactor(compiler): refactor fory compiler command line by @chaokunyang in <a href="https://github.com/apache/fory/pull/3243" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3243</a></li> |
| <li class="">feat(compiler): add compatible mode for idl by @chaokunyang in <a href="https://github.com/apache/fory/pull/3245" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3245</a></li> |
| <li class="">feat(go): add float16 support to go by @ayush00git in <a href="https://github.com/apache/fory/pull/3235" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3235</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3247</a></li> |
| <li class="">feat(JavaScript): Impl xlang Map and Collection by @theweipeng in <a href="https://github.com/apache/fory/pull/3249" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3249</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3248</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3256</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3255</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3259</a></li> |
| <li class="">feat(compiler): add evolution option support by @chaokunyang in <a href="https://github.com/apache/fory/pull/3262" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3262</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3264</a></li> |
| <li class="">perf: optimize schema evolution mode performance by @chaokunyang in <a href="https://github.com/apache/fory/pull/3260" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3260</a></li> |
| <li class="">feat(JavaScript): Impl xlang JavaScript testcase by @theweipeng in <a href="https://github.com/apache/fory/pull/3263" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3263</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3295</a></li> |
| </ul> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <ul> |
| <li class="">fix(docs): fix graalvm link by @chaokunyang in <a href="https://github.com/apache/fory/pull/3056" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3056</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3057</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3060</a></li> |
| <li class="">fix(java): Better ergonomics for AllowListChecker by @Asuka-star in <a href="https://github.com/apache/fory/pull/3061" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3061</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3067</a></li> |
| <li class="">fix(java): Fix CopyOnWriteArrayList field serialization by @vybhavjs in <a href="https://github.com/apache/fory/pull/3079" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3079</a></li> |
| <li class="">fix(go): reference tracking fails when >127 objects serialized by @jonyoder in <a href="https://github.com/apache/fory/pull/3086" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3086</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3095</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3094</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3114</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3129</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3138</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3149</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3151</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3159</a></li> |
| <li class="">fix(java): fix openj9 sliced string serde by @chaokunyang in <a href="https://github.com/apache/fory/pull/3160" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3160</a></li> |
| <li class="">fix(cpp): fix fory cpp compile warnings by @chaokunyang in <a href="https://github.com/apache/fory/pull/3188" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3188</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3230</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3265</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3293</a></li> |
| </ul> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <ul> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3052</a></li> |
| <li class="">chore: fix benchmark plot by @chaokunyang in <a href="https://github.com/apache/fory/pull/3053" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3053</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3055</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3065</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3072</a></li> |
| <li class="">chore(rust): revert rust crates version by @ariesdevil in <a href="https://github.com/apache/fory/pull/3075" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3075</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3078</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3096</a></li> |
| <li class="">docs(go): add go serialization doc by @chaokunyang in <a href="https://github.com/apache/fory/pull/3121" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3121</a></li> |
| <li class="">docs(go): fix go serialization doc by @chaokunyang in <a href="https://github.com/apache/fory/pull/3125" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3125</a></li> |
| <li class="">docs(go): fix broken go doc links by @chaokunyang in <a href="https://github.com/apache/fory/pull/3127" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3127</a></li> |
| <li class="">docs(go): add go version requirements by @chaokunyang in <a href="https://github.com/apache/fory/pull/3134" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3134</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3135</a></li> |
| <li class="">docs: adjust doc links and sync config by @chaokunyang in <a href="https://github.com/apache/fory/pull/3136" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3136</a></li> |
| <li class="">docs: remove redundant prefix doc id by @chaokunyang in <a href="https://github.com/apache/fory/pull/3141" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3141</a></li> |
| <li class="">docs: add field configuration doc by @chaokunyang in <a href="https://github.com/apache/fory/pull/3143" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3143</a></li> |
| <li class="">docs: fix field type broken links by @chaokunyang in <a href="https://github.com/apache/fory/pull/3146" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3146</a></li> |
| <li class="">docs: fix field type meta pos by @chaokunyang in <a href="https://github.com/apache/fory/pull/3147" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3147</a></li> |
| <li class="">docs: fix native field type meta doc by @chaokunyang in <a href="https://github.com/apache/fory/pull/3148" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3148</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3152</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3156</a></li> |
| <li class="">docs: update agents.md by @chaokunyang in <a href="https://github.com/apache/fory/pull/3162" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3162</a></li> |
| <li class="">docs(compiler): update fory compiler doc by @chaokunyang in <a href="https://github.com/apache/fory/pull/3183" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3183</a></li> |
| <li class="">docs: fix protobuf docs by @chaokunyang in <a href="https://github.com/apache/fory/pull/3185" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3185</a></li> |
| <li class="">docs: add missing protobuf-idl.md by @chaokunyang in <a href="https://github.com/apache/fory/pull/3186" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3186</a></li> |
| <li class="">docs(cpp): add cpp polymorphism doc by @chaokunyang in <a href="https://github.com/apache/fory/pull/3187" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3187</a></li> |
| <li class="">docs: Fix links in README by @chaokunyang in <a href="https://github.com/apache/fory/pull/3212" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3212</a></li> |
| <li class="">chore(java): rename _getTypeResolver to getTypeResolver by @chaokunyang in <a href="https://github.com/apache/fory/pull/3227" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3227</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3228</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3258</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3257</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3261</a></li> |
| <li class="">docs(go): add go benchmarks result by @chaokunyang in <a href="https://github.com/apache/fory/pull/3296" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3296</a></li> |
| <li class="">chore: speedup windows ci by @chaokunyang in <a href="https://github.com/apache/fory/pull/3297" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3297</a></li> |
| </ul> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <ul> |
| <li class="">@jim-parsons made their first contribution in <a href="https://github.com/apache/fory/pull/3048" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3048</a></li> |
| <li class="">@Asuka-star made their first contribution in <a href="https://github.com/apache/fory/pull/3061" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3061</a></li> |
| <li class="">@userzhy made their first contribution in <a href="https://github.com/apache/fory/pull/3067" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3067</a></li> |
| <li class="">@ariesdevil made their first contribution in <a href="https://github.com/apache/fory/pull/3074" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3074</a></li> |
| <li class="">@Eiskomet made their first contribution in <a href="https://github.com/apache/fory/pull/3078" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3078</a></li> |
| <li class="">@vybhavjs made their first contribution in <a href="https://github.com/apache/fory/pull/3079" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3079</a></li> |
| <li class="">@jonyoder made their first contribution in <a href="https://github.com/apache/fory/pull/3086" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3086</a></li> |
| <li class="">@theharsh999 made their first contribution in <a href="https://github.com/apache/fory/pull/3100" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3100</a></li> |
| <li class="">@madhavajay made their first contribution in <a href="https://github.com/apache/fory/pull/3114" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3114</a></li> |
| <li class="">@Pigsy-Monk made their first contribution in <a href="https://github.com/apache/fory/pull/3115" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3115</a></li> |
| <li class="">@ayush00git made their first contribution in <a href="https://github.com/apache/fory/pull/3139" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3139</a></li> |
| <li class="">@Howard-aile made their first contribution in <a href="https://github.com/apache/fory/pull/3156" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3156</a></li> |
| <li class="">@xflcx1991 made their first contribution in <a href="https://github.com/apache/fory/pull/3230" target="_blank" rel="noopener noreferrer" class="">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" class="">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" class="">6 PR</a> from 5 distinct contributors. See the <a href="https://fury.apache.org/docs/docs/start/install" target="_blank" rel="noopener noreferrer" class="">Install</a> Page to learn how to get the libraries for your platform.</p> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <ul> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3074</a></li> |
| </ul> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <ul> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3074</a></li> |
| <li class="">feat(java): mark createSerializer as public by @chaokunyang</li> |
| </ul> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <ul> |
| <li class="">fix(java): Fix CopyOnWriteArrayList field serialization by @vybhavjs in <a href="https://github.com/apache/fory/pull/3079" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3079</a></li> |
| <li class="">fix(java): Better ergonomics for AllowListChecker by @Asuka-star in <a href="https://github.com/apache/fory/pull/3061" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3061</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/commit/3ad627c9</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3060</a></li> |
| <li class="">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" class="">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" class="">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" class="">85 PR</a> from 11 distinct contributors. See the <a href="https://fory.apache.org/docs/start/install" target="_blank" rel="noopener noreferrer" class="">Install</a> Page to learn how to get the libraries for your platform.</p> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <ul> |
| <li class=""><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 class=""><strong>Row Format & Type System</strong>: New row-oriented format type system across Java, Python, and C++, enabling row-columnar conversions and removing Arrow dependencies</li> |
| <li class=""><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 class=""><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 class=""><strong>Advanced Java Features</strong>: GraalVM Native Image support via <code>ForyFeature</code> and optimized serializers for blocking queues and final fields</li> |
| <li class=""><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 anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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 class="">Macro-based struct registration via <code>FORY_STRUCT</code> for compile-time type safety</li> |
| <li class="">Cross-language serialization with Java, Python, Go, Rust, and JavaScript</li> |
| <li class="">Forward/backward compatible schema evolution (Compatible mode)</li> |
| <li class="">Reference tracking for shared objects and circular references</li> |
| <li class="">Thread-safe and single-threaded (fastest) variants</li> |
| <li class="">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 class="">Zero-copy Row format for analytics workloads with random field access</li> |
| <li class="">CMake (FetchContent) and Bazel build system support</li> |
| </ul> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h3> |
| <div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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></div><div 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"><</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">></span><span class="token plain"> hobbies</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div><div 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"><</span><span class="token generic-function generic class-name">Person</span><span class="token generic-function generic class-name operator" style="color:#393A34">></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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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"><</span><span class="token generic-function generic class-name">Person</span><span class="token generic-function generic class-name operator" 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 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div> |
| <ul> |
| <li class="">Guide: C++ Serialization – <a href="https://fory.apache.org/docs/docs/guide/cpp/" target="_blank" rel="noopener noreferrer" class="">https://fory.apache.org/docs/docs/guide/cpp/</a></li> |
| <li class="">Examples: <a href="https://github.com/apache/fory/tree/main/examples/cpp/hello_world" target="_blank" rel="noopener noreferrer" class="">hello_world</a>, <a href="https://github.com/apache/fory/tree/main/examples/cpp/hello_row" target="_blank" rel="noopener noreferrer" class="">hello_row</a></li> |
| </ul> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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" class="">https://github.com/apache/fory/tree/main/benchmarks/cpp_benchmark</a></p> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <ul> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2875</a></li> |
| <li class="">feat(rust): add duration serializer support by @chaokunyang in <a href="https://github.com/apache/fory/pull/2878" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2878</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2881</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2882</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2883</a></li> |
| <li class="">feat(rust): direct derive primitve write/read by @chaokunyang in <a href="https://github.com/apache/fory/pull/2890" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2890</a></li> |
| <li class="">perf(rust): optimize buffer write read perf by @chaokunyang in <a href="https://github.com/apache/fory/pull/2892" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2892</a></li> |
| <li class="">feat(Rust): Support u128 & u128_array by @urlyy in <a href="https://github.com/apache/fory/pull/2899" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2899</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2908</a></li> |
| <li class="">feat(python): pure python row-columar convert by @chaokunyang in <a href="https://github.com/apache/fory/pull/2919" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2919</a></li> |
| <li class="">feat(c++): implement xlang serialization for c++ by @chaokunyang in <a href="https://github.com/apache/fory/pull/2925" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2925</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2928</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2931</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2936</a></li> |
| <li class="">feat(c+/python): upgrade bazel to bazel8 by @chaokunyang in <a href="https://github.com/apache/fory/pull/2937" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2937</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2938</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2939</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2942</a></li> |
| <li class="">feat(c++ ): add cpp benchmark by @chaokunyang in <a href="https://github.com/apache/fory/pull/2943" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2943</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2945</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2946</a></li> |
| <li class="">feat(rust): add fory config for rust by @chaokunyang in <a href="https://github.com/apache/fory/pull/2947" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2947</a></li> |
| <li class="">perf(c++): optimize cpp serialization performance by @chaokunyang in <a href="https://github.com/apache/fory/pull/2944" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2944</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2951</a></li> |
| <li class="">feat: refine python module check by @chaokunyang in <a href="https://github.com/apache/fory/pull/2952" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2952</a></li> |
| <li class="">feat(java): support jdk 25 by @chaokunyang in <a href="https://github.com/apache/fory/pull/2954" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2954</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2955</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2959</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2960</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2917</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2962</a></li> |
| <li class="">perf(c++): fair benchmark for cpp by @chaokunyang in <a href="https://github.com/apache/fory/pull/2963" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2963</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2966</a></li> |
| <li class="">perf(c++): add media content benchmark by @chaokunyang in <a href="https://github.com/apache/fory/pull/2968" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2968</a></li> |
| <li class="">feat(c++): support polymorphic collection elements serialization by @chaokunyang in <a href="https://github.com/apache/fory/pull/2974" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2974</a></li> |
| <li class="">feat(c++): add cpp tuple serializer by @chaokunyang in <a href="https://github.com/apache/fory/pull/2975" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2975</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2985</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2701</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2980</a></li> |
| <li class="">feat(python): parallel python wheel build by @chaokunyang in <a href="https://github.com/apache/fory/pull/2989" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2989</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2986</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2995</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3009</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2998</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3019</a></li> |
| <li class="">ci: remove macos x86 CI for Python by @chaokunyang in <a href="https://github.com/apache/fory/pull/3023" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3023</a></li> |
| <li class="">feat(c++): support unsigned type for cpp by @chaokunyang in <a href="https://github.com/apache/fory/pull/3022" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3022</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3032</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3034</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3035</a></li> |
| <li class="">feat(): add c++ user guide doc by @chaokunyang in <a href="https://github.com/apache/fory/pull/3037" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3037</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3045</a></li> |
| </ul> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <ul> |
| <li class="">fix(Rust): fix Binary implementation by @urlyy in <a href="https://github.com/apache/fory/pull/2902" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2902</a></li> |
| <li class="">fix(rust): fix array field support by @chaokunyang in <a href="https://github.com/apache/fory/pull/2933" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2933</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2934</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2948</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2949</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2953</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2956</a></li> |
| <li class="">fix(cpp): fix the type error by @LiangliangSui in <a href="https://github.com/apache/fory/pull/2961" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2961</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2991</a></li> |
| <li class="">fix(java): support serialization of CopyOnWriteArraySet by @LiangliangSui in <a href="https://github.com/apache/fory/pull/2999" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2999</a></li> |
| </ul> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <ul> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2876</a></li> |
| <li class="">chore(rust): fix tuple test comment by @chaokunyang in <a href="https://github.com/apache/fory/pull/2877" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2877</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2879</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2837</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2888</a></li> |
| <li class="">chore(CI): Fix cache with symlinks by @prakash-218 in <a href="https://github.com/apache/fory/pull/2893" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2893</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2894</a></li> |
| <li class="">docs: fix rust benchmark links by @chaokunyang in <a href="https://github.com/apache/fory/pull/2896" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2896</a></li> |
| <li class="">docs: fix cargo benchmark comand in doc by @chaokunyang in <a href="https://github.com/apache/fory/pull/2897" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2897</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2901</a></li> |
| <li class="">docs(java): add logging section by @mosinnik in <a href="https://github.com/apache/fory/pull/2905" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2905</a></li> |
| <li class="">chore(c++): remove cpp benchmarks by @chaokunyang in <a href="https://github.com/apache/fory/pull/2926" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2926</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2940</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2964</a></li> |
| <li class="">chore: Remove the content related to arrow. by @LiangliangSui in <a href="https://github.com/apache/fory/pull/2965" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2965</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2970</a></li> |
| <li class="">docs: Update Bazel version in README.md by @chaokunyang in <a href="https://github.com/apache/fory/pull/2971" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2971</a></li> |
| <li class="">docs: refine xlang spec documentation by @chaokunyang in <a href="https://github.com/apache/fory/pull/2979" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2979</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2984</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2983</a></li> |
| <li class="">docs: Update xlang_serialization_spec.md by @chaokunyang in <a href="https://github.com/apache/fory/pull/2987" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2987</a></li> |
| <li class="">docs: update the C++ benchmark case by @LiangliangSui in <a href="https://github.com/apache/fory/pull/2988" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2988</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2996</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2997</a></li> |
| <li class="">chore(python): mark pyfory as stable by @chaokunyang in <a href="https://github.com/apache/fory/pull/3001" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3001</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/3033</a></li> |
| <li class="">docs: refactor user guide docs by @chaokunyang in <a href="https://github.com/apache/fory/pull/3036" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3036</a></li> |
| <li class="">docs: add scala and kotlin docs by @chaokunyang in <a href="https://github.com/apache/fory/pull/3040" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3040</a></li> |
| <li class="">docs: refactor xlang docs by @chaokunyang in <a href="https://github.com/apache/fory/pull/3041" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3041</a></li> |
| <li class="">docs: add row format spec by @chaokunyang in <a href="https://github.com/apache/fory/pull/3042" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3042</a></li> |
| <li class="">docs: fix sidebar position by @chaokunyang in <a href="https://github.com/apache/fory/pull/3043" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3043</a></li> |
| <li class="">docs: remove copy rust/python docs by @chaokunyang in <a href="https://github.com/apache/fory/pull/3044" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/3044</a></li> |
| </ul> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <ul> |
| <li class="">@mosinnik made their first contribution in <a href="https://github.com/apache/fory/pull/2876" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2876</a></li> |
| <li class="">@prakash-218 made their first contribution in <a href="https://github.com/apache/fory/pull/2888" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2888</a></li> |
| <li class="">@zhan7236 made their first contribution in <a href="https://github.com/apache/fory/pull/2953" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2953</a></li> |
| <li class="">@mchernyakov made their first contribution in <a href="https://github.com/apache/fory/pull/2917" target="_blank" rel="noopener noreferrer" class="">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" class="">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" class="">25 PR</a> from 4 distinct contributors. See the <a href="https://fury.apache.org/docs/docs/start/install" target="_blank" rel="noopener noreferrer" class="">Install</a> Page to learn how to get the libraries for your platform.</p> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <ul> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2946</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2881</a></li> |
| </ul> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <ul> |
| <li class="">feat(rust): add fory config for rust by @chaokunyang in <a href="https://github.com/apache/fory/pull/2947" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2947</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2946</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2945</a></li> |
| <li class="">feat(Rust): Support u128 & u128_array by @urlyy in <a href="https://github.com/apache/fory/pull/2899" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2899</a></li> |
| <li class="">perf(rust): optimize buffer write read perf by @chaokunyang in <a href="https://github.com/apache/fory/pull/2892" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2892</a></li> |
| <li class="">feat(rust): direct derive primitve write/read by @chaokunyang in <a href="https://github.com/apache/fory/pull/2890" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2890</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2883</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2882</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2881</a></li> |
| <li class="">feat(rust): add duration serializer support by @chaokunyang in <a href="https://github.com/apache/fory/pull/2878" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2878</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2875</a></li> |
| <li class="">feat: refine python module check by @chaokunyang in <a href="https://github.com/apache/fory/pull/2952" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2952</a></li> |
| </ul> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <ul> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2948</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2934</a></li> |
| <li class="">fix(rust): fix array field support by @chaokunyang in <a href="https://github.com/apache/fory/pull/2933" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2933</a></li> |
| <li class="">fix(Rust): fix Binary implementation by @urlyy in <a href="https://github.com/apache/fory/pull/2902" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2902</a></li> |
| </ul> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <ul> |
| <li class="">docs(java): add logging section by @mosinnik in <a href="https://github.com/apache/fory/pull/2905" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2905</a></li> |
| <li class="">docs: fix cargo benchmark comand in doc by @chaokunyang in <a href="https://github.com/apache/fory/pull/2897" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2897</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2894</a></li> |
| <li class="">chore(CI): Fix cache with symlinks by @PrakashRaj-GK in <a href="https://github.com/apache/fory/pull/2893" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2893</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2888</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2837</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2879</a></li> |
| <li class="">chore(rust): fix tuple test comment by @chaokunyang in <a href="https://github.com/apache/fory/pull/2877" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2877</a></li> |
| <li class="">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" class="">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" class="">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" class="">28 PR</a> from 11 distinct contributors. See the <a href="https://fury.apache.org/docs/docs/start/install" target="_blank" rel="noopener noreferrer" class="">Install</a> Page to learn how to get the libraries for your platform.</p> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <ul> |
| <li class="">Support rust enum variant and schema evolution for tuple/struct style enum</li> |
| <li class="">Support rust tuple serialization and schema evolution</li> |
| <li class="">Support rust skip macro attributes</li> |
| </ul> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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 class=""><strong>Add/remove variants</strong>: Unknown variants fall back to <code>#[fory(default)]</code></li> |
| <li class=""><strong>Add/remove fields</strong>: Named variants support field evolution with automatic defaults</li> |
| <li class=""><strong>Modify elements</strong>: Unnamed variants handle element count changes (extras skipped, missing use defaults)</li> |
| <li class=""><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_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div></code></pre></div></div> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h3> |
| <p>Tuples (1-22 elements) now support length evolution in Compatible mode:</p> |
| <ul> |
| <li class=""><strong>Length changes</strong>: Grow or shrink tuple size (missing elements get defaults, extras discarded)</li> |
| <li class=""><strong>Collections</strong>: <code>Vec</code>, <code>HashMap</code>, <code>HashSet</code> elements fully supported</li> |
| <li class=""><strong>Nested tuples</strong>: Multi-level nesting with independent evolution per level</li> |
| <li class=""><strong>Smart pointers</strong>: <code>Option</code>, <code>Arc</code>, <code>Rc</code> wrapped elements handle evolution correctly</li> |
| <li class=""><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_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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">&</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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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">&</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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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">&</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></div><div 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">&</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></div><div 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></div></code></pre></div></div> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <ul> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2835</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2845</a></li> |
| <li class="">feat(rust): Support rust tagged union enum by @urlyy in <a href="https://github.com/apache/fory/pull/2855" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2855</a></li> |
| <li class="">feat(rust): support unsigned number for rust by @chaokunyang in <a href="https://github.com/apache/fory/pull/2857" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2857</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2858</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2868</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2865</a></li> |
| <li class="">feat(Rust): Support usize by @urlyy in <a href="https://github.com/apache/fory/pull/2870" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2870</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2871</a></li> |
| <li class="">feat(rust): add array support for rust by @chaokunyang in <a href="https://github.com/apache/fory/pull/2874" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2874</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2873</a></li> |
| </ul> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <ul> |
| <li class="">fix: fix 0.14.0 snapshot version by @chaokunyang in <a href="https://github.com/apache/fory/pull/2842" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2842</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2869</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2852</a></li> |
| </ul> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <ul> |
| <li class="">docs(rust): update rust benchmark report table by @chaokunyang in <a href="https://github.com/apache/fory/pull/2836" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2836</a></li> |
| <li class="">chore(rust): update cargo toml for publish by @chaokunyang in <a href="https://github.com/apache/fory/pull/2838" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2838</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2841</a></li> |
| <li class="">docs: fix doc sync dest by @chaokunyang in <a href="https://github.com/apache/fory/pull/2839" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2839</a></li> |
| <li class="">docs: refactor readme by @chaokunyang in <a href="https://github.com/apache/fory/pull/2843" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2843</a></li> |
| <li class="">docs: add AGENTS to readme by @chaokunyang in <a href="https://github.com/apache/fory/pull/2844" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2844</a></li> |
| <li class="">chore: remove agents from main readme by @chaokunyang in <a href="https://github.com/apache/fory/pull/2846" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2846</a></li> |
| <li class="">docs: update readme by @chaokunyang in <a href="https://github.com/apache/fory/pull/2847" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2847</a></li> |
| <li class="">docs: fix xlang type mapping link by @chaokunyang in <a href="https://github.com/apache/fory/pull/2848" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2848</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2834</a></li> |
| <li class="">chore(java): Remove print property names by @Danden1 in <a href="https://github.com/apache/fory/pull/2860" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2860</a></li> |
| <li class="">chore(python): add py3.13 release flag by @chaokunyang in <a href="https://github.com/apache/fory/pull/2872" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2872</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2867</a></li> |
| </ul> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <ul> |
| <li class="">@Danden1 made their first contribution in <a href="https://github.com/apache/fory/pull/2860" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2860</a></li> |
| <li class="">@coderunner234 made their first contribution in <a href="https://github.com/apache/fory/pull/2869" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2869</a></li> |
| <li class="">@REASY made their first contribution in <a href="https://github.com/apache/fory/pull/2867" target="_blank" rel="noopener noreferrer" class="">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" class="">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 class="">🐙 GitHub: <a href="https://github.com/apache/fory" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory</a></li> |
| <li class="">📦 Crate: <a href="https://crates.io/crates/fory" target="_blank" rel="noopener noreferrer" class="">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 anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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 class=""><strong>Fast but fragile</strong>: Hand-rolled binary formats that break with schema changes</li> |
| <li class=""><strong>Flexible but slow</strong>: JSON/Protocol with 10x performance overhead</li> |
| <li class=""><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 anchorTargetStickyNavbar_Vzrq" 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?" translate="no"></a></h2> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div><div 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">&</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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div></code></pre></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 anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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">&</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></div><div 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"><</span><span class="token class-name">Rc</span><span class="token operator" style="color:#393A34"><</span><span class="token class-name">String</span><span class="token operator" 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">&</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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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">&</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">&</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></div><div 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">&</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">&</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></div></code></pre></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_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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></div><div 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"><</span><span class="token class-name">RefCell</span><span class="token operator" style="color:#393A34"><</span><span class="token class-name">Node</span><span class="token operator" 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">// Weak pointer breaks cycles</span><span class="token plain"></span><br></div><div 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"><</span><span class="token class-name">Rc</span><span class="token operator" style="color:#393A34"><</span><span class="token class-name">RefCell</span><span class="token operator" style="color:#393A34"><</span><span class="token class-name">Node</span><span class="token operator" 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><span class="token comment" style="color:#999988;font-style:italic">// Strong references tracked</span><span class="token plain"></span><br></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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></div><div 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">&</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></div><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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">&</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></div><div 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"><</span><span class="token class-name">RefCell</span><span class="token operator" style="color:#393A34"><</span><span class="token class-name">Node</span><span class="token operator" 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">&</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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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">&</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">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></div></code></pre></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 anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h3> |
| <p>Rust's trait system enables powerful abstractions, but serializing <code>Box<dyn Trait></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_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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">&</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">-></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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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"><</span><span class="token class-name">Box</span><span class="token operator" style="color:#393A34"><</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">>></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></div><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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">&</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></div><div 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"><</span><span class="token class-name">Box</span><span class="token operator" style="color:#393A34"><</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">>></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">&</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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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></div></code></pre></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_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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"><</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">></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></div><div 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"><</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">></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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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">&</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></div><div 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"><</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">></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">&</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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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"><</span><span class="token class-name">Dog</span><span class="token operator" 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">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></div><div 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></div></code></pre></div></div> |
| <p><strong>Supports</strong>:</p> |
| <ul> |
| <li class=""><code>Box<dyn Trait></code> - Owned trait objects</li> |
| <li class=""><code>Rc<dyn Trait></code> / <code>Arc<dyn Trait></code> - Reference-counted trait objects</li> |
| <li class=""><code>Rc<dyn Any></code> / <code>Arc<dyn Any></code> - Runtime type dispatch without traits</li> |
| <li class="">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 anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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"><</span><span class="token class-name">User</span><span class="token operator" style="color:#393A34">></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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div><div 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"><</span><span class="token class-name">String</span><span class="token operator" 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 field</span><span class="token plain"></span><br></div><div 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"><</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">></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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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"><</span><span class="token class-name">User</span><span class="token operator" style="color:#393A34">></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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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">&</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></div><div 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">&</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></div><div 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></div></code></pre></div></div> |
| <p><strong>Compatibility rules</strong>:</p> |
| <ul> |
| <li class="">✅ Add new fields (default values applied)</li> |
| <li class="">✅ Remove fields (skipped during deserialization)</li> |
| <li class="">✅ Reorder fields (matched by name)</li> |
| <li class="">✅ Change nullability (<code>T</code> ↔ <code>Option<T></code>)</li> |
| <li class="">❌ Type changes (except nullable variants)</li> |
| </ul> |
| <p>This is critical for zero-downtime deployments and polyglot microservices.</p> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h3> |
| <p>Apache Fory uses a sophisticated binary protocol designed for both performance and flexibility:</p> |
| <div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">| fory header | reference meta | type meta | value data |</span><br></div></code></pre></div></div> |
| <p><strong>Key innovations</strong>:</p> |
| <ol> |
| <li class=""><strong>Efficient encoding</strong>: Variable-length integers, compact type IDs, bit-packed flags</li> |
| <li class=""><strong>Reference tracking</strong>: Deduplicates shared objects automatically (serialize once, reference thereafter)</li> |
| <li class=""><strong>Meta compression</strong>: Gzip compression for type metadata in meta-sharing mode</li> |
| <li class=""><strong>Little-endian layout</strong>: Optimized for modern CPU architectures</li> |
| </ol> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div></code></pre></div></div> |
| <p><strong>Benefits</strong>:</p> |
| <ul> |
| <li class="">⚡ <strong>Zero runtime overhead</strong>: No reflection, no vtable lookups</li> |
| <li class="">🛡️ <strong>Type safety</strong>: Compile-time errors instead of runtime panics</li> |
| <li class="">📦 <strong>Small binary size</strong>: Only code for types you actually use</li> |
| <li class="">🔍 <strong>IDE support</strong>: Full autocomplete and error checking</li> |
| </ul> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h3> |
| <p>Apache Fory Rust consists of three focused crates:</p> |
| <div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">fory/ # High-level API</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> └─ Convenience wrappers, derive re-exports</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">fory-core/ # Core serialization engine</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> ├─ fory.rs # Main entry point</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> ├─ buffer.rs # Zero-copy binary I/O</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> ├─ serializer/ # Type-specific serializers</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> ├─ resolver/ # Type registration & dispatch</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> ├─ meta/ # Meta string compression</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> └─ row/ # Row format implementation</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">fory-derive/ # Procedural macros</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> ├─ object/ # ForyObject derive macro</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> └─ fory_row.rs # ForyRow derive macro</span><br></div></code></pre></div></div> |
| <p>This modular design ensures clean separation of concerns and makes the codebase maintainable.</p> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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 anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h3> |
| <ol> |
| <li class=""> |
| <p><strong>Microservices with polyglot teams</strong></p> |
| <ul> |
| <li class="">Different services in different languages</li> |
| <li class="">Need seamless data exchange without schema files</li> |
| <li class="">Schema evolution across independent deployments</li> |
| </ul> |
| </li> |
| <li class=""> |
| <p><strong>High-performance data pipelines</strong></p> |
| <ul> |
| <li class="">Processing millions of records per second</li> |
| <li class="">Memory-constrained environments (use row format)</li> |
| <li class="">Analytics workloads with selective field access</li> |
| </ul> |
| </li> |
| <li class=""> |
| <p><strong>Complex domain models</strong></p> |
| <ul> |
| <li class="">Circular references (parent-child relationships, graphs)</li> |
| <li class="">Polymorphic types (trait objects, inheritance hierarchies)</li> |
| <li class="">Rich object graphs with shared references</li> |
| </ul> |
| </li> |
| <li class=""> |
| <p><strong>Real-time systems</strong></p> |
| <ul> |
| <li class="">Low-latency requirements (<code><1ms</code> serialization)</li> |
| <li class="">Memory-mapped file access</li> |
| <li class="">Zero-copy deserialization critical</li> |
| </ul> |
| </li> |
| </ol> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h3> |
| <ol> |
| <li class=""><strong>You need human-readable data</strong>: Use JSON/YAML for debugging</li> |
| <li class=""><strong>You need long-term storage format</strong>: Use Parquet for data lakes</li> |
| <li class=""><strong>Your data is trivial</strong>: serde + bincode is simpler for basic types</li> |
| </ol> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">[dependencies]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">fory = "0.13"</span><br></div></code></pre></div></div> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h3> |
| <div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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">-></span><span class="token plain"> </span><span class="token class-name">Result</span><span class="token operator" 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 class-name">Error</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></div><div 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></div><div 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"><</span><span class="token class-name">User</span><span class="token operator" style="color:#393A34">></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></div><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div><div 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">&</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></div><div 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></div><div 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">&</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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h3> |
| <div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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"><</span><span class="token class-name">User</span><span class="token operator" style="color:#393A34">></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></div><div 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::<User>("example", "User");</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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">&</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></div><div 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></div></code></pre></div></div> |
| <p>Register types with <strong>consistent IDs or names</strong> across all languages:</p> |
| <ul> |
| <li class=""><strong>By ID</strong> (<code>fory.register::<User>(1)</code>): Faster serialization, more compact encoding, but requires coordination to avoid ID conflicts</li> |
| <li class=""><strong>By name</strong> (<code>fory.register_by_name::<User>("example.User")</code>): More flexible, less prone to conflicts, easier to manage across teams, but slightly larger encoding</li> |
| </ul> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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<T></code>, <code>HashMap<K,V></code>, <code>BTreeMap<K,V></code>, <code>HashSet<T></code>, <code>Option<T></code></p> |
| <p><strong>Smart Pointers</strong>: <code>Box<T></code>, <code>Rc<T></code>, <code>Arc<T></code>, <code>RcWeak<T></code>, <code>ArcWeak<T></code>, <code>RefCell<T></code>, <code>Mutex<T></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<dyn T></code>, <code>Rc<dyn T></code>, <code>Arc<dyn T></code>, <code>Rc<dyn Any></code>, <code>Arc<dyn Any></code></p> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <p>Apache Fory Rust is production-ready today, but we're just getting started and continuing active development:</p> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h3> |
| <ul> |
| <li class="">✅ Static codegen via procedural macros</li> |
| <li class="">✅ Row format serialization with zero-copy</li> |
| <li class="">✅ Cross-language object graph serialization</li> |
| <li class="">✅ Shared and circular reference tracking</li> |
| <li class="">✅ Weak pointer support (RcWeak, ArcWeak)</li> |
| <li class="">✅ Trait object serialization (Box/Rc/Arc)</li> |
| <li class="">✅ Schema evolution in compatible mode</li> |
| </ul> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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 anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h3> |
| <p>We're actively seeking contributors for:</p> |
| <ul> |
| <li class=""><strong>Performance tuning</strong>: Profile and optimize hot paths</li> |
| <li class=""><strong>Documentation</strong>: More examples, tutorials, and guides</li> |
| <li class=""><strong>Testing</strong>: Fuzzing, property tests, edge case coverage</li> |
| </ul> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h3> |
| <p><code>Fory</code> becomes fully thread-safe after registration is complete. Once every type is registered (which requires <code>&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_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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"><</span><span class="token class-name">Item</span><span class="token operator" style="color:#393A34">></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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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"><</span><span class="token plain">_</span><span class="token operator" 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 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></div><div 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></div><div 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">&</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></div><div 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></div><div 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></div><div 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">&</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></div><div 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">&</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></div><div 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></div><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h3> |
| <p>Apache Fory uses <code>Result<T, Error></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_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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"><</span><span class="token class-name">User</span><span class="token operator" style="color:#393A34">></span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" 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><br></div><div 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">=></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></div><div 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">=></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></div><div 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">=></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></div><div 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">=></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></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <ul> |
| <li class="">Apache Fory Rust Guide: <a href="https://fory.apache.org/docs/docs/guide/rust_serialization" target="_blank" rel="noopener noreferrer" class="">📖 View</a></li> |
| <li class="">Apache Fory Rust API Doc: <a href="https://docs.rs/fory/latest/fory/" target="_blank" rel="noopener noreferrer" class="">📖 View</a></li> |
| <li class="">Apache Fory Xlang Serialization Spec: <a href="https://fory.apache.org/docs/specification/fory_xlang_serialization_spec/" target="_blank" rel="noopener noreferrer" class="">📖 View</a></li> |
| </ul> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <p>Apache Fory is an <strong>Apache Software Foundation</strong> project with a vibrant, growing community:</p> |
| <ul> |
| <li class=""><strong>GitHub</strong>: <a href="https://github.com/apache/fory" target="_blank" rel="noopener noreferrer" class="">apache/fory</a></li> |
| <li class=""><strong>Docs</strong>: <a href="https://fory.apache.org/" target="_blank" rel="noopener noreferrer" class="">fory.apache.org</a></li> |
| <li class=""><strong>Slack</strong>: <a href="https://join.slack.com/t/fory-project/shared_invite/zt-1u8soj4qc-ieYEu7ciHOqA2mo47llS8A" target="_blank" rel="noopener noreferrer" class="">Join our community</a></li> |
| <li class=""><strong>Issue Tracker</strong>: <a href="https://github.com/apache/fory/issues" target="_blank" rel="noopener noreferrer" class="">GitHub Issues</a></li> |
| </ul> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h3> |
| <p>We welcome contributions of all kinds:</p> |
| <ol> |
| <li class=""><strong>Code</strong>: Implement features from the roadmap</li> |
| <li class=""><strong>Docs</strong>: Write tutorials, examples, and guides</li> |
| <li class=""><strong>Testing</strong>: Add benchmarks, fuzz tests, integration tests</li> |
| <li class=""><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" class="">CONTRIBUTING.md</a> for guidelines.</p> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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 anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <p>Apache Fory Rust represents a paradigm shift in serialization:</p> |
| <ul> |
| <li class=""><strong>No more trade-offs</strong>: Get performance <em>and</em> flexibility</li> |
| <li class=""><strong>No more boilerplate</strong>: Derive macros handle the complexity</li> |
| <li class=""><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_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div></code></pre></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_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div 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></div><div 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></div></code></pre></div></div> |
| <p><strong>Share your experience</strong>:</p> |
| <ul> |
| <li class="">Write a blog post about your use case</li> |
| <li class="">Present at your local Rust meetup</li> |
| <li class="">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" class="">217 PR</a> from 19 distinct contributors. See the <a href="https://fury.apache.org/docs/docs/start/install" target="_blank" rel="noopener noreferrer" class="">Install</a> Page to learn how to get the libraries for your platform.</p> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <ul> |
| <li class="">Dynamic Trait Object Serialization for Rust</li> |
| <li class="">Shared/Circular ownership serialization for Rust</li> |
| <li class="">Schema Forward/Backward compatibilify for Rust</li> |
| <li class="">Drop-in Replacement for Python pickle: support local function/classes/<code>__reduce__</code>/<code>__getstate__</code> serialization</li> |
| <li class="">Schema Forward/Backward compatibilify for Python dataclass</li> |
| <li class="">Support codegen for xlang mode in java</li> |
| <li class="">Primitive array compression using SIMD</li> |
| <li class="">Compact Row Codec for Row Format</li> |
| <li class="">Schema Forward/Backward compatibilify for Go</li> |
| <li class="">Ahead-of-time codegen for golang struct serialization</li> |
| </ul> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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 class="">Derive-based object graph serialization via <code>#[derive(ForyObject)]</code></li> |
| <li class="">Polymorphism for trait objects: <code>Box<dyn Trait></code>, <code>Rc<dyn Trait></code>, <code>Arc<dyn Trait></code>, plus <code>dyn Any</code></li> |
| <li class="">Shared and circular reference tracking: <code>Rc</code>/<code>Arc</code> and <code>RcWeak</code>/<code>ArcWeak</code></li> |
| <li class="">Forward/backward compatible schema evolution (Compatible mode)</li> |
| <li class="">Zero-copy Row format via <code>#[derive(ForyRow)]</code> with selective field access</li> |
| <li class="">Thread-safe and multi-thread capable serialization (context pool)</li> |
| <li class="">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 anchorTargetStickyNavbar_Vzrq" 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):" translate="no"></a></h3> |
| <div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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">-></span><span class="token plain"> </span><span class="token class-name">Result</span><span class="token operator" 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 class-name">Error</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></div><div 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></div><div 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"><</span><span class="token class-name">User</span><span class="token operator" style="color:#393A34">></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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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">&</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></div><div 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">&</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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div> |
| <ul> |
| <li class="">Guide: Rust Serialization – <a href="https://fory.apache.org/docs/docs/guide/rust_serialization" target="_blank" rel="noopener noreferrer" class="">https://fory.apache.org/docs/docs/guide/rust_serialization</a></li> |
| <li class="">Crate: fory on crates.io – <a href="https://crates.io/crates/fory" target="_blank" rel="noopener noreferrer" class="">https://crates.io/crates/fory</a></li> |
| <li class="">API docs: docs.rs – <a href="https://docs.rs/fory/latest/fory" target="_blank" rel="noopener noreferrer" class="">https://docs.rs/fory/latest/fory</a></li> |
| </ul> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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" class="">https://github.com/apache/fory/blob/main/benchmarks/rust_benchmark/README.md</a></p> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></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 class="">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 class="">Honors Python hooks: <code>__getstate__</code>, <code>__setstate__</code>, <code>__reduce__</code>, <code>__reduce_ex__</code></li> |
| <li class="">Reference tracking for shared/circular graphs with <code>ref=True</code></li> |
| <li class="">Pickle protocol 5 out‑of‑band buffers for zero‑copy via <code>pickle.PickleBuffer</code> (NumPy, Pandas, etc.)</li> |
| <li class="">Security: <code>strict=True</code> for registration‑based safety and <code>DeserializationPolicy</code> for fine‑grained control</li> |
| <li class="">Threading: <code>ThreadSafeFory</code> for safe multi‑thread use</li> |
| <li class="">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_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> pyfory</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div 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></div><div 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></div></code></pre></div></div> |
| <p>Read more: Python Guide – <a href="https://fory.apache.org/docs/latest/python_serialization/" target="_blank" rel="noopener noreferrer" class="">https://fory.apache.org/docs/latest/python_serialization/</a></p> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <ul> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2464</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2466</a></li> |
| <li class="">feat(memory): add customizable MemoryAllocator interface by @adriacabeza in <a href="https://github.com/apache/fory/pull/2467" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2467</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2483</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2490</a></li> |
| <li class="">feat(python): add register api to python by @chaokunyang in <a href="https://github.com/apache/fory/pull/2491" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2491</a></li> |
| <li class="">feat(python): meta compression for python by @chaokunyang in <a href="https://github.com/apache/fory/pull/2504" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2504</a></li> |
| <li class="">feat(python): type meta encoding for python by @chaokunyang in <a href="https://github.com/apache/fory/pull/2509" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2509</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2523</a></li> |
| <li class="">feat(Rust): Implementing Type Compatible by @urlyy in <a href="https://github.com/apache/fory/pull/2492" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2492</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2528</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2545</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2554</a></li> |
| <li class="">feat(Rust): Support automatic conversion between T and <code>Option<T></code> when deserialize by @urlyy in <a href="https://github.com/apache/fory/pull/2563" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2563</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2576</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2577</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2553</a></li> |
| <li class="">feat(java): support limit deserialization depth by @chaokunyang in <a href="https://github.com/apache/fory/pull/2578" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2578</a></li> |
| <li class="">feat(rust): add fory rust benchmark by @chaokunyang in <a href="https://github.com/apache/fory/pull/2583" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2583</a></li> |
| <li class="">perf(rust): optimize rust deserialize perf by @chaokunyang in <a href="https://github.com/apache/fory/pull/2584" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2584</a></li> |
| <li class="">feat(rust): add rust profiler for serialization by @chaokunyang in <a href="https://github.com/apache/fory/pull/2588" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2588</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2594</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2593</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2602</a></li> |
| <li class="">feat(java/python): support enum xlang serialization by @chaokunyang in <a href="https://github.com/apache/fory/pull/2603" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2603</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2585</a></li> |
| <li class="">perf(python/java): Fix & optimize cross-language meta-share mode by @pandalee99 in <a href="https://github.com/apache/fory/pull/2601" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2601</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2610</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2613</a></li> |
| <li class="">feat(java): primitive array compression using SIMD by @adriacabeza in <a href="https://github.com/apache/fory/pull/2485" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2485</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2615</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2607</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2617</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2623</a></li> |
| <li class="">feat(python): support limit pyfory depth by @chaokunyang in <a href="https://github.com/apache/fory/pull/2625" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2625</a></li> |
| <li class="">feat(Rust): sort fields && feat Enum && fix read/write type_info && fix type_meta en/decode by @urlyy in <a href="https://github.com/apache/fory/pull/2630" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2630</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2629</a></li> |
| <li class="">refactor(java): refactor type resolver by @chaokunyang in <a href="https://github.com/apache/fory/pull/2640" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2640</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2641</a></li> |
| <li class="">refactor(java/python): refine collection header bitmap by @chaokunyang in <a href="https://github.com/apache/fory/pull/2642" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2642</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2643</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2638</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2648</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2649</a></li> |
| <li class="">feat(java): support graalvm 25 by @chaokunyang in <a href="https://github.com/apache/fory/pull/2652" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2652</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2655</a></li> |
| <li class="">refactor(Rust): Refactor compile-time code & fix named_enum & fix skip enum by @urlyy in <a href="https://github.com/apache/fory/pull/2657" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2657</a></li> |
| <li class="">feat(python): support local py class serialization by @chaokunyang in <a href="https://github.com/apache/fory/pull/2665" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2665</a></li> |
| <li class="">refactor(go): refine collection header bitmap by @junjiexh in <a href="https://github.com/apache/fory/pull/2656" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2656</a></li> |
| <li class="">feat(python): support class methods serialization by @chaokunyang in <a href="https://github.com/apache/fory/pull/2670" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2670</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2676</a></li> |
| <li class="">feat(rust): support box serde for rust by @chaokunyang in <a href="https://github.com/apache/fory/pull/2677" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2677</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2678</a></li> |
| <li class="">feat(python): refine python serialization api by @chaokunyang in <a href="https://github.com/apache/fory/pull/2673" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2673</a></li> |
| <li class="">refactor(Rust): Refine api name by @urlyy in <a href="https://github.com/apache/fory/pull/2671" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2671</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2691</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2704</a></li> |
| <li class="">feat(rust): support shared reference tracking for <code>arc/rc<dyn T></code> by @chaokunyang in <a href="https://github.com/apache/fory/pull/2707" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2707</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2708</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2709</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2711</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2716</a></li> |
| <li class="">feat(Rust): named_xx se/de && ext se/de && add unittest by @urlyy in <a href="https://github.com/apache/fory/pull/2712" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2712</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2714</a></li> |
| <li class="">feat(rust): support limit max dyn depth by @chaokunyang in <a href="https://github.com/apache/fory/pull/2730" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2730</a></li> |
| <li class="">feat(Rust): Unroll fields loop & Add a feature for this by @urlyy in <a href="https://github.com/apache/fory/pull/2724" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2724</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2732</a></li> |
| <li class="">refactor(go): Replace legacy RegisterTagType api call by @junjiexh in <a href="https://github.com/apache/fory/pull/2696" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2696</a></li> |
| <li class="">feat(python): add thread safe fory by @chaokunyang in <a href="https://github.com/apache/fory/pull/2735" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2735</a></li> |
| <li class="">feat(rust): support VecDeque/LinkedList serialization by @chaokunyang in <a href="https://github.com/apache/fory/pull/2741" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2741</a></li> |
| <li class="">feat(rust): support btreemap serialization by @chaokunyang in <a href="https://github.com/apache/fory/pull/2743" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2743</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2744</a></li> |
| <li class="">feat(Rust): support context_pool to reduce context allocation && support se/de in multi-thread by @urlyy in <a href="https://github.com/apache/fory/pull/2737" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2737</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2745</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2749</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2751</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2758</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2763</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2764</a></li> |
| <li class="">feat(java): introduce Compact Row Codec by @stevenschlansker in <a href="https://github.com/apache/fory/pull/2414" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2414</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2674</a></li> |
| <li class="">feat(rust): make Serializer api to return Result && replace panic/expect/assert/unwrap with Result by @urlyy in <a href="https://github.com/apache/fory/pull/2765" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2765</a></li> |
| <li class="">feat(rust): refactor rust serialization system by @chaokunyang in <a href="https://github.com/apache/fory/pull/2774" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2774</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2766</a></li> |
| <li class="">feat(rust): dynamic rust serializer system by @chaokunyang in <a href="https://github.com/apache/fory/pull/2778" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2778</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2782</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2784</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2787</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2779</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2789</a></li> |
| <li class="">perf(Rust): remove clone()/to_owned() on MetaString/MetaStringBytes in MetaStringResolver to improve performance && fix xlang test by @urlyy in <a href="https://github.com/apache/fory/pull/2791" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2791</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2793</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2801</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2803</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2807</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2809</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2811</a></li> |
| <li class="">perf(Rust): Enchance performance by @theweipeng in <a href="https://github.com/apache/fory/pull/2810" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2810</a></li> |
| <li class="">feat(Rust): Support serialize_to by @theweipeng in <a href="https://github.com/apache/fory/pull/2822" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2822</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2824</a></li> |
| <li class="">perf(Rust): Refactor reader by @theweipeng in <a href="https://github.com/apache/fory/pull/2826" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2826</a></li> |
| <li class="">perf(python): optimize pyfory perf by @chaokunyang in <a href="https://github.com/apache/fory/pull/2829" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2829</a></li> |
| </ul> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <ul> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2465</a></li> |
| <li class="">fix(python): fix gh action pypi publish by @chaokunyang in <a href="https://github.com/apache/fory/pull/2468" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2468</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2469</a></li> |
| <li class="">fix(python): fix pyfory pypi release by @chaokunyang in <a href="https://github.com/apache/fory/pull/2473" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2473</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2478</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2486</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2494</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2497</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2500</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2506</a></li> |
| <li class="">fix(python): fix publich tag for workflow by @chaokunyang in <a href="https://github.com/apache/fory/pull/2517" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2517</a></li> |
| <li class="">fix(ci): print workflow head branch by @chaokunyang in <a href="https://github.com/apache/fory/pull/2518" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2518</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2519</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2524</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2522</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2532</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2535</a></li> |
| <li class="">fix(python): fix bump_wheel version by @chaokunyang in <a href="https://github.com/apache/fory/pull/2534" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2534</a></li> |
| <li class="">fix(python): fix bump version by @chaokunyang in <a href="https://github.com/apache/fory/pull/2536" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2536</a></li> |
| <li class="">fix(python): add macos 13 release by @chaokunyang in <a href="https://github.com/apache/fory/pull/2538" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2538</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2541</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2542</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2551</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2561</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2560</a></li> |
| <li class="">fix(java): fix codegen name conflict by @chaokunyang in <a href="https://github.com/apache/fory/pull/2565" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2565</a></li> |
| <li class="">fix(java): fix classinfo npe on graalvm by @chaokunyang in <a href="https://github.com/apache/fory/pull/2572" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2572</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2573</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2575</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2540</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2591</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2592</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2596</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2600</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2614</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2616</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2619</a></li> |
| <li class="">fix(python): fix pyfory depth limit by @chaokunyang in <a href="https://github.com/apache/fory/pull/2626" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2626</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2632</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2634</a></li> |
| <li class="">fix(java): fix record serialization on graalvm25 by @chaokunyang in <a href="https://github.com/apache/fory/pull/2644" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2644</a></li> |
| <li class="">fix(java): fix field converter for xlang by @chaokunyang in <a href="https://github.com/apache/fory/pull/2654" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2654</a></li> |
| <li class="">fix(java): fix array serialization on graalvm by @chaokunyang in <a href="https://github.com/apache/fory/pull/2664" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2664</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2667</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2680</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2682</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2683</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2687</a></li> |
| <li class="">fix(python): fix python module/type serialize by @chaokunyang in <a href="https://github.com/apache/fory/pull/2688" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2688</a></li> |
| <li class="">fix(java): Fix flakiness in CollectionSerializersTest#tesPriorityQueueSerializer by @swj20010308 in <a href="https://github.com/apache/fory/pull/2693" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2693</a></li> |
| <li class="">fix(java): Fix flakiness in LazyMapTest#testMap by @swj20010308 in <a href="https://github.com/apache/fory/pull/2692" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2692</a></li> |
| <li class="">fix(java): fix deserializing EXT type bug by @mengnankkkk in <a href="https://github.com/apache/fory/pull/2700" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2700</a></li> |
| <li class="">fix(java): fix xlang typedef encode by @chaokunyang in <a href="https://github.com/apache/fory/pull/2719" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2719</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2739</a></li> |
| <li class="">fix(java): Fix flakiness in ForyCopyTest#mutableObjectCopyTest by @swj20010308 in <a href="https://github.com/apache/fory/pull/2738" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2738</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2733</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2740</a></li> |
| <li class="">fix(ci): fix sync file by @chaokunyang in <a href="https://github.com/apache/fory/pull/2750" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2750</a></li> |
| <li class="">fix(ci): fix sync files by @chaokunyang in <a href="https://github.com/apache/fory/pull/2752" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2752</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2753</a></li> |
| <li class="">fix(java): fix maven cache by @chaokunyang in <a href="https://github.com/apache/fory/pull/2755" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2755</a></li> |
| <li class="">fix(rust): fix rust xlang tests by @chaokunyang in <a href="https://github.com/apache/fory/pull/2788" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2788</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2790</a></li> |
| <li class="">fix(java): fix java shanpshot version by @chaokunyang in <a href="https://github.com/apache/fory/pull/2800" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2800</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2814</a></li> |
| </ul> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <ul> |
| <li class="">chore(python): disable pyfory.format import warning by @chaokunyang in <a href="https://github.com/apache/fory/pull/2476" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2476</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2489</a></li> |
| <li class="">docs: fix meta_size_mask by @urlyy in <a href="https://github.com/apache/fory/pull/2495" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2495</a></li> |
| <li class="">chore: fix typos by @Asnowww in <a href="https://github.com/apache/fory/pull/2496" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2496</a></li> |
| <li class="">docs: Improve pyfory PyPI documentation by @esafak in <a href="https://github.com/apache/fory/pull/2498" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2498</a></li> |
| <li class="">docs(python): add row format doc by @chaokunyang in <a href="https://github.com/apache/fory/pull/2499" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2499</a></li> |
| <li class="">chore: translate Chinese comments into English by @Asnowww in <a href="https://github.com/apache/fory/pull/2503" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2503</a></li> |
| <li class="">docs: Improve pull request template by @esafak in <a href="https://github.com/apache/fory/pull/2508" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2508</a></li> |
| <li class="">ci: Fix Windows wheel creation by @esafak in <a href="https://github.com/apache/fory/pull/2511" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2511</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2514</a></li> |
| <li class="">chore: fix MetaStrEncoding by @co63oc in <a href="https://github.com/apache/fory/pull/2516" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2516</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2544</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2556</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2569</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2568</a></li> |
| <li class="">docs(java): add idea jdk11 usage config by @chaokunyang in <a href="https://github.com/apache/fory/pull/2570" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2570</a></li> |
| <li class="">docs(rust): add rust document by @chaokunyang in <a href="https://github.com/apache/fory/pull/2582" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2582</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2589</a></li> |
| <li class="">chore: add trademark for fory name by @chaokunyang in <a href="https://github.com/apache/fory/pull/2590" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2590</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2597</a></li> |
| <li class="">chore: remove slash in homepage URL by @chaokunyang in <a href="https://github.com/apache/fory/pull/2604" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2604</a></li> |
| <li class="">chore(go): replace all typ to type_ by @chaokunyang in <a href="https://github.com/apache/fory/pull/2612" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2612</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2645</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2646</a></li> |
| <li class="">chore(rust): remove tag read/write by @chaokunyang in <a href="https://github.com/apache/fory/pull/2681" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2681</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2689</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2690</a></li> |
| <li class="">docs: fix python readme lint by @chaokunyang in <a href="https://github.com/apache/fory/pull/2694" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2694</a></li> |
| <li class="">docs(rust): add comprehensive rust readme document by @chaokunyang in <a href="https://github.com/apache/fory/pull/2723" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2723</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2728</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2734</a></li> |
| <li class="">docs(rust): update rust roadmap by @chaokunyang in <a href="https://github.com/apache/fory/pull/2754" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2754</a></li> |
| <li class="">docs(rust): fix rust doc broken link by @chaokunyang in <a href="https://github.com/apache/fory/pull/2756" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2756</a></li> |
| <li class="">docs(rust): fix rust doc lint by @chaokunyang in <a href="https://github.com/apache/fory/pull/2757" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2757</a></li> |
| <li class="">docs(go): Update README.md by @junjiexh in <a href="https://github.com/apache/fory/pull/2675" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2675</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2781</a></li> |
| <li class="">chore(rust): rename fory-tests to tests by @chaokunyang in <a href="https://github.com/apache/fory/pull/2783" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2783</a></li> |
| <li class="">docs(rust): update rust serializer trait doc by @chaokunyang in <a href="https://github.com/apache/fory/pull/2795" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2795</a></li> |
| <li class="">chore: fix release error by @chaokunyang in <a href="https://github.com/apache/fory/pull/2796" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2796</a></li> |
| <li class="">chore(python): rename numeric typehint by @chaokunyang in <a href="https://github.com/apache/fory/pull/2808" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2808</a></li> |
| <li class="">chore(rust): reorder fory rust methods by @chaokunyang in <a href="https://github.com/apache/fory/pull/2813" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2813</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2816</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2817</a></li> |
| <li class="">chore(rust): rename metastring to meta_string by @urlyy in <a href="https://github.com/apache/fory/pull/2812" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2812</a></li> |
| <li class="">docs(rust): add serialize_to api doc by @chaokunyang in <a href="https://github.com/apache/fory/pull/2825" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2825</a></li> |
| <li class="">chore(Rust): Streamline code by @theweipeng in <a href="https://github.com/apache/fory/pull/2828" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2828</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2830</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2831</a></li> |
| </ul> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <ul> |
| <li class="">@adriacabeza made their first contribution in <a href="https://github.com/apache/fory/pull/2467" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2467</a></li> |
| <li class="">@Asnowww made their first contribution in <a href="https://github.com/apache/fory/pull/2496" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2496</a></li> |
| <li class="">@open-snail made their first contribution in <a href="https://github.com/apache/fory/pull/2500" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2500</a></li> |
| <li class="">@junjiexh made their first contribution in <a href="https://github.com/apache/fory/pull/2554" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2554</a></li> |
| <li class="">@ThisingL made their first contribution in <a href="https://github.com/apache/fory/pull/2553" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2553</a></li> |
| <li class="">@gudzpoz made their first contribution in <a href="https://github.com/apache/fory/pull/2680" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2680</a></li> |
| <li class="">@wuwangben made their first contribution in <a href="https://github.com/apache/fory/pull/2687" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2687</a></li> |
| <li class="">@swj20010308 made their first contribution in <a href="https://github.com/apache/fory/pull/2693" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2693</a></li> |
| <li class="">@mengnankkkk made their first contribution in <a href="https://github.com/apache/fory/pull/2700" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2700</a></li> |
| <li class="">@SanyamSuyal made their first contribution in <a href="https://github.com/apache/fory/pull/2733" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2733</a></li> |
| <li class="">@mymde made their first contribution in <a href="https://github.com/apache/fory/pull/2740" target="_blank" rel="noopener noreferrer" class="">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" class="">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" class="">4 PR</a>. See the <a href="https://fury.apache.org/docs/docs/start/install" target="_blank" rel="noopener noreferrer" class="">Install</a> Page to learn how to get the libraries for your platform.</p> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <ul> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2617</a></li> |
| <li class="">feat(python): support limit pyfory depth by @chaokunyang in <a href="https://github.com/apache/fory/pull/2625" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2625</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2629</a></li> |
| </ul> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <ul> |
| <li class="">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" class="">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" class="">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" class="">10 PR</a> from 4 distinct contributors. See the <a href="https://fury.apache.org/docs/docs/start/install" target="_blank" rel="noopener noreferrer" class="">Install</a> Page to learn how to get the libraries for your platform.</p> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <ul> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2576</a></li> |
| <li class="">feat(java): support limit deserialization depth by @chaokunyang in <a href="https://github.com/apache/fory/pull/2578" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2578</a></li> |
| </ul> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <ul> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2561</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2560</a></li> |
| <li class="">fix(java): fix codegen name conflict by @chaokunyang in <a href="https://github.com/apache/fory/pull/2565" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2565</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2573</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2575</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2540</a></li> |
| </ul> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <ul> |
| <li class="">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" class="">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" class="">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" class="">24 PR</a> from 5 distinct contributors. See the <a href="https://fury.apache.org/docs/docs/start/install" target="_blank" rel="noopener noreferrer" class="">Install</a> Page to learn how to get the libraries for your platform.</p> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <ul> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2490</a></li> |
| <li class="">feat(python): add register api to python by @chaokunyang in <a href="https://github.com/apache/fory/pull/2491" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2491</a></li> |
| </ul> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <ul> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2494</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2497</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2500</a></li> |
| </ul> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <ul> |
| <li class="">Improve PyPI landing page and add row-format documentation (<a href="https://github.com/apache/fory/pull/2498" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2498</a>, <a href="https://github.com/apache/fory/pull/2499" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2499</a>)</li> |
| <li class="">Refactor python release workflow by @esafak in <a href="https://github.com/apache/fory/pull/2483" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2483</a> <a href="https://github.com/apache/fory/pull/2532" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2532</a></li> |
| <li class="">chore: translate Chinese comments into English by @Asnowww in <a href="https://github.com/apache/fory/pull/2503" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2503</a></li> |
| </ul> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <ul> |
| <li class="">@Asnowww made their first contribution in <a href="https://github.com/apache/fory/pull/2503" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2503</a></li> |
| <li class="">@open-snail made their first contribution in <a href="https://github.com/apache/fory/pull/2500" target="_blank" rel="noopener noreferrer" class="">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" class="">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" class="">64 PR</a> from 9 distinct contributors. See the <a href="https://fury.apache.org/docs/docs/start/install" target="_blank" rel="noopener noreferrer" class="">Install</a> Page to learn how to get the libraries for your platform.</p> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <ul> |
| <li class="">[Python] Support Python <code>__getstate__/__setstate__/__reduce__</code> serialization protocol</li> |
| <li class="">[Python] Support serialize python function</li> |
| <li class="">[Java] Use JDK11 for fory-format module</li> |
| <li class="">[Scala]Support default value for scala case/pojo classes when deseralizing</li> |
| <li class="">[Kotlin] Support default value for kotlin data classes when deserializing</li> |
| </ul> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <ul> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2388</a></li> |
| <li class="">refactor(python): Unify DataClassSerializer and ComplexObjectSerializer by @esafak in <a href="https://github.com/apache/fory/pull/2389" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2389</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2396</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2395</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2400</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2401</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2405</a></li> |
| <li class="">perf(Go/python): Type system compatibility upgrade by @pandalee99 in <a href="https://github.com/apache/fory/pull/2339" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2339</a></li> |
| <li class="">feat(python): Add FunctionSerializer for function serialization by @esafak in <a href="https://github.com/apache/fory/pull/2404" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2404</a></li> |
| <li class="">feat: Implement ObjectSerializer for custom objects by @esafak in <a href="https://github.com/apache/fory/pull/2413" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2413</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2412</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2415</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2416</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2419</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2406</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2448</a></li> |
| <li class="">feat(python): add register api for python by @chaokunyang in <a href="https://github.com/apache/fory/pull/2451" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2451</a></li> |
| <li class="">feat(java): add graalvm 23 ci by @chaokunyang in <a href="https://github.com/apache/fory/pull/2463" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2463</a></li> |
| </ul> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <ul> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2374</a></li> |
| <li class="">fix(java): ClassDef header calculation error by @LiangliangSui in <a href="https://github.com/apache/fory/pull/2382" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2382</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2381</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2418</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2427</a></li> |
| <li class="">fix(rust): fix rust lint error by @chaokunyang in <a href="https://github.com/apache/fory/pull/2447" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2447</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2444</a></li> |
| <li class="">fix(java): MemoryBuffer::readChars by @LouisLou2 in <a href="https://github.com/apache/fory/pull/2438" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2438</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2449</a></li> |
| <li class="">fix(java): fix install jdks by @chaokunyang in <a href="https://github.com/apache/fory/pull/2450" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2450</a></li> |
| <li class="">fix(java): fix maven deploy by @chaokunyang in <a href="https://github.com/apache/fory/pull/2452" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2452</a></li> |
| <li class="">fix(java): fix shade janino duplciate entry by @chaokunyang in <a href="https://github.com/apache/fory/pull/2453" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2453</a></li> |
| <li class="">fix(java): fix extension java module conflict by @chaokunyang in <a href="https://github.com/apache/fory/pull/2455" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2455</a></li> |
| <li class="">fix(java): fix extension java module conflict by @chaokunyang in <a href="https://github.com/apache/fory/pull/2456" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2456</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2462</a></li> |
| <li class="">fix(python): fix pyfory pypi release (#2473) by @chaokunyang in <a href="https://github.com/apache/fory/pull/2474" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2474</a></li> |
| <li class="">fix(python): fix py releases macos13 by @chaokunyang in <a href="https://github.com/apache/fory/pull/2479" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2479</a></li> |
| </ul> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <ul> |
| <li class="">chore(Scala): upgrade sbt and plugins by @pjfanning in <a href="https://github.com/apache/fory/pull/2379" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2379</a></li> |
| <li class="">chore(python): add more comprehensive test parameters by @pandalee99 in <a href="https://github.com/apache/fory/pull/2377" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2377</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2385</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2386</a></li> |
| <li class="">chore(Scala): use setup-sbt CI action by @pjfanning in <a href="https://github.com/apache/fory/pull/2387" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2387</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2390</a></li> |
| <li class="">chore(Scala): Create DurationTest.scala by @pjfanning in <a href="https://github.com/apache/fory/pull/2394" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2394</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2399</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2403</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2408</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2411</a></li> |
| <li class="">chore(cpp): fix duplicate copyright by @co63oc in <a href="https://github.com/apache/fory/pull/2426" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2426</a></li> |
| <li class="">docs: fix ruff command by @co63oc in <a href="https://github.com/apache/fory/pull/2425" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2425</a></li> |
| <li class="">chore: fix typos by @co63oc in <a href="https://github.com/apache/fory/pull/2424" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2424</a></li> |
| <li class="">chore(dart): fix typos by @co63oc in <a href="https://github.com/apache/fory/pull/2428" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2428</a></li> |
| <li class="">chore: fix typos by @co63oc in <a href="https://github.com/apache/fory/pull/2429" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2429</a></li> |
| <li class="">chore: remove incubating by @chaokunyang in <a href="https://github.com/apache/fory/pull/2431" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2431</a></li> |
| <li class="">chore: fix typos by @co63oc in <a href="https://github.com/apache/fory/pull/2433" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2433</a></li> |
| <li class="">chore: fix typos by @co63oc in <a href="https://github.com/apache/fory/pull/2436" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2436</a></li> |
| <li class="">chore: translate comments by @co63oc in <a href="https://github.com/apache/fory/pull/2442" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2442</a></li> |
| <li class="">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" class="">https://github.com/apache/fory/pull/2420</a></li> |
| <li class="">chore(java): arrow 18.3.0 by @stevenschlansker in <a href="https://github.com/apache/fory/pull/2458" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2458</a></li> |
| <li class="">chore: prepare commits for releases-0.12 by @chaokunyang in <a href="https://github.com/apache/fory/pull/2470" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2470</a></li> |
| <li class="">chore(python): disable import format warning by @chaokunyang in <a href="https://github.com/apache/fory/pull/2477" target="_blank" rel="noopener noreferrer" class="">https://github.com/apache/fory/pull/2477</a></li> |
| </ul> |
| <h2 class="anchor anchorTargetStickyNavbar_Vzrq" 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" translate="no"></a></h2> |
| <ul> |
| <li class="">@co63oc made their first contribution in <a href="https://github.com/apache/fory/pull/2426" target="_blank" rel="noopener noreferrer" class="">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" class="">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> |
| </feed> |