blob: 135c24daf739529f19ca64de9165d938926acf37 [file]
<!doctype html><html lang=en-US dir=ltr class="docs-wrapper plugin-docs plugin-id-default docs-version-1.3.0 docs-doc-page docs-doc-id-guide/kotlin/static_generated_serializers" data-has-hydrated=false><head><meta charset=UTF-8><meta name=generator content="Docusaurus v3.10.1"><title data-rh=true>Static Generated Serializers | 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/guide/kotlin/static_generated_serializers /><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=1.3.0 /><meta data-rh=true name=docusaurus_tag content=docs-default-1.3.0 /><meta data-rh=true name=docsearch:version content=1.3.0 /><meta data-rh=true name=docsearch:docusaurus_tag content=docs-default-1.3.0 /><meta data-rh=true property=og:title content="Static Generated Serializers | Apache Fory™"/><meta data-rh=true name=description content="Use fory-kotlin-ksp when Kotlin classes must participate in Fory"/><meta data-rh=true property=og:description content="Use fory-kotlin-ksp when Kotlin classes must participate in Fory"/><link data-rh=true rel=icon href=/img/favicon.ico /><link data-rh=true rel=canonical href=https://fory.apache.org/docs/guide/kotlin/static_generated_serializers /><link data-rh=true rel=alternate href=https://fory.apache.org/docs/guide/kotlin/static_generated_serializers hreflang=en-US /><link data-rh=true rel=alternate href=https://fory.apache.org/zh-CN/docs/guide/kotlin/static_generated_serializers hreflang=zh-CN /><link data-rh=true rel=alternate href=https://fory.apache.org/docs/guide/kotlin/static_generated_serializers 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/guide/kotlin/","name":"Kotlin","position":1},{"@type":"ListItem","item":"https://fory.apache.org/docs/guide/kotlin/static_generated_serializers","name":"Static Generated Serializers","position":2}]}</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/introduction/overview>Docs</a><a class="navbar__item navbar__link" href=/docs/specification/xlang_serialization_spec>Specification</a><a class="navbar__item navbar__link" href=/docs/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/guide/kotlin/static_generated_serializers>1.3.0</a><ul class=dropdown__menu><li><a class=dropdown__link href=/docs/next/guide/kotlin/static_generated_serializers>dev</a><li><a aria-current=page class="dropdown__link dropdown__link--active" href=/docs/guide/kotlin/static_generated_serializers>1.3.0</a><li><a class=dropdown__link href=/docs/1.2.0/guide/kotlin/static_generated_serializers>1.2.0</a><li><a class=dropdown__link href=/docs/1.1.0/guide/kotlin/static_generated_serializers>1.1.0</a><li><a class=dropdown__link href=/docs/1.0.0/guide/kotlin/static_generated_serializers>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 class=dropdown__link href=/docs/0.13/introduction/overview>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/guide/kotlin/static_generated_serializers target=_self rel="noopener noreferrer" class="dropdown__link dropdown__link--active" lang=en-US>English</a><li><a href=/zh-CN/docs/guide/kotlin/static_generated_serializers 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"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=true href=/docs/introduction/overview><span title=Introduction class=categoryLinkLabel_W154>Introduction</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/introduction/overview><span title=Overview class=linkLabel_WmDU>Overview</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/introduction/features><span title=Features class=linkLabel_WmDU>Features</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/introduction/benchmark><span title=Benchmark class=linkLabel_WmDU>Benchmark</span></a></ul><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" role=button aria-expanded=true href=/docs/start/install><span title=Start class=categoryLinkLabel_W154>Start</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/start/install><span title=Install class=linkLabel_WmDU>Install</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/start/usage><span title=Usage class=linkLabel_WmDU>Usage</span></a></ul><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/compiler/><span title="Schema IDL & Compiler" class=categoryLinkLabel_W154>Schema IDL & Compiler</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/guide/java/><span title=Guide class=categoryLinkLabel_W154>Guide</span></a></div><ul class=menu__list><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist" tabindex=0 href=/docs/guide/java/><span title=Java class=categoryLinkLabel_W154>Java</span></a><button aria-label="Expand sidebar category 'Java'" 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-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist" tabindex=0 href=/docs/guide/python/><span title=Python class=categoryLinkLabel_W154>Python</span></a><button aria-label="Expand sidebar category 'Python'" 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-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist" tabindex=0 href=/docs/guide/rust/><span title=Rust class=categoryLinkLabel_W154>Rust</span></a><button aria-label="Expand sidebar category 'Rust'" 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-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist" tabindex=0 href=/docs/guide/cpp/><span title=C++ class=categoryLinkLabel_W154>C++</span></a><button aria-label="Expand sidebar category 'C++'" 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-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist" tabindex=0 href=/docs/guide/go/><span title=Go class=categoryLinkLabel_W154>Go</span></a><button aria-label="Expand sidebar category 'Go'" 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-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist" tabindex=0 href=/docs/guide/javascript/><span title=JavaScript class=categoryLinkLabel_W154>JavaScript</span></a><button aria-label="Expand sidebar category 'JavaScript'" 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-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist" tabindex=0 href=/docs/guide/csharp/><span title=C# class=categoryLinkLabel_W154>C#</span></a><button aria-label="Expand sidebar category 'C#'" 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-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist" tabindex=0 href=/docs/guide/swift/><span title=Swift class=categoryLinkLabel_W154>Swift</span></a><button aria-label="Expand sidebar category 'Swift'" 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-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist" tabindex=0 href=/docs/guide/dart/><span title=Dart class=categoryLinkLabel_W154>Dart</span></a><button aria-label="Expand sidebar category 'Dart'" 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-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist" tabindex=0 href=/docs/guide/scala/><span title=Scala class=categoryLinkLabel_W154>Scala</span></a><button aria-label="Expand sidebar category 'Scala'" 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-2 menu__list-item"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--active" tabindex=0 href=/docs/guide/kotlin/><span title=Kotlin class=categoryLinkLabel_W154>Kotlin</span></a><button aria-label="Collapse sidebar category 'Kotlin'" aria-expanded=true type=button class="clean-btn menu__caret"></button></div><ul class=menu__list><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/guide/kotlin/configuration><span title=Configuration class=linkLabel_WmDU>Configuration</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/guide/kotlin/type_serialization><span title="Type Serialization" class=linkLabel_WmDU>Type Serialization</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/guide/kotlin/schema_metadata><span title="Schema Metadata" class=linkLabel_WmDU>Schema Metadata</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/guide/kotlin/default_values><span title="Default Values" class=linkLabel_WmDU>Default Values</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current=page tabindex=0 href=/docs/guide/kotlin/static_generated_serializers><span title="Static Generated Serializers" class=linkLabel_WmDU>Static Generated Serializers</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/guide/kotlin/grpc_support><span title="Kotlin gRPC Support" class=linkLabel_WmDU>Kotlin gRPC Support</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/guide/kotlin/android_support><span title="Android Support" class=linkLabel_WmDU>Android Support</span></a></ul><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist" tabindex=0 href=/docs/guide/xlang/><span title="Cross Language" class=categoryLinkLabel_W154>Cross Language</span></a><button aria-label="Expand sidebar category 'Cross Language'" aria-expanded=false type=button class="clean-btn menu__caret"></button></div></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=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><a class=breadcrumbs__link href=/docs/guide/kotlin/><span>Kotlin</span></a><li class="breadcrumbs__item breadcrumbs__item--active"><span class=breadcrumbs__link>Static Generated Serializers</span></ul></nav><span class="theme-doc-version-badge badge badge--secondary">Version: 1.3.0</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>Static Generated Serializers</h1></header><p>Use <code>fory-kotlin-ksp</code> when Kotlin classes must participate in Fory
cross-language schema serialization. The processor generates Kotlin source
serializers at build time. Those serializers call the existing Fory Java
implementation, including <code>WriteContext</code>, <code>ReadContext</code>, and <code>MemoryBuffer</code>; there is
no Kotlin-only protocol.</p>
<p>Static generated Kotlin serializers are for Kotlin/JVM and Android xlang/schema
mode. They are not Java native object serializers and do not preserve JVM object
graph implementation details such as the exact concrete collection class.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=add-ksp>Add KSP<a href=#add-ksp class=hash-link aria-label="Direct link to Add KSP" title="Direct link to Add KSP" translate=no></a></h2>
<p>Add <code>fory-kotlin</code> to the application classpath and run <code>fory-kotlin-ksp</code> as a KSP processor in
the module that compiles your <code>@ForyStruct</code> Kotlin classes.</p>
<div class="language-kotlin codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-kotlin codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token plain">plugins </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token function" style=color:#d73a49>id</span><span class="token punctuation" style=color:#393A34>(</span><span class="token string-literal singleline string" style=color:#e3116c>"com.google.devtools.ksp"</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"> version </span><span class="token string-literal singleline string" style=color:#e3116c>"&lt;ksp-version>"</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">dependencies </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token function" style=color:#d73a49>implementation</span><span class="token punctuation" style=color:#393A34>(</span><span class="token string-literal singleline string" style=color:#e3116c>"org.apache.fory:fory-kotlin:&lt;fory-version>"</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token function" style=color:#d73a49>ksp</span><span class="token punctuation" style=color:#393A34>(</span><span class="token string-literal singleline string" style=color:#e3116c>"org.apache.fory:fory-kotlin-ksp:&lt;fory-version>"</span><span class="token punctuation" style=color:#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>For Android, configure KSP in the Android module or library module that owns
the Kotlin model classes.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=define-a-struct>Define A Struct<a href=#define-a-struct class=hash-link aria-label="Direct link to Define A Struct" title="Direct link to Define A Struct" translate=no></a></h2>
<p>Reuse the Java Fory annotations for schema concepts. Use Kotlin type-use
annotations only when you need to override integer encoding.</p>
<div class="language-kotlin codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-kotlin codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token keyword" style=color:#00009f>import</span><span class="token plain"> org</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">apache</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">fory</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">annotation</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">ForyField</span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token keyword" style=color:#00009f>import</span><span class="token plain"> org</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">apache</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">fory</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">annotation</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">ForyStruct</span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token keyword" style=color:#00009f>import</span><span class="token plain"> org</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">apache</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">fory</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">kotlin</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">Fixed</span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token keyword" style=color:#00009f>import</span><span class="token plain"> org</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">apache</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">fory</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">kotlin</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">VarInt</span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token annotation builtin">@ForyStruct</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token keyword" style=color:#00009f>data</span><span class="token plain"> </span><span class="token keyword" style=color:#00009f>class</span><span class="token plain"> </span><span class="token function" style=color:#d73a49>User</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token annotation builtin">@ForyField</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">id </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> </span><span class="token number" style=color:#36acaa>1</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>val</span><span class="token plain"> id</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token annotation builtin">@Fixed</span><span class="token plain"> UInt</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token annotation builtin">@ForyField</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">id </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> </span><span class="token number" style=color:#36acaa>2</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>val</span><span class="token plain"> score</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token annotation builtin">@VarInt</span><span class="token plain"> Long</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token annotation builtin">@ForyField</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">id </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> </span><span class="token number" style=color:#36acaa>3</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>val</span><span class="token plain"> tags</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> List</span><span class="token operator" style=color:#393A34>&lt;</span><span class="token plain">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><br/></div></code></pre></div></div>
<p>Use <code>@ForyField(id = 1)</code> on constructor properties. <code>@field:ForyField(id = 1)</code>
is also accepted for field-backed properties. Do not use <code>@get:ForyField</code> or
<code>@set:ForyField</code>; accessors are not schema fields and the processor rejects
them.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=supported-structs>Supported Structs<a href=#supported-structs class=hash-link aria-label="Direct link to Supported Structs" title="Direct link to Supported Structs" translate=no></a></h2>
<p>The processor generates serializers for public or internal, concrete,
non-generic classes in named packages. A supported class must have a primary
constructor whose serialized parameters are <code>val</code> or <code>var</code> properties. <code>data class</code> is the common case, but it is not required.</p>
<p>Internal Kotlin struct classes are supported when KSP runs in the same Kotlin
module that owns the struct. The generated Kotlin serializer is also internal,
so it can call the internal constructor and expose the internal type in
overrides while still producing a JVM class that Fory Java can load.
Application code outside that Kotlin module still cannot refer to the internal
struct directly, so registration must happen from code that can see the class.</p>
<p>The processor rejects these declarations:</p>
<ul>
<li class=""><code>private</code> struct classes.</li>
<li class="">local, anonymous, or nested <code>@ForyStruct</code> classes.</li>
<li class="">Kotlin <code>object</code> declarations.</li>
<li class="">interfaces, abstract classes, and sealed classes as serializer targets.</li>
<li class="">generic <code>@ForyStruct</code> classes.</li>
<li class="">private constructor properties.</li>
<li class="">private or protected primary constructors.</li>
</ul>
<p>Kotlin default constructor arguments are supported for compatible reads. A
struct can have up to 12 defaulted constructor fields.</p>
<p>Constructor-based generated serializers support wide primary constructors.
Compatible reads track remote field presence in generated side state instead of
using constructor bit masks.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=nullability>Nullability<a href=#nullability class=hash-link aria-label="Direct link to Nullability" title="Direct link to Nullability" translate=no></a></h2>
<p>Use Kotlin <code>?</code> to describe nullable schema positions. Nullability is preserved
inside collections and maps.</p>
<div class="language-kotlin codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-kotlin codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token annotation builtin">@ForyStruct</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token keyword" style=color:#00009f>data</span><span class="token plain"> </span><span class="token keyword" style=color:#00009f>class</span><span class="token plain"> </span><span class="token function" style=color:#d73a49>NullabilityExample</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token annotation builtin">@ForyField</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">id </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> </span><span class="token number" style=color:#36acaa>1</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>val</span><span class="token plain"> a</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> List</span><span class="token operator" style=color:#393A34>&lt;</span><span class="token plain">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" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token annotation builtin">@ForyField</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">id </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> </span><span class="token number" style=color:#36acaa>2</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>val</span><span class="token plain"> b</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> List</span><span class="token operator" style=color:#393A34>&lt;</span><span class="token plain">String</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" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token annotation builtin">@ForyField</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">id </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> </span><span class="token number" style=color:#36acaa>3</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>val</span><span class="token plain"> c</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> List</span><span class="token operator" style=color:#393A34>&lt;</span><span class="token plain">String</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" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token annotation builtin">@ForyField</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">id </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> </span><span class="token number" style=color:#36acaa>4</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>val</span><span class="token plain"> d</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> List</span><span class="token operator" style=color:#393A34>&lt;</span><span class="token plain">String</span><span class="token operator" style=color:#393A34>?</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><br/></div></code></pre></div></div>
<p>Do not use Fory <code>@Nullable</code> in hand-written constructor-based Kotlin structs.
The KSP processor rejects it so the schema is always read from Kotlin source
nullability. Compiler-generated Kotlin IDL sources follow the same rule and use
Kotlin <code>?</code> for nullable fields.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=references>References<a href=#references class=hash-link aria-label="Direct link to References" title="Direct link to References" translate=no></a></h2>
<p>Kotlin generated serializers preserve <code>@Ref</code> metadata for fields, list
elements, and map values. Constructor-owned reads construct Kotlin values
through primary constructors. Schema IDL classes that need reference
publication are emitted as mutable no-arg classes, and their KSP-generated
serializers publish the instance before reading fields. In both shapes, KSP owns
field descriptors, nested nullability, and <code>@Ref</code> metadata.</p>
<h2 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></h2>
<p>Collection declarations carry schema shape, not JVM implementation identity.
For example, <code>List&lt;String></code> is encoded as <code>list&lt;string></code> and
<code>Map&lt;String, Int></code> is encoded as <code>map&lt;string, int32></code>.</p>
<p>Deserialization only guarantees that the result is assignable to the declared
field type. Fory does not preserve whether the original concrete value was an
<code>ArrayList</code>, <code>LinkedList</code>, <code>Collections.unmodifiableList</code>, synchronized
collection wrapper, or another JVM-specific collection implementation.</p>
<p>Supported collection declarations include Kotlin and Java list, set, and map
types. Mutable collection interface fields are deserialized to mutable
implementations assignable to the declared type. Sorted collections without an
explicit comparator, such as <code>TreeSet</code> and <code>ConcurrentSkipListSet</code>, are accepted
only for non-null scalar or string elements. Concurrent map declarations are
accepted only with non-null values because JVM concurrent map implementations
reject null entries.</p>
<p><code>Set&lt;*></code>, <code>Map&lt;*, T></code>, <code>Map&lt;*, *></code>, and raw Java collections are rejected.
<code>List&lt;*></code> and <code>Map&lt;K, *></code> are accepted and use dynamic nullable values.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=dense-arrays>Dense Arrays<a href=#dense-arrays class=hash-link aria-label="Direct link to Dense Arrays" title="Direct link to Dense Arrays" translate=no></a></h2>
<p>Kotlin dense primitive and unsigned array fields are supported:</p>
<ul>
<li class=""><code>BooleanArray</code></li>
<li class=""><code>ByteArray</code></li>
<li class=""><code>ShortArray</code></li>
<li class=""><code>IntArray</code></li>
<li class=""><code>LongArray</code></li>
<li class=""><code>FloatArray</code></li>
<li class=""><code>DoubleArray</code></li>
<li class=""><code>UByteArray</code></li>
<li class=""><code>UShortArray</code></li>
<li class=""><code>UIntArray</code></li>
<li class=""><code>ULongArray</code></li>
</ul>
<p>Dense arrays with unambiguous Kotlin carriers are supported in fields,
collection elements, map values, and union cases. <code>array&lt;float16></code> and
<code>array&lt;bfloat16></code> use the Java core <code>Float16Array</code> and <code>BFloat16Array</code> carriers.</p>
<p><code>ByteArray</code> is encoded as Fory <code>binary</code> unless the <code>ByteArray</code> type use is
annotated with Java <code>@ArrayType</code>. Generated Kotlin IDL uses
<code>@ArrayType ByteArray</code> for <code>array&lt;int8></code>, including nested collection and map
positions.</p>
<p><code>@ArrayType</code> is also supported on top-level <code>List&lt;T></code> fields when <code>T</code> is a
non-null boolean or numeric dense-array element type. In that case the field is
encoded as dense <code>array&lt;T></code> schema, and generated reads convert decoded JVM list
elements back to the declared Kotlin element carrier.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=integer-encoding>Integer Encoding<a href=#integer-encoding class=hash-link aria-label="Direct link to Integer Encoding" title="Direct link to Integer Encoding" translate=no></a></h2>
<p>Kotlin type-use encoding annotations map to Fory xlang integer encodings:</p>
<table><thead><tr><th>Annotation<th>Valid Kotlin types<tbody><tr><td><code>@Fixed</code><td><code>Int</code>, <code>Long</code>, <code>UInt</code>, <code>ULong</code><tr><td><code>@VarInt</code><td><code>Int</code>, <code>Long</code>, <code>UInt</code>, <code>ULong</code><tr><td><code>@Tagged</code><td><code>Long</code>, <code>ULong</code></table>
<p>Without an annotation, xlang <code>Int</code>, <code>Long</code>, <code>UInt</code>, and <code>ULong</code> use varint
encoding. This is required by xlang mode and is not controlled by Java native
mode numeric compression options.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=duration>Duration<a href=#duration class=hash-link aria-label="Direct link to Duration" title="Direct link to Duration" translate=no></a></h2>
<p>Xlang <code>duration</code> maps to <code>kotlin.time.Duration</code>. Infinite Kotlin durations
cannot be represented by the xlang duration payload and fail during
serialization.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=sealed-unions>Sealed Unions<a href=#sealed-unions class=hash-link aria-label="Direct link to Sealed Unions" title="Direct link to Sealed Unions" translate=no></a></h2>
<p>KSP generates serializers for top-level sealed classes annotated with
<code>@ForyUnion</code>. Each schema case is a nested class annotated with <code>@ForyCase</code> and
one constructor property named <code>value</code>. <code>Unknown(UnknownCase)</code> is marked with
<code>@ForyUnknownCase</code> as the Fory-owned forward-compatibility carrier. It is
omitted from the schema case table because the marker only selects the carrier
and does not add a schema entry. A typed union must declare at least one
non-<code>Unknown</code> case:</p>
<div class="language-kotlin codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-kotlin codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token keyword" style=color:#00009f>package</span><span class="token plain"> example</span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token keyword" style=color:#00009f>import</span><span class="token plain"> org</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">apache</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">fory</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">annotation</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">ForyCase</span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token keyword" style=color:#00009f>import</span><span class="token plain"> org</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">apache</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">fory</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">annotation</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">ForyUnion</span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token keyword" style=color:#00009f>import</span><span class="token plain"> org</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">apache</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">fory</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">annotation</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">ForyUnknownCase</span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token keyword" style=color:#00009f>import</span><span class="token plain"> org</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">apache</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">fory</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">type</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">union</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">UnknownCase</span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token annotation builtin">@ForyUnion</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token keyword" style=color:#00009f>sealed</span><span class="token plain"> </span><span class="token keyword" style=color:#00009f>class</span><span class="token plain"> Animal </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token annotation builtin">@ForyUnknownCase</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>data</span><span class="token plain"> </span><span class="token keyword" style=color:#00009f>class</span><span class="token plain"> </span><span class="token function" style=color:#d73a49>Unknown</span><span class="token punctuation" style=color:#393A34>(</span><span class="token keyword" style=color:#00009f>val</span><span class="token plain"> value</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> UnknownCase</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"> </span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token function" style=color:#d73a49>Animal</span><span class="token punctuation" style=color:#393A34>(</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token annotation builtin">@ForyCase</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">id </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> </span><span class="token number" style=color:#36acaa>0</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>data</span><span class="token plain"> </span><span class="token keyword" style=color:#00009f>class</span><span class="token plain"> </span><span class="token function" style=color:#d73a49>Dog</span><span class="token punctuation" style=color:#393A34>(</span><span class="token keyword" style=color:#00009f>val</span><span class="token plain"> value</span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> example</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">Dog</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"> </span><span class="token operator" style=color:#393A34>:</span><span class="token plain"> </span><span class="token function" style=color:#d73a49>Animal</span><span class="token punctuation" style=color:#393A34>(</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token punctuation" style=color:#393A34>}</span><br/></div></code></pre></div></div>
<p>When a generated Kotlin union case name matches the payload type simple name,
packaged output keeps the case name and qualifies the payload type. If a target
output mode cannot express a legal qualifier for a conflict, the IDL compiler
appends <code>Case</code> to the generated case class name.</p>
<p>Generated schema modules register sealed unions through <code>KotlinSerializers.registerUnion</code>.
Fory discovers the generated <code>&lt;Target>_ForySerializer</code> automatically, so
callers do not pass a serializer instance.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=register-classes>Register Classes<a href=#register-classes class=hash-link aria-label="Direct link to Register Classes" title="Direct link to Register Classes" translate=no></a></h2>
<p>Register Kotlin struct classes with the Kotlin <code>register&lt;T></code> extension. You
choose the xlang namespace and type name; generated serializers do not choose
IDs or names for you.</p>
<div class="language-kotlin codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-kotlin codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token keyword" style=color:#00009f>import</span><span class="token plain"> org</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">apache</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">fory</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">kotlin</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">ForyKotlin</span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token keyword" style=color:#00009f>import</span><span class="token plain"> org</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">apache</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">fory</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">kotlin</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">register</span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token keyword" style=color:#00009f>val</span><span class="token plain"> fory </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> ForyKotlin</span><span class="token punctuation" style=color:#393A34>.</span><span class="token function" style=color:#d73a49>builder</span><span class="token punctuation" style=color:#393A34>(</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>.</span><span class="token function" style=color:#d73a49>withXlang</span><span class="token punctuation" style=color:#393A34>(</span><span class="token boolean" style=color:#36acaa>true</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>.</span><span class="token function" style=color:#d73a49>requireClassRegistration</span><span class="token punctuation" style=color:#393A34>(</span><span class="token boolean" style=color:#36acaa>true</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>.</span><span class="token function" style=color:#d73a49>build</span><span class="token punctuation" style=color:#393A34>(</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain">fory</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">register</span><span class="token operator" style=color:#393A34>&lt;</span><span class="token plain">User</span><span class="token operator" style=color:#393A34>></span><span class="token punctuation" style=color:#393A34>(</span><span class="token string-literal singleline string" style=color:#e3116c>"example.User"</span><span class="token punctuation" style=color:#393A34>)</span><br/></div></code></pre></div></div>
<p><code>ForyKotlin.builder()</code> installs the Kotlin serializer bootstrap for the Fory
instance. The <code>fory.register&lt;T>(...)</code> extension registers your xlang schema type
name and resolves the generated serializer from the target class.</p>
<p>Do not register or reference generated serializer classes in application code.
Fory resolves them from the registered target class.</p>
<p>Generated Schema IDL modules use the same path. They call
<code>KotlinSerializers.registerType</code>, <code>registerSerializer</code>, <code>registerEnum</code>, and
<code>registerUnion</code> as appropriate and never emit Java files.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=generated-names>Generated Names<a href=#generated-names class=hash-link aria-label="Direct link to Generated Names" title="Direct link to Generated Names" translate=no></a></h2>
<p>The generated serializer is emitted in the same package as the target class.
Its name is <code>&lt;target>_ForySerializer</code>. For nested binary names, <code>$</code> is encoded
as <code>_</code>; source underscores are encoded as <code>_u_</code>.</p>
<p>These names are an implementation detail. They matter for diagnostics and
Android shrinking, but user code should only register target classes.</p>
<p>If a constructor-owned Kotlin xlang struct is registered but its KSP generated
serializer is missing, Fory fails with a configuration error. Compile generated
IDL sources with KSP before registering generated Kotlin classes.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=android-and-r8>Android And R8<a href=#android-and-r8 class=hash-link aria-label="Direct link to Android And R8" title="Direct link to Android And R8" translate=no></a></h2>
<p>Android apps should not need user-written keep rules for generated Kotlin
serializers. KSP emits generated consumer R8/ProGuard rules under
<code>META-INF/proguard/</code> for the generated serializer constructors used by Fory and
the Kotlin metadata needed to detect required Kotlin generated serializers.</p>
<p>For library modules, package the generated <code>META-INF/proguard/</code> resources into
the produced artifact. For Android application modules, make sure your KSP
setup includes generated resources in the minified variant.</p>
<p>See <a class="" href=/docs/guide/kotlin/android_support>Android Support</a> for Android Gradle setup and
release-minified validation guidance.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=native-object-mode>Native Object Mode<a href=#native-object-mode class=hash-link aria-label="Direct link to Native Object Mode" title="Direct link to Native Object Mode" translate=no></a></h2>
<p>Kotlin KSP generated serializers are only for xlang/schema mode. They do not
replace Fory Java native object serializers and do not preserve JVM object graph
identity. If you use Fory with <code>withXlang(false)</code>, Fory uses the normal Java and
Kotlin serializers instead.</p>
<p>Kotlin/Native and Kotlin/JS are not supported by this module.</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/kotlin/static-generated-serializers.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/guide/kotlin/default_values><div class=pagination-nav__sublabel>Previous</div><div class=pagination-nav__label>Default Values</div></a><a class="pagination-nav__link pagination-nav__link--next" href=/docs/guide/kotlin/grpc_support><div class=pagination-nav__sublabel>Next</div><div class=pagination-nav__label>Kotlin gRPC Support</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=#add-ksp class="table-of-contents__link toc-highlight">Add KSP</a><li><a href=#define-a-struct class="table-of-contents__link toc-highlight">Define A Struct</a><li><a href=#supported-structs class="table-of-contents__link toc-highlight">Supported Structs</a><li><a href=#nullability class="table-of-contents__link toc-highlight">Nullability</a><li><a href=#references class="table-of-contents__link toc-highlight">References</a><li><a href=#collections class="table-of-contents__link toc-highlight">Collections</a><li><a href=#dense-arrays class="table-of-contents__link toc-highlight">Dense Arrays</a><li><a href=#integer-encoding class="table-of-contents__link toc-highlight">Integer Encoding</a><li><a href=#duration class="table-of-contents__link toc-highlight">Duration</a><li><a href=#sealed-unions class="table-of-contents__link toc-highlight">Sealed Unions</a><li><a href=#register-classes class="table-of-contents__link toc-highlight">Register Classes</a><li><a href=#generated-names class="table-of-contents__link toc-highlight">Generated Names</a><li><a href=#android-and-r8 class="table-of-contents__link toc-highlight">Android And R8</a><li><a href=#native-object-mode class="table-of-contents__link toc-highlight">Native Object Mode</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>