blob: 658c72b47237a1cd85d23bfee764bc591c31b68f [file]
<!doctype html><html lang=en-US dir=ltr class="docs-wrapper plugin-docs plugin-id-default docs-version-0.13 docs-doc-page docs-doc-id-guide/rust_serialization" data-has-hydrated=false><head><meta charset=UTF-8><meta name=generator content="Docusaurus v3.10.1"><title data-rh=true>Rust Serialization | Apache Fory™</title><meta data-rh=true name=viewport content="width=device-width, initial-scale=1.0"/><meta data-rh=true property=og:url content=https://fory.apache.org/docs/0.13/guide/rust_serialization /><meta data-rh=true property=og:locale content=en_US /><meta data-rh=true property=og:locale:alternate content=zh_CN /><meta data-rh=true name=docusaurus_locale content=en-US /><meta data-rh=true name=docsearch:language content=en-US /><meta data-rh=true http-equiv=Content-Security-Policy content="frame-src 'self' https://ghbtns.com/;"/><meta data-rh=true property=og:image content=https://fory.apache.org/img/logo.png /><meta data-rh=true property=og:image:width content=1500 /><meta data-rh=true property=og:image:height content=1500 /><meta data-rh=true name=twitter:card content=summary_large_image /><meta data-rh=true name=twitter:image content=https://fory.apache.org/img/logo.png /><meta data-rh=true name=docusaurus_version content=0.13 /><meta data-rh=true name=docusaurus_tag content=docs-default-0.13 /><meta data-rh=true name=docsearch:version content=0.13 /><meta data-rh=true name=docsearch:docusaurus_tag content=docs-default-0.13 /><meta data-rh=true property=og:title content="Rust Serialization | Apache Fory™"/><meta data-rh=true name=description content="Apache Fory™ Rust"/><meta data-rh=true property=og:description content="Apache Fory™ Rust"/><link data-rh=true rel=icon href=/img/favicon.ico /><link data-rh=true rel=canonical href=https://fory.apache.org/docs/0.13/guide/rust_serialization /><link data-rh=true rel=alternate href=https://fory.apache.org/docs/0.13/guide/rust_serialization hreflang=en-US /><link data-rh=true rel=alternate href=https://fory.apache.org/zh-CN/docs/0.13/guide/rust_serialization hreflang=zh-CN /><link data-rh=true rel=alternate href=https://fory.apache.org/docs/0.13/guide/rust_serialization hreflang=x-default /><script data-rh=true type=application/ld+json>{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","item":"https://fory.apache.org/docs/0.13/guide/rust_serialization","name":"Rust Serialization","position":1}]}</script><link rel=alternate type=application/rss+xml href=/blog/rss.xml title="Apache Fory™ RSS Feed"><link rel=alternate type=application/atom+xml href=/blog/atom.xml title="Apache Fory™ Atom Feed"><script type=text/javascript>"fury.apache.org"===window.location.host&&(window.location.href="https://fory.apache.org"),function(){for(var o=window.location.pathname,a=["guide","introduction","start"],n=0;n<a.length;n++){var t=a[n],i=RegExp("^((?:/[a-z]{2}-[A-Z]{2})?/docs(?:/(?:next|[0-9]+.[0-9]+))?)/docs/"+t+"(/.*)?$"),c=o.match(i);if(c){var r=c[1]+"/"+t+(c[2]||"");window.location.replace(r+window.location.search+window.location.hash);return}}}()</script><link rel=stylesheet href=/assets/css/styles.3a1edaa1.css /><script src=/assets/js/runtime~main.605b11b1.js defer></script><script src=/assets/js/main.283fea4b.js defer></script></head><body><svg style="display: none;"><defs>
<symbol id=theme-svg-external-link viewBox="0 0 24 24"><path fill=currentColor d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
</defs></svg>
<script>!function(){var t=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",t||"light"),document.documentElement.setAttribute("data-theme-choice",t||"light")}(),function(){try{for(var[t,e]of new URLSearchParams(window.location.search).entries())if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id=__docusaurus><div role=region aria-label="Skip to main content"><a class=skipToContent_fXgn href=#__docusaurus_skipToContent_fallback>Skip to main content</a></div><nav aria-label=Main class="theme-layout-navbar navbar navbar--fixed-top"><div class=navbar__inner><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded=false class="navbar__toggle clean-btn" type=button><svg width=30 height=30 viewBox="0 0 30 30" aria-hidden=true><path stroke=currentColor stroke-linecap=round stroke-miterlimit=10 stroke-width=2 d="M4 7h22M4 15h22M4 23h22"/></svg></button><a class=navbar__brand href=/><div class=navbar__logo><img src=/img/fory-logo-light.png alt="Apache Fory™ Logo" class="themedComponent_mlkZ themedComponent--light_NVdE"/><img src=/img/fory-logo-dark.png alt="Apache Fory™ Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU"/></div><b class="navbar__title text--truncate"></b></a><a aria-current=page class="navbar__item navbar__link navbar__link--active" href=/docs/0.13/introduction/overview>Docs</a><a class="navbar__item navbar__link" href=/docs/0.13/specification/xlang_serialization_spec>Specification</a><a class="navbar__item navbar__link" href=/docs/0.13/community/>Community</a><a class="navbar__item navbar__link" href=/user>Users</a><a class="navbar__item navbar__link" href=/download>Download</a><a class="navbar__item navbar__link" href=/blog>Blog</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><div class="navbar__item dropdown dropdown--hoverable dropdown--right"><a href=# aria-haspopup=true aria-expanded=false role=button class=navbar__link>ASF</a><ul class=dropdown__menu><li><a href=https://www.apache.org/ target=_blank rel="noopener noreferrer" class=dropdown__link>Foundation</a><li><a href=https://www.apache.org/licenses/ target=_blank rel="noopener noreferrer" class=dropdown__link>License</a><li><a href=https://www.apache.org/events/current-event.html target=_blank rel="noopener noreferrer" class=dropdown__link>Events</a><li><a href=https://privacy.apache.org/policies/privacy-policy-public.html target=_blank rel="noopener noreferrer" class=dropdown__link>Privacy</a><li><a href=https://www.apache.org/security/ target=_blank rel="noopener noreferrer" class=dropdown__link>Security</a><li><a href=https://www.apache.org/foundation/sponsorship.html target=_blank rel="noopener noreferrer" class=dropdown__link>Sponsorship</a><li><a href=https://www.apache.org/foundation/thanks.html target=_blank rel="noopener noreferrer" class=dropdown__link>Thanks</a><li><a href=https://www.apache.org/foundation/policies/conduct.html target=_blank rel="noopener noreferrer" class=dropdown__link>Code of Conduct</a></ul></div><div class="navbar__item dropdown dropdown--hoverable dropdown--right"><a class=navbar__link aria-haspopup=true aria-expanded=false role=button href=/docs/0.13/guide/rust_serialization>0.13</a><ul class=dropdown__menu><li><a class=dropdown__link href=/docs/next/introduction/overview>dev</a><li><a class=dropdown__link href=/docs/introduction/overview>1.3.0</a><li><a class=dropdown__link href=/docs/1.2.0/introduction/overview>1.2.0</a><li><a class=dropdown__link href=/docs/1.1.0/introduction/overview>1.1.0</a><li><a class=dropdown__link href=/docs/1.0.0/introduction/overview>1.0.0</a><li><a class=dropdown__link href=/docs/0.17/introduction/overview>0.17</a><li><a class=dropdown__link href=/docs/0.16/introduction/overview>0.16</a><li><a class=dropdown__link href=/docs/0.15/introduction/overview>0.15</a><li><a class=dropdown__link href=/docs/0.14/introduction/overview>0.14</a><li><a aria-current=page class="dropdown__link dropdown__link--active" href=/docs/0.13/guide/rust_serialization>0.13</a><li><a class=dropdown__link href=/docs/0.12/introduction/overview>0.12</a><li><a class=dropdown__link href=/docs/0.11/introduction/overview>0.11</a><li><a class=dropdown__link href=/docs/0.10/introduction/overview>0.10</a></ul></div><a href=https://github.com/apache/fory target=_blank rel="noopener noreferrer" class="navbar__item navbar__link header-github-link" aria-label="GitHub repository"></a><div class="navbar__item dropdown dropdown--hoverable dropdown--right"><a href=# aria-haspopup=true aria-expanded=false role=button class=navbar__link><svg viewBox="0 0 24 24" width=20 height=20 aria-hidden=true class=iconLanguage_nlXk><path fill=currentColor d="M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"/></svg>English</a><ul class=dropdown__menu><li><a href=/docs/0.13/guide/rust_serialization target=_self rel="noopener noreferrer" class="dropdown__link dropdown__link--active" lang=en-US>English</a><li><a href=/zh-CN/docs/0.13/guide/rust_serialization target=_self rel="noopener noreferrer" class=dropdown__link lang=zh-CN>简体中文</a></ul></div><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type=button disabled title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width=24 height=24 aria-hidden=true class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill=currentColor d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"/></svg><svg viewBox="0 0 24 24" width=24 height=24 aria-hidden=true class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill=currentColor d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"/></svg><svg viewBox="0 0 24 24" width=24 height=24 aria-hidden=true class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill=currentColor d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"/></svg></button></div><div class=navbarSearchContainer_Bca1><div class=navbar__search><span aria-label="expand searchbar" role=button class=search-icon tabindex=0></span><input id=search_input_react type=search placeholder=Loading... aria-label=Search class="navbar__search-input search-bar" disabled/></div></div></div></div><div role=presentation class=navbar-sidebar__backdrop></div></nav><div id=__docusaurus_skipToContent_fallback class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class=docsWrapper_hBAB><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type=button></button><div class=docRoot_UBD9><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class=sidebarViewport_aRkj><div class=sidebar_njMd><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist" href=/docs/0.13/introduction/overview><span title=Introduction class=categoryLinkLabel_W154>Introduction</span></a><button aria-label="Expand sidebar category 'Introduction'" aria-expanded=false type=button class="clean-btn menu__caret"></button></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false href=/docs/0.13/start/install><span title=Start class=categoryLinkLabel_W154>Start</span></a></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret menu__link--active" role=button aria-expanded=true href=/docs/0.13/guide/serialization><span title=Guide class=categoryLinkLabel_W154>Guide</span></a></div><ul class=menu__list><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class=menu__link tabindex=0 href=/docs/0.13/guide/serialization><span title="Java Serialization Guide" class=linkLabel_WmDU>Java Serialization Guide</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class=menu__link tabindex=0 href=/docs/0.13/guide/python_serialization><span title="Python Serialization" class=linkLabel_WmDU>Python Serialization</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link menu__link--active" aria-current=page tabindex=0 href=/docs/0.13/guide/rust_serialization><span title="Rust Serialization" class=linkLabel_WmDU>Rust Serialization</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class=menu__link tabindex=0 href=/docs/0.13/guide/scala_serialization><span title="Scala Serialization" class=linkLabel_WmDU>Scala Serialization</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class=menu__link tabindex=0 href=/docs/0.13/guide/xlang_serialization><span title="Xlang Serialization" class=linkLabel_WmDU>Xlang Serialization</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class=menu__link tabindex=0 href=/docs/0.13/guide/row_format><span title="Row Format" class=linkLabel_WmDU>Row Format</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class=menu__link tabindex=0 href=/docs/0.13/guide/graalvm_serialization><span title="GraalVM Serialization" class=linkLabel_WmDU>GraalVM Serialization</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class=menu__link tabindex=0 href=/docs/0.13/guide/development><span title=Development class=linkLabel_WmDU>Development</span></a></ul></ul></nav></div></div></aside><main class=docMainContainer_TBSr><div class="container padding-top--md padding-bottom--lg"><div class=row><div class="col docItemCol_VOVn"><div class="theme-doc-version-banner alert alert--warning margin-bottom--md" role=alert><div>This is documentation for <!-- -->Apache Fory™<!-- --> <b>0.13</b>, which is no longer actively maintained.</div><div class=margin-top--md>For up-to-date documentation, see the <b><a href=/docs/introduction/overview>latest version</a></b> (<!-- -->1.3.0<!-- -->).</div></div><div class=docItemContainer_Djhp><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label=Breadcrumbs><ul class=breadcrumbs><li class=breadcrumbs__item><a aria-label="Home page" class=breadcrumbs__link href=/><svg viewBox="0 0 24 24" class=breadcrumbHomeIcon_YNFT><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill=currentColor /></svg></a><li class=breadcrumbs__item><span class=breadcrumbs__link>Guide</span><li class="breadcrumbs__item breadcrumbs__item--active"><span class=breadcrumbs__link>Rust Serialization</span></ul></nav><span class="theme-doc-version-badge badge badge--secondary">Version: 0.13</span><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type=button class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Rust Serialization</h1></header><h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=apache-fory-rust>Apache Fory™ Rust<a href=#apache-fory-rust class=hash-link aria-label="Direct link to Apache Fory™ Rust" title="Direct link to Apache Fory™ Rust" translate=no></a></h2>
<p><strong>Apache Fory™</strong> is a blazing fast multi-language serialization framework powered by <strong>JIT compilation</strong> and <strong>zero-copy</strong> techniques, providing up to <strong>ultra-fast performance</strong> while maintaining ease of use and safety.</p>
<p>The Rust implementation provides versatile and high-performance serialization with automatic memory management and compile-time type safety.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=-why-apache-fory-rust>🚀 Why Apache Fory™ Rust?<a href=#-why-apache-fory-rust class=hash-link aria-label="Direct link to 🚀 Why Apache Fory™ Rust?" title="Direct link to 🚀 Why Apache Fory™ Rust?" translate=no></a></h2>
<ul>
<li class=""><strong>🔥 Blazingly Fast</strong>: Zero-copy deserialization and optimized binary protocols</li>
<li class=""><strong>🌍 Cross-Language</strong>: Seamlessly serialize/deserialize data across Java, Python, C++, Go, JavaScript, and Rust</li>
<li class=""><strong>🎯 Type-Safe</strong>: Compile-time type checking with derive macros</li>
<li class=""><strong>🔄 Circular References</strong>: Automatic tracking of shared and circular references with <code>Rc</code>/<code>Arc</code> and weak pointers</li>
<li class=""><strong>🧬 Polymorphic</strong>: Serialize trait objects with <code>Box&lt;dyn Trait></code>, <code>Rc&lt;dyn Trait></code>, and <code>Arc&lt;dyn Trait></code></li>
<li class=""><strong>📦 Schema Evolution</strong>: Compatible mode for independent schema changes</li>
<li class=""><strong>⚡ Two Modes</strong>: Object graph serialization and zero-copy row-based format</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=-crates>📦 Crates<a href=#-crates class=hash-link aria-label="Direct link to 📦 Crates" title="Direct link to 📦 Crates" translate=no></a></h2>
<table><thead><tr><th>Crate<th>Description<th>Version<tbody><tr><td><a href=https://github.com/apache/fory/blob/main/rust/fory target=_blank rel="noopener noreferrer" class=""><code>fory</code></a><td>High-level API with derive macros<td><a href=https://crates.io/crates/fory target=_blank rel="noopener noreferrer" class="">https://crates.io/crates/fory</a><tr><td><a href=https://github.com/apache/fory/blob/main/rust/fory-core/ target=_blank rel="noopener noreferrer" class=""><code>fory-core</code></a><td>Core serialization engine<td><a href=https://crates.io/crates/fory-core target=_blank rel="noopener noreferrer" class="">https://crates.io/crates/fory-core</a><tr><td><a href=https://github.com/apache/fory/blob/main/rust/fory-derive/ target=_blank rel="noopener noreferrer" class=""><code>fory-derive</code></a><td>Procedural macros<td><a href=https://crates.io/crates/fory-derive target=_blank rel="noopener noreferrer" class="">https://crates.io/crates/fory-derive</a></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=-quick-start>🏃 Quick Start<a href=#-quick-start class=hash-link aria-label="Direct link to 🏃 Quick Start" title="Direct link to 🏃 Quick Start" translate=no></a></h2>
<p>Add Apache Fory™ to your <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.14"</span><br/></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=basic-example>Basic Example<a href=#basic-example class=hash-link aria-label="Direct link to Basic Example" title="Direct link to Basic 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 plain"> </span><span class="token class-name">Reader</span><span class="token punctuation" style=color:#393A34>}</span><span class="token punctuation" style=color:#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>&lt;</span><span class="token punctuation" style=color:#393A34>(</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"> </span><span class="token class-name">Error</span><span class="token operator" style=color:#393A34>></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>&lt;</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"></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" 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>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 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" 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 to specified buffer</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"> buf</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> </span><span class="token class-name">Vec</span><span class="token operator" style=color:#393A34>&lt;</span><span class="token keyword" style=color:#00009f>u8</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 punctuation" style=color:#393A34>]</span><span class="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>serialize_to</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"> </span><span class="token operator" style=color:#393A34>&</span><span class="token keyword" style=color:#00009f>mut</span><span class="token plain"> buf</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>// Deserialize from specified buffer</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"> reader </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> </span><span class="token class-name">Reader</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 operator" style=color:#393A34>&</span><span class="token plain">buf</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#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_from</span><span class="token punctuation" style=color:#393A34>(</span><span class="token operator" style=color:#393A34>&</span><span class="token keyword" style=color:#00009f>mut</span><span class="token plain"> reader</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>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=-core-features>📚 Core Features<a href=#-core-features class=hash-link aria-label="Direct link to 📚 Core Features" title="Direct link to 📚 Core Features" translate=no></a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=1-object-graph-serialization>1. Object Graph Serialization<a href=#1-object-graph-serialization class=hash-link aria-label="Direct link to 1. Object Graph Serialization" title="Direct link to 1. Object Graph Serialization" translate=no></a></h3>
<p>Apache Fory™ provides automatic serialization of complex object graphs, preserving the structure and relationships between objects. The <code>#[derive(ForyObject)]</code> macro generates efficient serialization code at compile time, eliminating runtime overhead.</p>
<p><strong>Key capabilities:</strong></p>
<ul>
<li class="">Nested struct serialization with arbitrary depth</li>
<li class="">Collection types (Vec, HashMap, HashSet, BTreeMap)</li>
<li class="">Optional fields with <code>Option&lt;T></code></li>
<li class="">Automatic handling of primitive types and strings</li>
<li class="">Efficient binary encoding with variable-length integers</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>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"></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>collections</span><span class="token namespace punctuation" style=opacity:0.7;color:#393A34>::</span><span class="token class-name">HashMap</span><span class="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">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"> hobbies</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> </span><span class="token class-name">Vec</span><span class="token operator" style=color:#393A34>&lt;</span><span class="token class-name">String</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"> metadata</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> </span><span class="token class-name">HashMap</span><span class="token operator" style=color:#393A34>&lt;</span><span class="token class-name">String</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token operator" style=color:#393A34>></span><span class="token punctuation" style=color:#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, 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">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"> street</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"> city</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"> country</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 </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>&lt;</span><span class="token class-name">Address</span><span class="token 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</span><span class="token punctuation" style=color:#393A34>.</span><span class="token function" style=color:#d73a49>register</span><span class="token punctuation" style=color:#393A34>::</span><span class="token operator" style=color:#393A34>&lt;</span><span class="token class-name">Person</span><span class="token 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>let</span><span class="token plain"> person </span><span class="token operator" style=color:#393A34>=</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"> name</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>"John Doe"</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"> 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 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"> street</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>"123 Main St"</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"> city</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>"New York"</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"> country</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>"USA"</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"> hobbies</span><span class="token punctuation" 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 string" style=color:#e3116c>"reading"</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 string" style=color:#e3116c>"coding"</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"> 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 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 string" style=color:#e3116c>"role"</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 string" style=color:#e3116c>"developer"</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 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">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>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">Person</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">person</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><br/></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=2-shared-and-circular-references>2. Shared and Circular References<a href=#2-shared-and-circular-references class=hash-link aria-label="Direct link to 2. Shared and Circular References" title="Direct link to 2. Shared and Circular References" translate=no></a></h3>
<p>Apache Fory™ automatically tracks and preserves reference identity for shared objects using <code>Rc&lt;T></code> and <code>Arc&lt;T></code>. When the same object is referenced multiple times, Fory serializes it only once and uses reference IDs for subsequent occurrences. This ensures:</p>
<ul>
<li class=""><strong>Space efficiency</strong>: No data duplication in serialized output</li>
<li class=""><strong>Reference identity preservation</strong>: Deserialized objects maintain the same sharing relationships</li>
<li class=""><strong>Circular reference support</strong>: Use <code>RcWeak&lt;T></code> and <code>ArcWeak&lt;T></code> to break cycles</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id=shared-references-with-rcarc>Shared References with Rc/Arc<a href=#shared-references-with-rcarc class=hash-link aria-label="Direct link to Shared References with Rc/Arc" title="Direct link to Shared References with Rc/Arc" translate=no></a></h4>
<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>&lt;</span><span class="token class-name">Rc</span><span class="token operator" style=color:#393A34>&lt;</span><span class="token class-name">String</span><span class="token operator" style=color:#393A34>>></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>For thread-safe shared references, use <code>Arc&lt;T></code>.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id=circular-references-with-weak-pointers>Circular References with Weak Pointers<a href=#circular-references-with-weak-pointers class=hash-link aria-label="Direct link to Circular References with Weak Pointers" title="Direct link to Circular References with Weak Pointers" translate=no></a></h4>
<p>To serialize circular references like parent-child relationships or doubly-linked structures, use <code>RcWeak&lt;T></code> or <code>ArcWeak&lt;T></code> to break the cycle. These weak pointers are serialized as references to their strong counterparts, preserving the graph structure without causing memory leaks or infinite recursion.</p>
<p><strong>How it works:</strong></p>
<ul>
<li class="">Weak pointers serialize as references to their target objects</li>
<li class="">If the strong pointer has been dropped, weak serializes as <code>Null</code></li>
<li class="">Forward references (weak appearing before target) are resolved via callbacks</li>
<li class="">All clones of a weak pointer share the same internal cell for automatic updates</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>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"></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">RcWeak</span><span class="token punctuation" style=color:#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"></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>cell</span><span class="token namespace punctuation" style=opacity:0.7;color:#393A34>::</span><span class="token class-name">RefCell</span><span class="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)]</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>&lt;</span><span class="token class-name">RefCell</span><span class="token operator" style=color:#393A34>&lt;</span><span class="token class-name">Node</span><span class="token operator" style=color:#393A34>>></span><span class="token punctuation" style=color:#393A34>,</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>&lt;</span><span class="token class-name">Rc</span><span class="token operator" style=color:#393A34>&lt;</span><span class="token class-name">RefCell</span><span class="token operator" style=color:#393A34>&lt;</span><span class="token class-name">Node</span><span class="token operator" style=color:#393A34>>></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 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>&lt;</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 number" style=color:#36acaa>2000</span><span class="token punctuation" style=color:#393A34>)</span><span class="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</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><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 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"> 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>new</span><span class="token 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"> children</span><span class="token punctuation" 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 punctuation" style=color:#393A34>]</span><span class="token punctuation" style=color:#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" 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"> child1 </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"> value</span><span class="token punctuation" 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"> 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><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 macro property" style=color:#36acaa>vec!</span><span class="token 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 punctuation" style=color:#393A34>)</span><span class="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"> child2 </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"> value</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 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><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 macro property" style=color:#36acaa>vec!</span><span class="token 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 punctuation" style=color:#393A34>)</span><span class="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">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">child1</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">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">child2</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>// Serialize and deserialize the circular 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"> 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>&lt;</span><span class="token class-name">RefCell</span><span class="token operator" style=color:#393A34>&lt;</span><span class="token class-name">Node</span><span class="token operator" style=color:#393A34>>></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 the circular relationship</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>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 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>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"></span><span class="token keyword" style=color:#00009f>for</span><span class="token plain"> child </span><span class="token keyword" style=color:#00009f>in</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 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"> upgraded_parent </span><span class="token operator" 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>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 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">upgraded_parent</span><span class="token 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>
<p><strong>Thread-Safe Circular Graphs with Arc:</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">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"></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">ArcWeak</span><span class="token punctuation" style=color:#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>sync</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">Arc</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"> </span><span class="token class-name">Mutex</span><span class="token punctuation" style=color:#393A34>}</span><span class="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"> val</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">ArcWeak</span><span class="token operator" style=color:#393A34>&lt;</span><span class="token class-name">Mutex</span><span class="token operator" style=color:#393A34>&lt;</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><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>&lt;</span><span class="token class-name">Arc</span><span class="token operator" style=color:#393A34>&lt;</span><span class="token class-name">Mutex</span><span class="token operator" style=color:#393A34>&lt;</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><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 </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>&lt;</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 number" style=color:#36acaa>6000</span><span class="token punctuation" style=color:#393A34>)</span><span class="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"> parent </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 class-name">Mutex</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"> val</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> </span><span class="token number" style=color:#36acaa>10</span><span class="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">ArcWeak</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 punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#393A34>,</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 macro property" style=color:#36acaa>vec!</span><span class="token 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 punctuation" style=color:#393A34>)</span><span class="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"> child1 </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 class-name">Mutex</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"> val</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> </span><span class="token number" style=color:#36acaa>20</span><span class="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">ArcWeak</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><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 macro property" style=color:#36acaa>vec!</span><span class="token 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 punctuation" style=color:#393A34>)</span><span class="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"> child2 </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 class-name">Mutex</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"> val</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"> parent</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> </span><span class="token class-name">ArcWeak</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><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 macro property" style=color:#36acaa>vec!</span><span class="token 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 punctuation" style=color:#393A34>)</span><span class="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">parent</span><span class="token punctuation" style=color:#393A34>.</span><span class="token function" style=color:#d73a49>lock</span><span class="token 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">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">child1</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">parent</span><span class="token punctuation" style=color:#393A34>.</span><span class="token function" style=color:#d73a49>lock</span><span class="token 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">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">child2</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 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">Arc</span><span class="token operator" style=color:#393A34>&lt;</span><span class="token class-name">Mutex</span><span class="token operator" style=color:#393A34>&lt;</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 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>lock</span><span class="token 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">children</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>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"></span><span class="token keyword" style=color:#00009f>for</span><span class="token plain"> child </span><span class="token keyword" style=color:#00009f>in</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>lock</span><span class="token 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">children </span><span class="token punctuation" style=color:#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"> upgraded_parent </span><span class="token operator" 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>lock</span><span class="token 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">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 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">Arc</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">upgraded_parent</span><span class="token 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=3-trait-object-serialization>3. Trait Object Serialization<a href=#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>Apache Fory™ supports polymorphic serialization through trait objects, enabling dynamic dispatch and type flexibility. This is essential for plugin systems, heterogeneous collections, and extensible architectures.</p>
<p><strong>Supported trait object types:</strong></p>
<ul>
<li class=""><code>Box&lt;dyn Trait></code> - Owned trait objects</li>
<li class=""><code>Rc&lt;dyn Trait></code> - Reference-counted trait objects</li>
<li class=""><code>Arc&lt;dyn Trait></code> - Thread-safe reference-counted trait objects</li>
<li class=""><code>Vec&lt;Box&lt;dyn Trait>></code>, <code>HashMap&lt;K, Box&lt;dyn Trait>></code> - Collections of trait objects</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id=basic-trait-object-serialization>Basic Trait Object Serialization<a href=#basic-trait-object-serialization class=hash-link aria-label="Direct link to Basic Trait Object Serialization" title="Direct link to Basic Trait Object Serialization" translate=no></a></h4>
<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"> 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"></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">Serializer</span><span class="token punctuation" style=color:#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 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 keyword" style=color:#00009f>fn</span><span class="token plain"> </span><span class="token function-definition function" style=color:#d73a49>name</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 operator" style=color:#393A34>&</span><span class="token keyword" style=color:#00009f>str</span><span class="token punctuation" style=color:#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 keyword" style=color:#00009f>impl</span><span class="token plain"> </span><span class="token class-name">Animal</span><span class="token plain"> </span><span class="token keyword" style=color:#00009f>for</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 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 plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>"Woof!"</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 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>name</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 operator" style=color:#393A34>&</span><span class="token keyword" style=color:#00009f>str</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 keyword" style=color:#00009f>self</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><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">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 keyword" style=color:#00009f>impl</span><span class="token plain"> </span><span class="token class-name">Animal</span><span class="token plain"> </span><span class="token keyword" style=color:#00009f>for</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 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 plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>"Meow!"</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 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>name</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 operator" style=color:#393A34>&</span><span class="token keyword" style=color:#00009f>str</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 keyword" style=color:#00009f>self</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><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>// Register trait 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 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">Zoo</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"> star_animal</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> </span><span class="token class-name">Box</span><span class="token operator" style=color:#393A34>&lt;</span><span class="token keyword" style=color:#00009f>dyn</span><span class="token plain"> </span><span class="token class-name">Animal</span><span class="token operator" style=color:#393A34>></span><span class="token punctuation" style=color:#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 </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</span><span class="token punctuation" style=color:#393A34>.</span><span class="token function" style=color:#d73a49>register</span><span class="token punctuation" style=color:#393A34>::</span><span class="token operator" style=color:#393A34>&lt;</span><span class="token class-name">Dog</span><span class="token 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</span><span class="token punctuation" style=color:#393A34>.</span><span class="token function" style=color:#d73a49>register</span><span class="token punctuation" style=color:#393A34>::</span><span class="token operator" style=color:#393A34>&lt;</span><span class="token class-name">Cat</span><span class="token operator" style=color:#393A34>></span><span class="token punctuation" style=color:#393A34>(</span><span class="token number" style=color:#36acaa>101</span><span class="token punctuation" style=color:#393A34>)</span><span class="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>&lt;</span><span class="token class-name">Zoo</span><span class="token operator" style=color:#393A34>></span><span class="token punctuation" style=color:#393A34>(</span><span class="token number" style=color:#36acaa>102</span><span class="token punctuation" style=color:#393A34>)</span><span class="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"> zoo </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> </span><span class="token class-name">Zoo</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"> star_animal</span><span class="token punctuation" style=color:#393A34>:</span><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><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>"Buddy"</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"> 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 punctuation" style=color:#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 punctuation" style=color:#393A34>}</span><span class="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">zoo</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#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">Zoo</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 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 plain">star_animal</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 punctuation" style=color:#393A34>,</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>"Buddy"</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#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">decoded</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">star_animal</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 string" style=color:#e3116c>"Woof!"</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#393A34>;</span><br/></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id=serializing-dyn-any-trait-objects>Serializing <code>dyn Any</code> Trait Objects<a href=#serializing-dyn-any-trait-objects class=hash-link aria-label="Direct link to serializing-dyn-any-trait-objects" title="Direct link to serializing-dyn-any-trait-objects" translate=no></a></h4>
<p>Apache Fory™ supports serializing <code>Rc&lt;dyn Any></code> and <code>Arc&lt;dyn Any></code> for runtime type dispatch. This is useful when you need maximum flexibility and don't want to define a custom trait.</p>
<p><strong>Key points:</strong></p>
<ul>
<li class="">Works with any type that implements <code>Serializer</code></li>
<li class="">Requires downcasting after deserialization to access the concrete type</li>
<li class="">Type information is preserved during serialization</li>
<li class="">Useful for plugin systems and dynamic type handling</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>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 keyword" style=color:#00009f>let</span><span class="token plain"> dog_rc</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> </span><span class="token class-name">Rc</span><span class="token operator" style=color:#393A34>&lt;</span><span class="token keyword" style=color:#00009f>dyn</span><span class="token plain"> </span><span class="token class-name">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 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"></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>"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"></span><br/></div><div class=token-line style=color:#393A34><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>"Golden"</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><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 comment" style=color:#999988;font-style:italic>// Convert to Rc&lt;dyn Any> 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 keyword" style=color:#00009f>let</span><span class="token plain"> dog_any</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> </span><span class="token class-name">Rc</span><span class="token operator" style=color:#393A34>&lt;</span><span class="token keyword" style=color:#00009f>dyn</span><span class="token plain"> </span><span class="token class-name">Any</span><span class="token operator" style=color:#393A34>></span><span class="token plain"> </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> dog_rc</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" 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 the Any wrapper</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">dog_any</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#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>&lt;</span><span class="token keyword" style=color:#00009f>dyn</span><span class="token plain"> </span><span class="token class-name">Any</span><span class="token operator" style=color:#393A34>></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 back to the 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>&lt;</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>For thread-safe scenarios, use <code>Arc&lt;dyn Any></code>:</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>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"></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 keyword" style=color:#00009f>let</span><span class="token plain"> dog_arc</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> </span><span class="token class-name">Arc</span><span class="token operator" style=color:#393A34>&lt;</span><span class="token keyword" style=color:#00009f>dyn</span><span class="token plain"> </span><span class="token class-name">Animal</span><span class="token operator" style=color:#393A34>></span><span class="token plain"> </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 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"> name</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>"Buddy"</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"> 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><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 comment" style=color:#999988;font-style:italic>// Convert to Arc&lt;dyn Any></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_any</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> </span><span class="token class-name">Arc</span><span class="token operator" style=color:#393A34>&lt;</span><span class="token keyword" style=color:#00009f>dyn</span><span class="token plain"> </span><span class="token class-name">Any</span><span class="token operator" style=color:#393A34>></span><span class="token plain"> </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> dog_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 punctuation" style=color:#393A34>)</span><span class="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_any</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#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">Arc</span><span class="token operator" style=color:#393A34>&lt;</span><span class="token keyword" style=color:#00009f>dyn</span><span class="token plain"> </span><span class="token class-name">Any</span><span class="token operator" style=color:#393A34>></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>&lt;</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>"Buddy"</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#393A34>;</span><br/></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id=rcarc-based-trait-objects-in-structs>Rc/Arc-Based Trait Objects in Structs<a href=#rcarc-based-trait-objects-in-structs class=hash-link aria-label="Direct link to Rc/Arc-Based Trait Objects in Structs" title="Direct link to Rc/Arc-Based Trait Objects in Structs" translate=no></a></h4>
<p>For fields with <code>Rc&lt;dyn Trait></code> or <code>Arc&lt;dyn Trait></code>, Fory automatically handles the conversion:</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>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"></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"></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>collections</span><span class="token namespace punctuation" style=opacity:0.7;color:#393A34>::</span><span class="token class-name">HashMap</span><span class="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">AnimalShelter</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"> animals_rc</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> </span><span class="token class-name">Vec</span><span class="token operator" style=color:#393A34>&lt;</span><span class="token class-name">Rc</span><span class="token operator" style=color:#393A34>&lt;</span><span class="token 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 punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> animals_arc</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> </span><span class="token class-name">Vec</span><span class="token operator" style=color:#393A34>&lt;</span><span class="token class-name">Arc</span><span class="token operator" style=color:#393A34>&lt;</span><span class="token keyword" style=color:#00009f>dyn</span><span class="token plain"> </span><span class="token class-name">Animal</span><span class="token operator" style=color:#393A34>>></span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> registry</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> </span><span class="token class-name">HashMap</span><span class="token operator" style=color:#393A34>&lt;</span><span class="token class-name">String</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"> </span><span class="token class-name">Arc</span><span class="token operator" style=color:#393A34>&lt;</span><span class="token keyword" style=color:#00009f>dyn</span><span class="token plain"> </span><span class="token class-name">Animal</span><span class="token operator" style=color:#393A34>>></span><span class="token punctuation" style=color:#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 </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</span><span class="token punctuation" style=color:#393A34>.</span><span class="token function" style=color:#d73a49>register</span><span class="token punctuation" style=color:#393A34>::</span><span class="token operator" style=color:#393A34>&lt;</span><span class="token class-name">Dog</span><span class="token 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</span><span class="token punctuation" style=color:#393A34>.</span><span class="token function" style=color:#d73a49>register</span><span class="token punctuation" style=color:#393A34>::</span><span class="token operator" style=color:#393A34>&lt;</span><span class="token class-name">Cat</span><span class="token operator" style=color:#393A34>></span><span class="token punctuation" style=color:#393A34>(</span><span class="token number" style=color:#36acaa>101</span><span class="token punctuation" style=color:#393A34>)</span><span class="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>&lt;</span><span class="token class-name">AnimalShelter</span><span class="token operator" style=color:#393A34>></span><span class="token punctuation" style=color:#393A34>(</span><span class="token number" style=color:#36acaa>102</span><span class="token punctuation" style=color:#393A34>)</span><span class="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"> shelter </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> </span><span class="token class-name">AnimalShelter</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"> animals_rc</span><span class="token punctuation" 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">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>"Golden"</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 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>"Mittens"</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>"Gray"</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 punctuation" style=color:#393A34>]</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> animals_arc</span><span class="token punctuation" 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">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 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>"Buddy"</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 punctuation" style=color:#393A34>]</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> registry</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 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 string" style=color:#e3116c>"pet1"</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 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 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"> name</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>"Max"</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"> breed</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>"Shepherd"</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><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><span class="token keyword" style=color:#00009f>as</span><span class="token plain"> </span><span class="token class-name">Arc</span><span class="token operator" style=color:#393A34>&lt;</span><span class="token keyword" style=color:#00009f>dyn</span><span class="token plain"> </span><span class="token class-name">Animal</span><span class="token operator" style=color:#393A34>></span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#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 punctuation" style=color:#393A34>}</span><span class="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">shelter</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#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">AnimalShelter</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 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 plain">animals_rc</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>name</span><span class="token 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 string" style=color:#e3116c>"Rex"</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#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">decoded</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">animals_arc</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 string" style=color:#e3116c>"Woof!"</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#393A34>;</span><br/></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id=standalone-trait-object-serialization>Standalone Trait Object Serialization<a href=#standalone-trait-object-serialization class=hash-link aria-label="Direct link to Standalone Trait Object Serialization" title="Direct link to Standalone Trait Object Serialization" translate=no></a></h4>
<p>Due to Rust's orphan rule, <code>Rc&lt;dyn Trait></code> and <code>Arc&lt;dyn Trait></code> cannot implement <code>Serializer</code> directly. For standalone serialization (not inside struct fields), the <code>register_trait_type!</code> macro generates wrapper types.</p>
<p><strong>Note:</strong> If you don't want to use wrapper types, you can serialize as <code>Rc&lt;dyn Any></code> or <code>Arc&lt;dyn Any></code> instead (see the <code>dyn Any</code> section above).</p>
<p>The <code>register_trait_type!</code> macro generates <code>AnimalRc</code> and <code>AnimalArc</code> wrapper types:</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>// For Rc&lt;dyn Trait></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_rc</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> </span><span class="token class-name">Rc</span><span class="token operator" style=color:#393A34>&lt;</span><span class="token keyword" style=color:#00009f>dyn</span><span class="token plain"> </span><span class="token class-name">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 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"></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>"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"></span><br/></div><div class=token-line style=color:#393A34><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>"Golden"</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><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 keyword" style=color:#00009f>let</span><span class="token plain"> wrapper </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> </span><span class="token class-name">AnimalRc</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 plain">dog_rc</span><span class="token punctuation" style=color:#393A34>)</span><span class="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">wrapper</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#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">AnimalRc</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>// Unwrap back to Rc&lt;dyn Animal></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 punctuation" style=color:#393A34>:</span><span class="token plain"> </span><span class="token class-name">Rc</span><span class="token operator" style=color:#393A34>&lt;</span><span class="token keyword" style=color:#00009f>dyn</span><span class="token plain"> </span><span class="token class-name">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"> decoded</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 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 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><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>// For Arc&lt;dyn Trait></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_arc</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> </span><span class="token class-name">Arc</span><span class="token operator" style=color:#393A34>&lt;</span><span class="token keyword" style=color:#00009f>dyn</span><span class="token plain"> </span><span class="token class-name">Animal</span><span class="token operator" style=color:#393A34>></span><span class="token plain"> </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 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"> name</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>"Buddy"</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"> 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><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 keyword" style=color:#00009f>let</span><span class="token plain"> wrapper </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> </span><span class="token class-name">AnimalArc</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 plain">dog_arc</span><span class="token punctuation" style=color:#393A34>)</span><span class="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">wrapper</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#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">AnimalArc</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 keyword" style=color:#00009f>let</span><span class="token plain"> unwrapped</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> </span><span class="token class-name">Arc</span><span class="token operator" style=color:#393A34>&lt;</span><span class="token keyword" style=color:#00009f>dyn</span><span class="token plain"> </span><span class="token class-name">Animal</span><span class="token operator" style=color:#393A34>></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>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 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 punctuation" style=color:#393A34>,</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>"Buddy"</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=4-schema-evolution>4. Schema Evolution<a href=#4-schema-evolution class=hash-link aria-label="Direct link to 4. Schema Evolution" title="Direct link to 4. Schema Evolution" translate=no></a></h3>
<p>Apache Fory™ supports schema evolution in <strong>Compatible mode</strong>, allowing serialization and deserialization peers to have different type definitions. This enables independent evolution of services in distributed systems without breaking compatibility.</p>
<p><strong>Features:</strong></p>
<ul>
<li class="">Add new fields with default values</li>
<li class="">Remove obsolete fields (skipped during deserialization)</li>
<li class="">Change field nullability (<code>T</code><code>Option&lt;T></code>)</li>
<li class="">Reorder fields (matched by name, not position)</li>
<li class="">Type-safe fallback to default values for missing fields</li>
</ul>
<p><strong>Compatibility rules:</strong></p>
<ul>
<li class="">Field names must match (case-sensitive)</li>
<li class="">Type changes are not supported (except nullable/non-nullable)</li>
<li class="">Nested struct types must be registered on both sides</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>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>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"></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>collections</span><span class="token namespace punctuation" style=opacity:0.7;color:#393A34>::</span><span class="token class-name">HashMap</span><span class="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)]</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">PersonV1</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 attribute attr-name" style=color:#00a4db>#[derive(ForyObject, Debug)]</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">PersonV2</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"> </span><span class="token comment" style=color:#999988;font-style:italic>// phone added</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>&lt;</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><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>&lt;</span><span class="token class-name">String</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token operator" style=color:#393A34>></span><span class="token punctuation" style=color:#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"> fory1 </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">fory1</span><span class="token punctuation" style=color:#393A34>.</span><span class="token function" style=color:#d73a49>register</span><span class="token punctuation" style=color:#393A34>::</span><span class="token operator" style=color:#393A34>&lt;</span><span class="token class-name">PersonV1</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 keyword" style=color:#00009f>let</span><span class="token plain"> </span><span class="token keyword" style=color:#00009f>mut</span><span class="token plain"> fory2 </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">fory2</span><span class="token punctuation" style=color:#393A34>.</span><span class="token function" style=color:#d73a49>register</span><span class="token punctuation" style=color:#393A34>::</span><span class="token operator" style=color:#393A34>&lt;</span><span class="token class-name">PersonV2</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 keyword" style=color:#00009f>let</span><span class="token plain"> person_v1 </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> </span><span class="token class-name">PersonV1</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"> address</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>"123 Main St"</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" 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 with V1</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"> fory1</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">person_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" 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 with V2 - missing fields get default values</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"> person_v2</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> </span><span class="token class-name">PersonV2</span><span class="token plain"> </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> fory2</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">person_v2</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 macro property" style=color:#36acaa>assert_eq!</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">person_v2</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 punctuation" style=color:#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">person_v2</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">phone</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"> </span><span class="token class-name">None</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=5-enum-support>5. Enum Support<a href=#5-enum-support class=hash-link aria-label="Direct link to 5. Enum Support" title="Direct link to 5. Enum Support" translate=no></a></h3>
<p>Apache Fory™ supports three types of enum variants with full schema evolution in Compatible mode:</p>
<p><strong>Variant Types:</strong></p>
<ul>
<li class=""><strong>Unit</strong>: C-style enums (<code>Status::Active</code>)</li>
<li class=""><strong>Unnamed</strong>: Tuple-like variants (<code>Message::Pair(String, i32)</code>)</li>
<li class=""><strong>Named</strong>: Struct-like variants (<code>Event::Click { x: i32, y: i32 }</code>)</li>
</ul>
<p><strong>Features:</strong></p>
<ul>
<li class="">Efficient varint encoding for variant ordinals</li>
<li class="">Schema evolution support (add/remove variants, add/remove fields)</li>
<li class="">Default variant support with <code>#[default]</code></li>
<li class="">Automatic type mismatch handling</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>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 attribute attr-name" style=color:#00a4db>#[derive(Default, 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>enum</span><span class="token plain"> </span><span class="token type-definition class-name">Value</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">Null</span><span class="token punctuation" style=color:#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">Bool</span><span class="token punctuation" style=color:#393A34>(</span><span class="token keyword" style=color:#00009f>bool</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#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">Number</span><span class="token punctuation" style=color:#393A34>(</span><span class="token keyword" style=color:#00009f>f64</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#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">Text</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 punctuation" style=color:#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">Object</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"> 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 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 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>&lt;</span><span class="token class-name">Value</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"> value </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> </span><span class="token class-name">Value</span><span class="token punctuation" style=color:#393A34>::</span><span class="token class-name">Object</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>"score"</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"> value</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> </span><span class="token number" style=color:#36acaa>100</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">value</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">Value</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">value</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><br/></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id=schema-evolution>Schema Evolution<a href=#schema-evolution class=hash-link aria-label="Direct link to Schema Evolution" title="Direct link to Schema Evolution" translate=no></a></h4>
<p>Compatible mode enables robust schema evolution with variant type encoding (2 bits):</p>
<ul>
<li class=""><code>0b0</code> = Unit, <code>0b1</code> = Unnamed, <code>0b10</code> = Named</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>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>// Old version</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">OldEvent</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">Click</span><span class="token plain"> </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 plain"> </span><span class="token keyword" style=color:#00009f>i32</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"> y</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 class-name">Scroll</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"> delta</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 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>// New version - added field and variant</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">NewEvent</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">Unknown</span><span class="token punctuation" style=color:#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">Click</span><span class="token plain"> </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 plain"> </span><span class="token keyword" style=color:#00009f>i32</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"> y</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"> timestamp</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> </span><span class="token keyword" style=color:#00009f>u64</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 field</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">Scroll</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"> delta</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 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">KeyPress</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 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 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>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 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>// Serialize with old schema</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"> old_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 class-name">OldEvent</span><span class="token punctuation" style=color:#393A34>::</span><span class="token class-name">Click</span><span class="token plain"> </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 plain"> </span><span class="token number" style=color:#36acaa>100</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"> y</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> </span><span class="token number" style=color:#36acaa>200</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" 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 with new schema - timestamp gets default value (0)</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"> new_event</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> </span><span class="token class-name">NewEvent</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">old_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!</span><span class="token punctuation" style=color:#393A34>(</span><span class="token macro property" style=color:#36acaa>matches!</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">new_event</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"> </span><span class="token class-name">NewEvent</span><span class="token punctuation" style=color:#393A34>::</span><span class="token class-name">Click</span><span class="token plain"> </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 plain"> </span><span class="token number" style=color:#36acaa>100</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"> y</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> </span><span class="token number" style=color:#36acaa>200</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"> timestamp</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> </span><span class="token number" style=color:#36acaa>0</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><br/></div></code></pre></div></div>
<p><strong>Evolution capabilities:</strong></p>
<ul>
<li class=""><strong>Unknown variants</strong> → Falls back to default variant</li>
<li class=""><strong>Named variant fields</strong> → Add/remove fields (missing fields use defaults)</li>
<li class=""><strong>Unnamed variant elements</strong> → Add/remove elements (extras skipped, missing use defaults)</li>
<li class=""><strong>Variant type mismatches</strong> → Automatically uses default value for current variant</li>
</ul>
<p><strong>Best practices:</strong></p>
<ul>
<li class="">Always mark a default variant with <code>#[default]</code></li>
<li class="">Named variants provide better evolution than unnamed</li>
<li class="">Use compatible mode for cross-version communication</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=6-tuple-support>6. Tuple Support<a href=#6-tuple-support class=hash-link aria-label="Direct link to 6. Tuple Support" title="Direct link to 6. Tuple Support" translate=no></a></h3>
<p>Apache Fory™ supports tuples up to 22 elements out of the box with efficient serialization in both compatible and non-compatible modes.</p>
<p><strong>Features:</strong></p>
<ul>
<li class="">Automatic serialization for tuples from 1 to 22 elements</li>
<li class="">Heterogeneous type support (each element can be a different type)</li>
<li class="">Schema evolution in Compatible mode (handles missing/extra elements)</li>
</ul>
<p><strong>Serialization modes:</strong></p>
<ol>
<li class=""><strong>Non-compatible mode</strong>: Serializes elements sequentially without collection headers for minimal overhead</li>
<li class=""><strong>Compatible mode</strong>: Uses collection protocol with type metadata for schema evolution</li>
</ol>
<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" 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" 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>// Tuple with heterogeneous types</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 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>bool</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"> </span><span class="token class-name">Vec</span><span class="token operator" style=color:#393A34>&lt;</span><span class="token keyword" style=color:#00009f>i32</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 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 number" style=color:#36acaa>42</span><span class="token punctuation" style=color:#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>"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><br/></div><div class=token-line style=color:#393A34><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 macro property" style=color:#36acaa>vec!</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 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 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 punctuation" style=color:#393A34>)</span><span class="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">data</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 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>bool</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"> </span><span class="token class-name">Vec</span><span class="token operator" style=color:#393A34>&lt;</span><span class="token keyword" style=color:#00009f>i32</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 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">data</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><br/></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=7-custom-serializers>7. Custom Serializers<a href=#7-custom-serializers class=hash-link aria-label="Direct link to 7. Custom Serializers" title="Direct link to 7. Custom Serializers" translate=no></a></h3>
<p>For types that don't support <code>#[derive(ForyObject)]</code>, implement the <code>Serializer</code> trait manually. This is useful for:</p>
<ul>
<li class="">External types from other crates</li>
<li class="">Types with special serialization requirements</li>
<li class="">Legacy data format compatibility</li>
<li class="">Performance-critical custom encoding</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>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">ReadContext</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"> </span><span class="token class-name">WriteContext</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"> </span><span class="token class-name">ForyDefault</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>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 attribute attr-name" style=color:#00a4db>#[derive(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">CustomType</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"> 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"></span><span class="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>impl</span><span class="token plain"> </span><span class="token class-name">Serializer</span><span class="token plain"> </span><span class="token keyword" style=color:#00009f>for</span><span class="token plain"> </span><span class="token class-name">CustomType</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>fory_write_data</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"> context</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 keyword" style=color:#00009f>mut</span><span class="token plain"> </span><span class="token class-name">WriteContext</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"> is_field</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 punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> context</span><span class="token punctuation" 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>write_i32</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">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"> context</span><span class="token punctuation" 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>write_varuint32</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">name</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 plain"> </span><span class="token keyword" style=color:#00009f>as</span><span class="token plain"> </span><span class="token keyword" style=color:#00009f>u32</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#393A34>;</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> context</span><span class="token punctuation" 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>write_utf8_string</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">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><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>fory_read_data</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 plain"> </span><span class="token operator" style=color:#393A34>&</span><span class="token keyword" style=color:#00009f>mut</span><span class="token plain"> </span><span class="token class-name">ReadContext</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"> is_field</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 punctuation" style=color:#393A34>-></span><span class="token plain"> </span><span class="token class-name">Result</span><span class="token operator" style=color:#393A34>&lt;</span><span class="token keyword" style=color:#00009f>Self</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"> value </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> context</span><span class="token punctuation" 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>read_i32</span><span class="token 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"> len </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> context</span><span class="token punctuation" 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>read_varuint32</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>as</span><span class="token plain"> </span><span class="token keyword" style=color:#00009f>usize</span><span class="token punctuation" style=color:#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"> name </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> context</span><span class="token punctuation" 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>read_utf8_string</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">len</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#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 keyword" style=color:#00009f>Self</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"> 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><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>fory_type_id_dyn</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"> type_resolver</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 class-name">TypeResolver</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>u32</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>Self</span><span class="token punctuation" style=color:#393A34>::</span><span class="token function" style=color:#d73a49>fory_get_type_id</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">type_resolver</span><span class="token punctuation" style=color:#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>as_any</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 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 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>self</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 keyword" style=color:#00009f>impl</span><span class="token plain"> </span><span class="token class-name">ForyDefault</span><span class="token plain"> </span><span class="token keyword" style=color:#00009f>for</span><span class="token plain"> </span><span class="token class-name">CustomType</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>fory_default</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>Self</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>Self</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 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 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_serializer</span><span class="token punctuation" style=color:#393A34>::</span><span class="token operator" style=color:#393A34>&lt;</span><span class="token class-name">CustomType</span><span class="token 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" 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"> custom </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> </span><span class="token class-name">CustomType</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 number" style=color:#36acaa>42</span><span class="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>"test"</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 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">custom</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#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">CustomType</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">custom</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><br/></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=7-row-based-serialization>7. Row-Based Serialization<a href=#7-row-based-serialization class=hash-link aria-label="Direct link to 7. Row-Based Serialization" title="Direct link to 7. Row-Based Serialization" translate=no></a></h3>
<p>Apache Fory™ provides a high-performance <strong>row format</strong> for zero-copy deserialization. Unlike traditional object serialization that reconstructs entire objects in memory, row format enables <strong>random access</strong> to fields directly from binary data without full deserialization.</p>
<p><strong>Key benefits:</strong></p>
<ul>
<li class=""><strong>Zero-copy access</strong>: Read fields without allocating or copying data</li>
<li class=""><strong>Partial deserialization</strong>: Access only the fields you need</li>
<li class=""><strong>Memory-mapped files</strong>: Work with data larger than RAM</li>
<li class=""><strong>Cache-friendly</strong>: Sequential memory layout for better CPU cache utilization</li>
<li class=""><strong>Lazy evaluation</strong>: Defer expensive operations until field access</li>
</ul>
<p><strong>When to use row format:</strong></p>
<ul>
<li class="">Analytics workloads with selective field access</li>
<li class="">Large datasets where only a subset of fields is needed</li>
<li class="">Memory-constrained environments</li>
<li class="">High-throughput data pipelines</li>
<li class="">Reading from memory-mapped files or shared memory</li>
</ul>
<p><strong>How it works:</strong></p>
<ul>
<li class="">Fields are encoded in a binary row with fixed offsets for primitives</li>
<li class="">Variable-length data (strings, collections) stored with offset pointers</li>
<li class="">Null bitmap tracks which fields are present</li>
<li class="">Nested structures supported through recursive row encoding</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>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 plain">to_row</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"> from_row</span><span class="token punctuation" style=color:#393A34>}</span><span class="token punctuation" style=color:#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">ForyRow</span><span class="token punctuation" style=color:#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>collections</span><span class="token namespace punctuation" style=opacity:0.7;color:#393A34>::</span><span class="token class-name">BTreeMap</span><span class="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(ForyRow)]</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">UserProfile</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 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"> username</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"> 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"> scores</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> </span><span class="token class-name">Vec</span><span class="token operator" style=color:#393A34>&lt;</span><span class="token keyword" style=color:#00009f>i32</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"> preferences</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> </span><span class="token class-name">BTreeMap</span><span class="token operator" style=color:#393A34>&lt;</span><span class="token class-name">String</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token operator" style=color:#393A34>></span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> is_active</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><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"> profile </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> </span><span class="token class-name">UserProfile</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 punctuation" style=color:#393A34>:</span><span class="token plain"> </span><span class="token number" style=color:#36acaa>12345</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> username</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"> 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"> scores</span><span class="token punctuation" 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 number" style=color:#36acaa>95</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"> </span><span class="token number" style=color:#36acaa>87</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"> </span><span class="token number" style=color:#36acaa>92</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"> </span><span class="token number" style=color:#36acaa>88</span><span class="token punctuation" style=color:#393A34>]</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> preferences</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> </span><span class="token class-name">BTreeMap</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 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 string" style=color:#e3116c>"theme"</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 string" style=color:#e3116c>"dark"</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 punctuation" style=color:#393A34>(</span><span class="token string" style=color:#e3116c>"language"</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 string" style=color:#e3116c>"en"</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 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"> is_active</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"></span><span class="token punctuation" style=color:#393A34>}</span><span class="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 to row format</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"> row_data </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> </span><span class="token function" style=color:#d73a49>to_row</span><span class="token punctuation" style=color:#393A34>(</span><span class="token operator" style=color:#393A34>&</span><span class="token plain">profile</span><span class="token punctuation" style=color:#393A34>)</span><span class="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>// Zero-copy deserialization - no object allocation!</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"> row </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> </span><span class="token function" style=color:#d73a49>from_row</span><span class="token punctuation" style=color:#393A34>::</span><span class="token operator" style=color:#393A34>&lt;</span><span class="token class-name">UserProfile</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">row_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" 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>// Access fields directly from binary data</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">row</span><span class="token punctuation" style=color:#393A34>.</span><span class="token function" style=color:#d73a49>id</span><span class="token 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>12345</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#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">row</span><span class="token punctuation" style=color:#393A34>.</span><span class="token function" style=color:#d73a49>username</span><span class="token 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 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 macro property" style=color:#36acaa>assert_eq!</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">row</span><span class="token punctuation" style=color:#393A34>.</span><span class="token function" style=color:#d73a49>email</span><span class="token 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 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"></span><span class="token macro property" style=color:#36acaa>assert_eq!</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">row</span><span class="token punctuation" style=color:#393A34>.</span><span class="token function" style=color:#d73a49>is_active</span><span class="token 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 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>// Access collections efficiently</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"> scores </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> row</span><span class="token punctuation" style=color:#393A34>.</span><span class="token function" style=color:#d73a49>scores</span><span class="token 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">scores</span><span class="token punctuation" style=color:#393A34>.</span><span class="token function" style=color:#d73a49>size</span><span class="token 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>4</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#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">scores</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 plain"> </span><span class="token number" style=color:#36acaa>95</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#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">scores</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 plain"> </span><span class="token number" style=color:#36acaa>87</span><span class="token punctuation" style=color:#393A34>)</span><span class="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"> prefs </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> row</span><span class="token punctuation" style=color:#393A34>.</span><span class="token function" style=color:#d73a49>preferences</span><span class="token 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">prefs</span><span class="token punctuation" style=color:#393A34>.</span><span class="token function" style=color:#d73a49>keys</span><span class="token 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>size</span><span class="token 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>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"></span><span class="token macro property" style=color:#36acaa>assert_eq!</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">prefs</span><span class="token punctuation" style=color:#393A34>.</span><span class="token function" style=color:#d73a49>keys</span><span class="token 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 plain"> </span><span class="token string" style=color:#e3116c>"language"</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#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">prefs</span><span class="token punctuation" style=color:#393A34>.</span><span class="token function" style=color:#d73a49>values</span><span class="token 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 plain"> </span><span class="token string" style=color:#e3116c>"en"</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>Performance comparison:</strong></p>
<table><thead><tr><th>Operation<th>Object Format<th>Row Format<tbody><tr><td>Full deserialization<td>Allocates all objects<td>Zero allocation<tr><td>Single field access<td>Full deserialization required<td>Direct offset read<tr><td>Memory usage<td>Full object graph in memory<td>Only accessed fields in memory<tr><td>Suitable for<td>Small objects, full access<td>Large objects, selective access</table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=8-thread-safe-serialization>8. Thread-Safe Serialization<a href=#8-thread-safe-serialization class=hash-link aria-label="Direct link to 8. Thread-Safe Serialization" title="Direct link to 8. Thread-Safe Serialization" translate=no></a></h3>
<p>Apache Fory™ Rust is fully thread-safe: <code>Fory</code> implements both <code>Send</code> and <code>Sync</code>, so one configured instance can be shared across threads for concurrent work. The internal read/write context pools are lazily initialized with thread-safe primitives, letting worker threads reuse buffers 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">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"></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>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"></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 plain">thread</span><span class="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, Clone, Copy, 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">Item</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"></span><span class="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>&lt;</span><span class="token punctuation" style=color:#393A34>(</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"> </span><span class="token class-name">Error</span><span class="token operator" style=color:#393A34>></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>&lt;</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>1000</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"> 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><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>&lt;</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>8</span><span class="token punctuation" style=color:#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">i</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"> shared </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 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"> 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 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"> i </span><span class="token punctuation" style=color:#393A34>}</span><span class="token punctuation" style=color:#393A34>;</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> shared</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">item</span><span class="token punctuation" style=color:#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"> bytes </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>unwrap</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"> item</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 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!</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">item</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>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 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">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>
<p><strong>Tip:</strong> Perform registrations (such as <code>fory.register::&lt;T>(id)</code>) before spawning threads so every worker sees the same metadata. Once configured, wrapping the instance in <code>Arc</code> is enough to fan out serialization and deserialization tasks safely.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=-supported-types>🔧 Supported Types<a href=#-supported-types class=hash-link aria-label="Direct link to 🔧 Supported Types" title="Direct link to 🔧 Supported Types" translate=no></a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=primitive-types>Primitive Types<a href=#primitive-types class=hash-link aria-label="Direct link to Primitive Types" title="Direct link to Primitive Types" translate=no></a></h3>
<table><thead><tr><th>Rust Type<th>Description<tbody><tr><td><code>bool</code><td>Boolean<tr><td><code>i8</code>, <code>i16</code>, <code>i32</code>, <code>i64</code><td>Signed integers<tr><td><code>f32</code>, <code>f64</code><td>Floating point<tr><td><code>String</code><td>UTF-8 string</table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=collections>Collections<a href=#collections class=hash-link aria-label="Direct link to Collections" title="Direct link to Collections" translate=no></a></h3>
<table><thead><tr><th>Rust Type<th>Description<tbody><tr><td><code>Vec&lt;T></code><td>Dynamic array<tr><td><code>VecDeque&lt;T></code><td>Double-ended queue<tr><td><code>LinkedList&lt;T></code><td>Doubly-linked list<tr><td><code>HashMap&lt;K, V></code><td>Hash map<tr><td><code>BTreeMap&lt;K, V></code><td>Ordered map<tr><td><code>HashSet&lt;T></code><td>Hash set<tr><td><code>BTreeSet&lt;T></code><td>Ordered set<tr><td><code>BinaryHeap&lt;T></code><td>Binary heap<tr><td><code>Option&lt;T></code><td>Optional value</table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=smart-pointers>Smart Pointers<a href=#smart-pointers class=hash-link aria-label="Direct link to Smart Pointers" title="Direct link to Smart Pointers" translate=no></a></h3>
<table><thead><tr><th>Rust Type<th>Description<tbody><tr><td><code>Box&lt;T></code><td>Heap allocation<tr><td><code>Rc&lt;T></code><td>Reference counting (shared refs tracked)<tr><td><code>Arc&lt;T></code><td>Thread-safe reference counting (shared refs tracked)<tr><td><code>RcWeak&lt;T></code><td>Weak reference to <code>Rc&lt;T></code> (breaks circular refs)<tr><td><code>ArcWeak&lt;T></code><td>Weak reference to <code>Arc&lt;T></code> (breaks circular refs)<tr><td><code>RefCell&lt;T></code><td>Interior mutability (runtime borrow checking)<tr><td><code>Mutex&lt;T></code><td>Thread-safe interior mutability</table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=date-and-time>Date and Time<a href=#date-and-time class=hash-link aria-label="Direct link to Date and Time" title="Direct link to Date and Time" translate=no></a></h3>
<table><thead><tr><th>Rust Type<th>Description<tbody><tr><td><code>chrono::NaiveDate</code><td>Date without timezone<tr><td><code>chrono::NaiveDateTime</code><td>Timestamp without timezone</table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=custom-types>Custom Types<a href=#custom-types class=hash-link aria-label="Direct link to Custom Types" title="Direct link to Custom Types" translate=no></a></h3>
<table><thead><tr><th>Macro<th>Description<tbody><tr><td><code>#[derive(ForyObject)]</code><td>Object graph serialization<tr><td><code>#[derive(ForyRow)]</code><td>Row-based serialization</table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=-cross-language-serialization>🌍 Cross-Language Serialization<a href=#-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>
<p>Apache Fory™ supports seamless data exchange across multiple languages:</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" 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 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>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 types with consistent IDs across languages</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>&lt;</span><span class="token class-name">MyStruct</span><span class="token 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" 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>// Or use namespace-based registration</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>&lt;</span><span class="token class-name">MyStruct</span><span class="token operator" style=color:#393A34>></span><span class="token punctuation" style=color:#393A34>(</span><span class="token string" style=color:#e3116c>"com.example"</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>"MyStruct"</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#393A34>;</span><br/></div></code></pre></div></div>
<p>See <a href=https://fory.apache.org/docs/specification/xlang_type_mapping target=_blank rel="noopener noreferrer" class="">xlang_type_mapping.md</a> for type mapping across languages.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=-performance>⚡ Performance<a href=#-performance class=hash-link aria-label="Direct link to ⚡ Performance" title="Direct link to ⚡ Performance" translate=no></a></h2>
<p>Apache Fory™ Rust is designed for maximum performance:</p>
<ul>
<li class=""><strong>Zero-Copy Deserialization</strong>: Row format enables direct memory access without copying</li>
<li class=""><strong>Buffer Pre-allocation</strong>: Minimizes memory allocations during serialization</li>
<li class=""><strong>Compact Encoding</strong>: Variable-length encoding for space efficiency</li>
<li class=""><strong>Little-Endian</strong>: Optimized for modern CPU architectures</li>
<li class=""><strong>Reference Deduplication</strong>: Shared objects serialized only once</li>
</ul>
<p>Run benchmarks:</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 builtin class-name">cd</span><span class="token plain"> benchmarks/rust_benchmark</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"> bench</span><br/></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=-documentation>📖 Documentation<a href=#-documentation class=hash-link aria-label="Direct link to 📖 Documentation" title="Direct link to 📖 Documentation" translate=no></a></h2>
<ul>
<li class=""><strong><a href=https://docs.rs/fory target=_blank rel="noopener noreferrer" class="">API Documentation</a></strong> - Complete API reference</li>
<li class=""><strong><a href=https://fory.apache.org/docs/specification/fory_xlang_serialization_spec target=_blank rel="noopener noreferrer" class="">Protocol Specification</a></strong> - Serialization protocol details</li>
<li class=""><strong><a href=https://fory.apache.org/docs/guide/xlang_type_mapping target=_blank rel="noopener noreferrer" class="">Type Mapping</a></strong> - Cross-language type mappings</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=-use-cases>🎯 Use Cases<a href=#-use-cases class=hash-link aria-label="Direct link to 🎯 Use Cases" title="Direct link to 🎯 Use Cases" translate=no></a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=object-serialization>Object Serialization<a href=#object-serialization class=hash-link aria-label="Direct link to Object Serialization" title="Direct link to Object Serialization" translate=no></a></h3>
<ul>
<li class="">Complex data structures with nested objects and references</li>
<li class="">Cross-language communication in microservices</li>
<li class="">General-purpose serialization with full type safety</li>
<li class="">Schema evolution with compatible mode</li>
<li class="">Graph-like data structures with circular references</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=row-based-serialization>Row-Based Serialization<a href=#row-based-serialization class=hash-link aria-label="Direct link to Row-Based Serialization" title="Direct link to Row-Based Serialization" translate=no></a></h3>
<ul>
<li class="">High-throughput data processing</li>
<li class="">Analytics workloads requiring fast field access</li>
<li class="">Memory-constrained environments</li>
<li class="">Real-time data streaming applications</li>
<li class="">Zero-copy scenarios</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=️-architecture>🏗️ Architecture<a href=#️-architecture class=hash-link aria-label="Direct link to 🏗️ Architecture" title="Direct link to 🏗️ Architecture" translate=no></a></h2>
<p>The Rust implementation consists of three main 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">├── src/lib.rs # Public API 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">├── src/</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">│ ├── fory.rs # Main serialization entry point</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">│ ├── buffer.rs # Binary buffer management</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 resolution and metadata</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">│ └── types.rs # Type definitions</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">├── src/</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">│ ├── object/ # ForyObject macro</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">│ └── fory_row.rs # ForyRow macro</span><br/></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=-serialization-modes>🔄 Serialization Modes<a href=#-serialization-modes class=hash-link aria-label="Direct link to 🔄 Serialization Modes" title="Direct link to 🔄 Serialization Modes" translate=no></a></h2>
<p>Apache Fory™ supports two serialization modes:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=schemaconsistent-mode-default>SchemaConsistent Mode (Default)<a href=#schemaconsistent-mode-default class=hash-link aria-label="Direct link to SchemaConsistent Mode (Default)" title="Direct link to SchemaConsistent Mode (Default)" translate=no></a></h3>
<p>Type declarations must match exactly between peers:</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>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><span class="token comment" style=color:#999988;font-style:italic>// SchemaConsistent by default</span><br/></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=compatible-mode>Compatible Mode<a href=#compatible-mode class=hash-link aria-label="Direct link to Compatible Mode" title="Direct link to Compatible Mode" translate=no></a></h3>
<p>Allows independent schema evolution:</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>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><br/></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=️-configuration>⚙️ Configuration<a href=#️-configuration class=hash-link aria-label="Direct link to ⚙️ Configuration" title="Direct link to ⚙️ Configuration" translate=no></a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=maximum-dynamic-object-nesting-depth>Maximum Dynamic Object Nesting Depth<a href=#maximum-dynamic-object-nesting-depth class=hash-link aria-label="Direct link to Maximum Dynamic Object Nesting Depth" title="Direct link to Maximum Dynamic Object Nesting Depth" translate=no></a></h3>
<p>Apache Fory™ provides protection against stack overflow from deeply nested dynamic objects during deserialization. By default, the maximum nesting depth is set to 5 levels for trait objects and containers.</p>
<p><strong>Default configuration:</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>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><span class="token comment" style=color:#999988;font-style:italic>// max_dyn_depth = 5</span><br/></div></code></pre></div></div>
<p><strong>Custom depth limit:</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>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>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 punctuation" style=color:#393A34>;</span><span class="token plain"> </span><span class="token comment" style=color:#999988;font-style:italic>// Allow up to 10 levels</span><br/></div></code></pre></div></div>
<p><strong>When to adjust:</strong></p>
<ul>
<li class=""><strong>Increase</strong>: For legitimate deeply nested data structures</li>
<li class=""><strong>Decrease</strong>: For stricter security requirements or shallow data structures</li>
</ul>
<p><strong>Protected types:</strong></p>
<ul>
<li class=""><code>Box&lt;dyn Any></code>, <code>Rc&lt;dyn Any></code>, <code>Arc&lt;dyn Any></code></li>
<li class=""><code>Box&lt;dyn Trait></code>, <code>Rc&lt;dyn Trait></code>, <code>Arc&lt;dyn Trait></code> (trait objects)</li>
<li class=""><code>RcWeak&lt;T></code>, <code>ArcWeak&lt;T></code></li>
<li class="">Collection types (Vec, HashMap, HashSet)</li>
<li class="">Nested struct types in Compatible mode</li>
</ul>
<p>Note: Static data types (non-dynamic types) are secure by nature and not subject to depth limits, as their structure is known at compile time.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=-troubleshooting>🧪 Troubleshooting<a href=#-troubleshooting class=hash-link aria-label="Direct link to 🧪 Troubleshooting" title="Direct link to 🧪 Troubleshooting" translate=no></a></h2>
<ul>
<li class=""><strong>Type registry errors</strong>: An error like <code>TypeId ... not found in type_info registry</code> means the type was never registered with the current <code>Fory</code> instance. Confirm that every serializable struct or trait implementation calls <code>fory.register::&lt;T>(type_id)</code> before serialization and that the same IDs are reused on the deserialize side.</li>
<li class=""><strong>Quick error lookup</strong>: Prefer the static constructors on <code>fory_core::error::Error</code> (<code>Error::type_mismatch</code>, <code>Error::invalid_data</code>, <code>Error::unknown</code>, etc.) rather than instantiating variants manually. This keeps diagnostics consistent and makes opt-in panics work.</li>
<li class=""><strong>Panic on error for backtraces</strong>: Toggle <code>FORY_PANIC_ON_ERROR=1</code> (or <code>true</code>) alongside <code>RUST_BACKTRACE=1</code> when running tests or binaries to panic at the exact site an error is constructed. Reset the variable afterwards to avoid aborting user-facing code paths.</li>
<li class=""><strong>Struct field tracing</strong>: Add the <code>#[fory_debug]</code> attribute alongside <code>#[derive(ForyObject)]</code> to tell the macro to emit hook invocations for that type. Once compiled with debug hooks, call <code>set_before_write_field_func</code>, <code>set_after_write_field_func</code>, <code>set_before_read_field_func</code>, or <code>set_after_read_field_func</code> (from <code>fory-core/src/serializer/struct_.rs</code>) to plug in custom callbacks, and use <code>reset_struct_debug_hooks()</code> when you want the defaults back.</li>
<li class=""><strong>Lightweight logging</strong>: Without custom hooks, enable <code>ENABLE_FORY_DEBUG_OUTPUT=1</code> to print field-level read/write events emitted by the default hook functions. This is especially useful when investigating alignment or cursor mismatches.</li>
<li class=""><strong>Test-time hygiene</strong>: Some integration tests expect <code>FORY_PANIC_ON_ERROR</code> to remain unset. Export it only for focused debugging sessions, and prefer <code>cargo test --features tests -p tests --test &lt;case></code> when isolating failing scenarios.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=️-development>🛠️ Development<a href=#️-development class=hash-link aria-label="Direct link to 🛠️ Development" title="Direct link to 🛠️ Development" translate=no></a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=building>Building<a href=#building class=hash-link aria-label="Direct link to Building" title="Direct link to Building" 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 builtin class-name">cd</span><span class="token plain"> 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"> build</span><br/></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=testing>Testing<a href=#testing class=hash-link aria-label="Direct link to Testing" title="Direct link to Testing" 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 comment" style=color:#999988;font-style:italic># Run all tests</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>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><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># Run specific test</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>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>-p</span><span class="token plain"> tests </span><span class="token parameter variable" style=color:#36acaa>--test</span><span class="token plain"> test_complex_struct</span><br/></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=code-quality>Code Quality<a href=#code-quality class=hash-link aria-label="Direct link to Code Quality" title="Direct link to Code Quality" 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 comment" style=color:#999988;font-style:italic># Format code</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>cargo</span><span class="token plain"> </span><span class="token function" style=color:#d73a49>fmt</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># Check formatting</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>cargo</span><span class="token plain"> </span><span class="token function" style=color:#d73a49>fmt</span><span class="token plain"> </span><span class="token parameter variable" style=color:#36acaa>--check</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># Run linter</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>cargo</span><span class="token plain"> clippy --all-targets --all-features -- </span><span class="token parameter variable" style=color:#36acaa>-D</span><span class="token plain"> warnings</span><br/></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=️-roadmap>🗺️ Roadmap<a href=#️-roadmap class=hash-link aria-label="Direct link to 🗺️ Roadmap" title="Direct link to 🗺️ Roadmap" translate=no></a></h2>
<ul class="contains-task-list containsTaskList_mC6p">
<li class=task-list-item><input type=checkbox disabled checked/> <!-- -->Static codegen based on rust macro</li>
<li class=task-list-item><input type=checkbox disabled checked/> <!-- -->Row format serialization</li>
<li class=task-list-item><input type=checkbox disabled checked/> <!-- -->Cross-language object graph serialization</li>
<li class=task-list-item><input type=checkbox disabled checked/> <!-- -->Shared and circular reference tracking</li>
<li class=task-list-item><input type=checkbox disabled checked/> <!-- -->Weak pointer support</li>
<li class=task-list-item><input type=checkbox disabled checked/> <!-- -->Trait object serialization with polymorphism</li>
<li class=task-list-item><input type=checkbox disabled checked/> <!-- -->Schema evolution in compatible mode</li>
<li class=task-list-item><input type=checkbox disabled checked/> <!-- -->SIMD optimizations for string encoding</li>
<li class=task-list-item><input type=checkbox disabled/> <!-- -->Cross-language support for shared and circular reference tracking</li>
<li class=task-list-item><input type=checkbox disabled/> <!-- -->Cross-language support for trait objects</li>
<li class=task-list-item><input type=checkbox disabled/> <!-- -->Performance optimizations</li>
<li class=task-list-item><input type=checkbox disabled/> <!-- -->More comprehensive benchmarks</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=-license>📄 License<a href=#-license class=hash-link aria-label="Direct link to 📄 License" title="Direct link to 📄 License" translate=no></a></h2>
<p>Licensed under the Apache License, Version 2.0. See <a href=https://github.com/apache/fory/blob/main/LICENSE target=_blank rel="noopener noreferrer" class="">LICENSE</a> for details.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=-contributing>🤝 Contributing<a href=#-contributing class=hash-link aria-label="Direct link to 🤝 Contributing" title="Direct link to 🤝 Contributing" translate=no></a></h2>
<p>We welcome contributions! Please see our <a href=https://github.com/apache/fory/blob/main/CONTRIBUTING.md target=_blank rel="noopener noreferrer" class="">Contributing Guide</a> for details.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=-support>📞 Support<a href=#-support class=hash-link aria-label="Direct link to 📞 Support" title="Direct link to 📞 Support" translate=no></a></h2>
<ul>
<li class=""><strong>Documentation</strong>: <a href=https://docs.rs/fory target=_blank rel="noopener noreferrer" class="">docs.rs/fory</a></li>
<li class=""><strong>Issues</strong>: <a href=https://github.com/apache/fory/issues target=_blank rel="noopener noreferrer" class="">GitHub Issues</a></li>
<li class=""><strong>Discussions</strong>: <a href=https://github.com/apache/fory/discussions target=_blank rel="noopener noreferrer" class="">GitHub Discussions</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="">Apache Fory Slack</a></li>
</ul>
<hr/>
<p><strong>Apache Fory™</strong> - Blazingly fast multi-language serialization framework.</div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="row margin-top--sm theme-doc-footer-edit-meta-row"><div class="col noPrint_WFHX"><a href=https://github.com/apache/fory-site/tree/main/docs/guide/rust_guide.md target=_blank rel="noopener noreferrer" class=theme-edit-this-page><svg fill=currentColor height=20 width=20 viewBox="0 0 40 40" class=iconEdit_Z9Sw aria-hidden=true><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"/></g></svg>Edit this page</a></div><div class="col lastUpdated_JAkA"></div></div></footer></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href=/docs/0.13/guide/python_serialization><div class=pagination-nav__sublabel>Previous</div><div class=pagination-nav__label>Python Serialization</div></a><a class="pagination-nav__link pagination-nav__link--next" href=/docs/0.13/guide/scala_serialization><div class=pagination-nav__sublabel>Next</div><div class=pagination-nav__label>Scala Serialization</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href=#apache-fory-rust class="table-of-contents__link toc-highlight">Apache Fory™ Rust</a><li><a href=#-why-apache-fory-rust class="table-of-contents__link toc-highlight">🚀 Why Apache Fory™ Rust?</a><li><a href=#-crates class="table-of-contents__link toc-highlight">📦 Crates</a><li><a href=#-quick-start class="table-of-contents__link toc-highlight">🏃 Quick Start</a><ul><li><a href=#basic-example class="table-of-contents__link toc-highlight">Basic Example</a></ul><li><a href=#-core-features class="table-of-contents__link toc-highlight">📚 Core Features</a><ul><li><a href=#1-object-graph-serialization class="table-of-contents__link toc-highlight">1. Object Graph Serialization</a><li><a href=#2-shared-and-circular-references class="table-of-contents__link toc-highlight">2. Shared and Circular References</a><li><a href=#3-trait-object-serialization class="table-of-contents__link toc-highlight">3. Trait Object Serialization</a><li><a href=#4-schema-evolution class="table-of-contents__link toc-highlight">4. Schema Evolution</a><li><a href=#5-enum-support class="table-of-contents__link toc-highlight">5. Enum Support</a><li><a href=#6-tuple-support class="table-of-contents__link toc-highlight">6. Tuple Support</a><li><a href=#7-custom-serializers class="table-of-contents__link toc-highlight">7. Custom Serializers</a><li><a href=#7-row-based-serialization class="table-of-contents__link toc-highlight">7. Row-Based Serialization</a><li><a href=#8-thread-safe-serialization class="table-of-contents__link toc-highlight">8. Thread-Safe Serialization</a></ul><li><a href=#-supported-types class="table-of-contents__link toc-highlight">🔧 Supported Types</a><ul><li><a href=#primitive-types class="table-of-contents__link toc-highlight">Primitive Types</a><li><a href=#collections class="table-of-contents__link toc-highlight">Collections</a><li><a href=#smart-pointers class="table-of-contents__link toc-highlight">Smart Pointers</a><li><a href=#date-and-time class="table-of-contents__link toc-highlight">Date and Time</a><li><a href=#custom-types class="table-of-contents__link toc-highlight">Custom Types</a></ul><li><a href=#-cross-language-serialization class="table-of-contents__link toc-highlight">🌍 Cross-Language Serialization</a><li><a href=#-performance class="table-of-contents__link toc-highlight">⚡ Performance</a><li><a href=#-documentation class="table-of-contents__link toc-highlight">📖 Documentation</a><li><a href=#-use-cases class="table-of-contents__link toc-highlight">🎯 Use Cases</a><ul><li><a href=#object-serialization class="table-of-contents__link toc-highlight">Object Serialization</a><li><a href=#row-based-serialization class="table-of-contents__link toc-highlight">Row-Based Serialization</a></ul><li><a href=#️-architecture class="table-of-contents__link toc-highlight">🏗️ Architecture</a><li><a href=#-serialization-modes class="table-of-contents__link toc-highlight">🔄 Serialization Modes</a><ul><li><a href=#schemaconsistent-mode-default class="table-of-contents__link toc-highlight">SchemaConsistent Mode (Default)</a><li><a href=#compatible-mode class="table-of-contents__link toc-highlight">Compatible Mode</a></ul><li><a href=#️-configuration class="table-of-contents__link toc-highlight">⚙️ Configuration</a><ul><li><a href=#maximum-dynamic-object-nesting-depth class="table-of-contents__link toc-highlight">Maximum Dynamic Object Nesting Depth</a></ul><li><a href=#-troubleshooting class="table-of-contents__link toc-highlight">🧪 Troubleshooting</a><li><a href=#️-development class="table-of-contents__link toc-highlight">🛠️ Development</a><ul><li><a href=#building class="table-of-contents__link toc-highlight">Building</a><li><a href=#testing class="table-of-contents__link toc-highlight">Testing</a><li><a href=#code-quality class="table-of-contents__link toc-highlight">Code Quality</a></ul><li><a href=#️-roadmap class="table-of-contents__link toc-highlight">🗺️ Roadmap</a><li><a href=#-license class="table-of-contents__link toc-highlight">📄 License</a><li><a href=#-contributing class="table-of-contents__link toc-highlight">🤝 Contributing</a><li><a href=#-support class="table-of-contents__link toc-highlight">📞 Support</a></ul></div></div></div></div></main></div></div></div><footer class="theme-layout-footer footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="theme-layout-footer-column col footer__col"><div class=footer__title>Community</div><ul class="footer__items clean-list"><li class=footer__item><a href=https://lists.apache.org/list.html?dev@fory.apache.org target=_blank rel="noopener noreferrer" class=footer__link-item>Mailing list<svg width=13.5 height=13.5 aria-label="(opens in new tab)" class=iconExternalLink_nPIU><use href=#theme-svg-external-link /></svg></a><li class=footer__item><a href=https://join.slack.com/t/fory-project/shared_invite/zt-1u8soj4qc-ieYEu7ciHOqA2mo47llS8A target=_blank rel="noopener noreferrer" class=footer__link-item>Slack<svg width=13.5 height=13.5 aria-label="(opens in new tab)" class=iconExternalLink_nPIU><use href=#theme-svg-external-link /></svg></a><li class=footer__item><a href=https://twitter.com/ApacheFory target=_blank rel="noopener noreferrer" class=footer__link-item>Twitter<svg width=13.5 height=13.5 aria-label="(opens in new tab)" class=iconExternalLink_nPIU><use href=#theme-svg-external-link /></svg></a></ul></div><div class="theme-layout-footer-column col footer__col"><div class=footer__title>Docs</div><ul class="footer__items clean-list"><li class=footer__item><a class=footer__link-item href=/docs/start/install>Install</a><li class=footer__item><a class=footer__link-item href=/docs/start/usage>Usage</a><li class=footer__item><a class=footer__link-item href=/docs/introduction/benchmark>Benchmark</a></ul></div><div class="theme-layout-footer-column col footer__col"><div class=footer__title>Repositories</div><ul class="footer__items clean-list"><li class=footer__item><a href=https://github.com/apache/fory target=_blank rel="noopener noreferrer" class=footer__link-item>Apache Fory™<svg width=13.5 height=13.5 aria-label="(opens in new tab)" class=iconExternalLink_nPIU><use href=#theme-svg-external-link /></svg></a><li class=footer__item><a href=https://github.com/apache/fory-site target=_blank rel="noopener noreferrer" class=footer__link-item>Website<svg width=13.5 height=13.5 aria-label="(opens in new tab)" class=iconExternalLink_nPIU><use href=#theme-svg-external-link /></svg></a></ul></div></div><div class="footer__bottom text--center"><div class=margin-bottom--sm><a href=https://apache.org/ rel="noopener noreferrer" class=footerLogoLink_BH7S><img src=/img/asf_logo.svg alt="ASF Logo" class="footer__logo themedComponent_mlkZ themedComponent--light_NVdE" width=200 /><img src=/img/asf_logo.svg alt="ASF Logo" class="footer__logo themedComponent_mlkZ themedComponent--dark_xIcU" width=200 /></a></div><div class=footer__copyright><div>
<p>
Copyright © 2026 The Apache Software Foundation, Licensed under the Apache License, Version 2.0. <br/>
Apache Fory, Fory, Apache, the Apache Logo and the Apache Fory logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.
</p>
</div></div></div></div></footer></div></body>