You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@fury.apache.org by gi...@apache.org on 2024/04/25 04:12:51 UTC
(incubator-fury-site) branch deploy updated: deploy: c2ed9e752babb03c5e8e0f96e801848692afc624
This is an automated email from the ASF dual-hosted git repository.
github-bot pushed a commit to branch deploy
in repository https://gitbox.apache.org/repos/asf/incubator-fury-site.git
The following commit(s) were added to refs/heads/deploy by this push:
new 065bbd5 deploy: c2ed9e752babb03c5e8e0f96e801848692afc624
065bbd5 is described below
commit 065bbd5133c97326f83b676e721a50803f222a07
Author: chaokunyang <ch...@users.noreply.github.com>
AuthorDate: Thu Apr 25 04:12:47 2024 +0000
deploy: c2ed9e752babb03c5e8e0f96e801848692afc624
---
404.html | 4 +-
assets/js/15e9ba00.84dd6c8f.js | 1 +
assets/js/15e9ba00.bd36f707.js | 1 -
assets/js/4df3f445.3d6bee51.js | 1 -
assets/js/65e08b5a.c5a12e50.js | 1 +
assets/js/814f3328.5b2b9681.js | 1 +
assets/js/814f3328.77ff2fe2.js | 1 -
assets/js/88a4406c.d345ebfd.js | 1 -
assets/js/8ce6eebd.b340ce10.js | 1 +
assets/js/8ce6eebd.e8bd123a.js | 1 -
assets/js/aacb1d2b.5ef08377.js | 1 -
assets/js/aacb1d2b.8229e24f.js | 1 +
assets/js/b2f554cd.a01ebcd9.js | 1 +
assets/js/b2f554cd.c0b7a9a6.js | 1 -
assets/js/ba38b13c.c43a1f00.js | 1 +
assets/js/fc69fc3b.6a0f0cea.js | 1 +
assets/js/fc69fc3b.80c55c90.js | 1 -
assets/js/main.4989193f.js | 2 -
assets/js/main.683e6d58.js | 2 +
...js.LICENSE.txt => main.683e6d58.js.LICENSE.txt} | 0
assets/js/runtime~main.1a67ee30.js | 1 +
assets/js/runtime~main.4b29d538.js | 1 -
blog/archive/index.html | 6 +-
blog/atom.xml | 432 ++++++++-------------
blog/fury_0_1_0_release/index.html | 8 +-
blog/fury_0_1_1_release/index.html | 6 +-
blog/fury_0_1_2_release/index.html | 6 +-
blog/fury_0_2_0_release/index.html | 6 +-
blog/fury_0_2_1_release/index.html | 6 +-
blog/fury_0_3_0_release/index.html | 6 +-
blog/fury_0_3_1_release/index.html | 6 +-
blog/fury_0_4_0_release/index.html | 6 +-
blog/fury_0_4_1_release/index.html | 8 +-
.../index.html | 296 +++++---------
blog/index.html | 8 +-
blog/rss.xml | 424 ++++++++------------
blog/tags/fury/index.html | 8 +-
blog/tags/index.html | 6 +-
docs/download/index.html | 4 +-
docs/guide/development/index.html | 4 +-
docs/guide/graalvm_guide/index.html | 4 +-
docs/guide/java_object_graph_guide/index.html | 4 +-
docs/guide/row_format_guide/index.html | 4 +-
docs/guide/scala_guide/index.html | 4 +-
docs/guide/xlang_object_graph_guide/index.html | 4 +-
docs/guide/xlang_type_mapping/index.html | 4 +-
docs/introduction/benchmark/index.html | 4 +-
docs/introduction/features/index.html | 4 +-
docs/introduction/index.html | 4 +-
.../fury_java_serialization_spec/index.html | 4 +-
docs/specification/fury_row_format_spec/index.html | 4 +-
.../fury_xlang_serialization_spec/index.html | 4 +-
docs/start/install/index.html | 4 +-
docs/start/usage/index.html | 4 +-
index.html | 4 +-
lunr-index-1714013962251.json | 1 -
lunr-index-1714018338519.json | 1 +
lunr-index.json | 2 +-
markdown-page/index.html | 4 +-
search-doc-1714013962251.json | 1 -
search-doc-1714018338519.json | 1 +
search-doc.json | 2 +-
62 files changed, 513 insertions(+), 831 deletions(-)
diff --git a/404.html b/404.html
index b0e470a..b8a35a3 100644
--- a/404.html
+++ b/404.html
@@ -5,8 +5,8 @@
<meta name="generator" content="Docusaurus v3.0.1">
<title data-rh="true">Page Not Found | Apache Fury (incubating)</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://fury.apache.org/404.html"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docusaurus_tag" content="default"><meta data- [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache Fury (incubating) Atom Feed"><link rel="stylesheet" href="/assets/css/styles.d3c1e154.css">
-<script src="/assets/js/runtime~main.4b29d538.js" defer="defer"></script>
-<script src="/assets/js/main.4989193f.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.1a67ee30.js" defer="defer"></script>
+<script src="/assets/js/main.683e6d58.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/assets/js/15e9ba00.84dd6c8f.js b/assets/js/15e9ba00.84dd6c8f.js
new file mode 100644
index 0000000..c474cfd
--- /dev/null
+++ b/assets/js/15e9ba00.84dd6c8f.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkfury_site=self.webpackChunkfury_site||[]).push([[3994],{3622:(a,i,l)=>{l.r(i),l.d(i,{assets:()=>p,contentTitle:()=>n,default:()=>y,frontMatter:()=>u,metadata:()=>r,toc:()=>s});var t=l(5893),h=l(1151);const u={slug:"fury_0_1_0_release",title:"Fury v0.1.0 released",authors:["chaokunyang"],tags:["fury"]},n="Fury v0.1.0 released",r={permalink:"/blog/fury_0_1_0_release",source:"@site/blog/2023-07-15-fury_0_1_0_release.md",title:"Fury v0.1.0 released",description [...]
\ No newline at end of file
diff --git a/assets/js/15e9ba00.bd36f707.js b/assets/js/15e9ba00.bd36f707.js
deleted file mode 100644
index 3dd6a91..0000000
--- a/assets/js/15e9ba00.bd36f707.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkfury_site=self.webpackChunkfury_site||[]).push([[3994],{3622:(a,i,l)=>{l.r(i),l.d(i,{assets:()=>p,contentTitle:()=>n,default:()=>y,frontMatter:()=>u,metadata:()=>r,toc:()=>s});var t=l(5893),h=l(1151);const u={slug:"fury_0_1_0_release",title:"Fury v0.1.0 released",authors:["chaokunyang"],tags:["fury"]},n="Fury v0.1.0 released",r={permalink:"/blog/fury_0_1_0_release",source:"@site/blog/2023-07-15-fury_0_1_0_release.md",title:"Fury v0.1.0 released",description [...]
\ No newline at end of file
diff --git a/assets/js/4df3f445.3d6bee51.js b/assets/js/4df3f445.3d6bee51.js
deleted file mode 100644
index 6d74b8d..0000000
--- a/assets/js/4df3f445.3d6bee51.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkfury_site=self.webpackChunkfury_site||[]).push([[1264],{1063:(a,e,t)=>{t.r(e),t.d(e,{assets:()=>l,contentTitle:()=>i,default:()=>p,frontMatter:()=>o,metadata:()=>u,toc:()=>s});var n=t(5893),r=t(1151);const o={slug:"fury_blazing_fast_multiple_language_serialization_framework",title:"Fury - A blazing fast multi-language serialization framework powered by jit and zero-copy",authors:["chaokunyang"],tags:["fury"]},i=void 0,u={permalink:"/blog/fury_blazing_fast_m [...]
\ No newline at end of file
diff --git a/assets/js/65e08b5a.c5a12e50.js b/assets/js/65e08b5a.c5a12e50.js
new file mode 100644
index 0000000..98b4103
--- /dev/null
+++ b/assets/js/65e08b5a.c5a12e50.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkfury_site=self.webpackChunkfury_site||[]).push([[6714],{9519:(e,i,a)=>{a.r(i),a.d(i,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>t,metadata:()=>s,toc:()=>c});var n=a(5893),r=a(1151);const t={slug:"fury_blazing_fast_multiple_language_serialization_framework",title:"Apache Fury: A blazing fast multi-language serialization framework powered by JIT and zero-copy",authors:["chaokunyang"],tags:["fury"]},o=void 0,s={permalink:"/blog/fury_blazing_ [...]
\ No newline at end of file
diff --git a/assets/js/814f3328.5b2b9681.js b/assets/js/814f3328.5b2b9681.js
new file mode 100644
index 0000000..be4730c
--- /dev/null
+++ b/assets/js/814f3328.5b2b9681.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkfury_site=self.webpackChunkfury_site||[]).push([[2535],{5641:e=>{e.exports=JSON.parse('{"title":"All our posts","items":[{"title":"Apache Fury: A blazing fast multi-language serialization framework powered by JIT and zero-copy","permalink":"/blog/fury_blazing_fast_multiple_language_serialization_framework","unlisted":false},{"title":"Fury 0.4.1 Released","permalink":"/blog/fury_0_4_1_release","unlisted":false},{"title":"Fury 0.4.0 Released","permalink":"/bl [...]
\ No newline at end of file
diff --git a/assets/js/814f3328.77ff2fe2.js b/assets/js/814f3328.77ff2fe2.js
deleted file mode 100644
index 8afac5d..0000000
--- a/assets/js/814f3328.77ff2fe2.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkfury_site=self.webpackChunkfury_site||[]).push([[2535],{5641:e=>{e.exports=JSON.parse('{"title":"All our posts","items":[{"title":"Fury 0.4.1 Released","permalink":"/blog/fury_0_4_1_release","unlisted":false},{"title":"Fury 0.4.0 Released","permalink":"/blog/fury_0_4_0_release","unlisted":false},{"title":"Fury v0.3.1 released","permalink":"/blog/fury_0_3_1_release","unlisted":false},{"title":"Fury v0.3.0 released","permalink":"/blog/fury_0_3_0_release","unl [...]
\ No newline at end of file
diff --git a/assets/js/88a4406c.d345ebfd.js b/assets/js/88a4406c.d345ebfd.js
deleted file mode 100644
index ca44cc6..0000000
--- a/assets/js/88a4406c.d345ebfd.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkfury_site=self.webpackChunkfury_site||[]).push([[2766],{5107:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>l,contentTitle:()=>s,default:()=>h,frontMatter:()=>t,metadata:()=>o,toc:()=>c});var a=n(5893),r=n(1151);const t={slug:"fury_blazing_fast_multiple_language_serialization_framework",title:"Fury - A blazing fast multi-language serialization framework powered by jit and zero-copy",authors:["chaokunyang"],tags:["fury"]},s="Fury - A blazing fast multi-language serializ [...]
\ No newline at end of file
diff --git a/assets/js/8ce6eebd.b340ce10.js b/assets/js/8ce6eebd.b340ce10.js
new file mode 100644
index 0000000..dac9d87
--- /dev/null
+++ b/assets/js/8ce6eebd.b340ce10.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkfury_site=self.webpackChunkfury_site||[]).push([[4742],{3772:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>i,contentTitle:()=>s,default:()=>h,frontMatter:()=>o,metadata:()=>u,toc:()=>l});var r=a(5893),n=a(1151);const o={slug:"fury_0_4_1_release",title:"Fury 0.4.1 Released",authors:["chaokunyang"],tags:["fury"]},s=void 0,u={permalink:"/blog/fury_0_4_1_release",source:"@site/blog/2023-12-09-fury_0_4_1_release.md",title:"Fury 0.4.1 Released",description:"This release was [...]
\ No newline at end of file
diff --git a/assets/js/8ce6eebd.e8bd123a.js b/assets/js/8ce6eebd.e8bd123a.js
deleted file mode 100644
index 2734d3d..0000000
--- a/assets/js/8ce6eebd.e8bd123a.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkfury_site=self.webpackChunkfury_site||[]).push([[4742],{3772:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>i,contentTitle:()=>o,default:()=>h,frontMatter:()=>s,metadata:()=>u,toc:()=>l});var n=a(5893),r=a(1151);const s={slug:"fury_0_4_1_release",title:"Fury 0.4.1 Released",authors:["chaokunyang"],tags:["fury"]},o=void 0,u={permalink:"/blog/fury_0_4_1_release",source:"@site/blog/2023-12-09-fury_0_4_1_release.md",title:"Fury 0.4.1 Released",description:"This release was [...]
\ No newline at end of file
diff --git a/assets/js/aacb1d2b.5ef08377.js b/assets/js/aacb1d2b.5ef08377.js
deleted file mode 100644
index 914ac56..0000000
--- a/assets/js/aacb1d2b.5ef08377.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkfury_site=self.webpackChunkfury_site||[]).push([[7382],{313:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>h,contentTitle:()=>n,default:()=>c,frontMatter:()=>l,metadata:()=>s,toc:()=>u});var a=r(5893),i=r(1151);const l={slug:"fury_0_4_1_release",title:"Fury 0.4.1 Released",authors:["chaokunyang"],tags:["fury"]},n="Fury v0.4.1 released",s={permalink:"/blog/fury_0_4_1_release",source:"@site/blog/2023-12-09-fury_0_4_1_release.md",title:"Fury 0.4.1 Released",description:"T [...]
\ No newline at end of file
diff --git a/assets/js/aacb1d2b.8229e24f.js b/assets/js/aacb1d2b.8229e24f.js
new file mode 100644
index 0000000..736a9cb
--- /dev/null
+++ b/assets/js/aacb1d2b.8229e24f.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkfury_site=self.webpackChunkfury_site||[]).push([[7382],{313:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>h,contentTitle:()=>n,default:()=>p,frontMatter:()=>l,metadata:()=>s,toc:()=>u});var a=r(5893),i=r(1151);const l={slug:"fury_0_4_1_release",title:"Fury 0.4.1 Released",authors:["chaokunyang"],tags:["fury"]},n="Fury v0.4.1 released",s={permalink:"/blog/fury_0_4_1_release",source:"@site/blog/2023-12-09-fury_0_4_1_release.md",title:"Fury 0.4.1 Released",description:"T [...]
\ No newline at end of file
diff --git a/assets/js/b2f554cd.a01ebcd9.js b/assets/js/b2f554cd.a01ebcd9.js
new file mode 100644
index 0000000..bddfde4
--- /dev/null
+++ b/assets/js/b2f554cd.a01ebcd9.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkfury_site=self.webpackChunkfury_site||[]).push([[1477],{10:a=>{a.exports=JSON.parse('{"blogPosts":[{"id":"fury_blazing_fast_multiple_language_serialization_framework","metadata":{"permalink":"/blog/fury_blazing_fast_multiple_language_serialization_framework","source":"@site/blog/2024-04-25-fury_blazing_fast_multiple_language_serialization_framework.md","title":"Apache Fury: A blazing fast multi-language serialization framework powered by JIT and zero-copy", [...]
\ No newline at end of file
diff --git a/assets/js/b2f554cd.c0b7a9a6.js b/assets/js/b2f554cd.c0b7a9a6.js
deleted file mode 100644
index 9d23de3..0000000
--- a/assets/js/b2f554cd.c0b7a9a6.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkfury_site=self.webpackChunkfury_site||[]).push([[1477],{10:a=>{a.exports=JSON.parse('{"blogPosts":[{"id":"fury_0_4_1_release","metadata":{"permalink":"/blog/fury_0_4_1_release","source":"@site/blog/2023-12-09-fury_0_4_1_release.md","title":"Fury 0.4.1 Released","description":"This release was made before Fury joined the Apache Incubator and thus it\'s a non-ASF release.","date":"2023-12-09T00:00:00.000Z","formattedDate":"December 9, 2023","tags":[{"label":" [...]
\ No newline at end of file
diff --git a/assets/js/ba38b13c.c43a1f00.js b/assets/js/ba38b13c.c43a1f00.js
new file mode 100644
index 0000000..9ffb17f
--- /dev/null
+++ b/assets/js/ba38b13c.c43a1f00.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkfury_site=self.webpackChunkfury_site||[]).push([[8065],{8229:(a,e,t)=>{t.r(e),t.d(e,{assets:()=>l,contentTitle:()=>o,default:()=>g,frontMatter:()=>r,metadata:()=>u,toc:()=>s});var n=t(5893),i=t(1151);const r={slug:"fury_blazing_fast_multiple_language_serialization_framework",title:"Apache Fury: A blazing fast multi-language serialization framework powered by JIT and zero-copy",authors:["chaokunyang"],tags:["fury"]},o=void 0,u={permalink:"/blog/fury_blazing_ [...]
\ No newline at end of file
diff --git a/assets/js/fc69fc3b.6a0f0cea.js b/assets/js/fc69fc3b.6a0f0cea.js
new file mode 100644
index 0000000..d308e54
--- /dev/null
+++ b/assets/js/fc69fc3b.6a0f0cea.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkfury_site=self.webpackChunkfury_site||[]).push([[9158],{2464:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>o,default:()=>d,frontMatter:()=>s,metadata:()=>u,toc:()=>l});var r=n(5893),a=n(1151);const s={slug:"fury_0_1_0_release",title:"Fury v0.1.0 released",authors:["chaokunyang"],tags:["fury"]},o=void 0,u={permalink:"/blog/fury_0_1_0_release",source:"@site/blog/2023-07-15-fury_0_1_0_release.md",title:"Fury v0.1.0 released",description:"This release w [...]
\ No newline at end of file
diff --git a/assets/js/fc69fc3b.80c55c90.js b/assets/js/fc69fc3b.80c55c90.js
deleted file mode 100644
index 66d0060..0000000
--- a/assets/js/fc69fc3b.80c55c90.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkfury_site=self.webpackChunkfury_site||[]).push([[9158],{2464:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>s,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>l});var a=n(5893),r=n(1151);const o={slug:"fury_0_1_0_release",title:"Fury v0.1.0 released",authors:["chaokunyang"],tags:["fury"]},s=void 0,i={permalink:"/blog/fury_0_1_0_release",source:"@site/blog/2023-07-15-fury_0_1_0_release.md",title:"Fury v0.1.0 released",description:"This release w [...]
\ No newline at end of file
diff --git a/assets/js/main.4989193f.js b/assets/js/main.4989193f.js
deleted file mode 100644
index 6048297..0000000
--- a/assets/js/main.4989193f.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/*! For license information please see main.4989193f.js.LICENSE.txt */
-(self.webpackChunkfury_site=self.webpackChunkfury_site||[]).push([[179],{723:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});n(7294);var r=n(8356),a=n.n(r),o=n(6887);const i={"01a85c17":[()=>Promise.all([n.e(532),n.e(4013)]).then(n.bind(n,1223)),"@theme/BlogTagsListPage",1223],"061c795b":[()=>n.e(6624).then(n.bind(n,1582)),"@site/blog/2023-09-27-fury_0_1_2_release.md",1582],"092604a4":[()=>n.e(5088).then(n.bind(n,45)),"@site/docs/introduction/benchmark.md",45],"11627f87":[()=>n.e(9533).then(n.bi [...]
\ No newline at end of file
diff --git a/assets/js/main.683e6d58.js b/assets/js/main.683e6d58.js
new file mode 100644
index 0000000..5ea368b
--- /dev/null
+++ b/assets/js/main.683e6d58.js
@@ -0,0 +1,2 @@
+/*! For license information please see main.683e6d58.js.LICENSE.txt */
+(self.webpackChunkfury_site=self.webpackChunkfury_site||[]).push([[179],{723:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});n(7294);var r=n(8356),a=n.n(r),o=n(6887);const i={"01a85c17":[()=>Promise.all([n.e(532),n.e(4013)]).then(n.bind(n,1223)),"@theme/BlogTagsListPage",1223],"061c795b":[()=>n.e(6624).then(n.bind(n,1582)),"@site/blog/2023-09-27-fury_0_1_2_release.md",1582],"092604a4":[()=>n.e(5088).then(n.bind(n,45)),"@site/docs/introduction/benchmark.md",45],"11627f87":[()=>n.e(9533).then(n.bi [...]
\ No newline at end of file
diff --git a/assets/js/main.4989193f.js.LICENSE.txt b/assets/js/main.683e6d58.js.LICENSE.txt
similarity index 100%
rename from assets/js/main.4989193f.js.LICENSE.txt
rename to assets/js/main.683e6d58.js.LICENSE.txt
diff --git a/assets/js/runtime~main.1a67ee30.js b/assets/js/runtime~main.1a67ee30.js
new file mode 100644
index 0000000..b3507fe
--- /dev/null
+++ b/assets/js/runtime~main.1a67ee30.js
@@ -0,0 +1 @@
+(()=>{"use strict";var e,a,f,c,b,t={},r={};function d(e){var a=r[e];if(void 0!==a)return a.exports;var f=r[e]={exports:{}};return t[e].call(f.exports,f,f.exports,d),f.exports}d.m=t,e=[],d.O=(a,f,c,b)=>{if(!f){var t=1/0;for(i=0;i<e.length;i++){f=e[i][0],c=e[i][1],b=e[i][2];for(var r=!0,o=0;o<f.length;o++)(!1&b||t>=b)&&Object.keys(d.O).every((e=>d.O[e](f[o])))?f.splice(o--,1):(r=!1,b<t&&(t=b));if(r){e.splice(i--,1);var n=c();void 0!==n&&(a=n)}}return a}b=b||0;for(var i=e.length;i>0&&e[i-1] [...]
\ No newline at end of file
diff --git a/assets/js/runtime~main.4b29d538.js b/assets/js/runtime~main.4b29d538.js
deleted file mode 100644
index 003832c..0000000
--- a/assets/js/runtime~main.4b29d538.js
+++ /dev/null
@@ -1 +0,0 @@
-(()=>{"use strict";var e,a,f,c,b,t={},r={};function d(e){var a=r[e];if(void 0!==a)return a.exports;var f=r[e]={exports:{}};return t[e].call(f.exports,f,f.exports,d),f.exports}d.m=t,e=[],d.O=(a,f,c,b)=>{if(!f){var t=1/0;for(i=0;i<e.length;i++){f=e[i][0],c=e[i][1],b=e[i][2];for(var r=!0,o=0;o<f.length;o++)(!1&b||t>=b)&&Object.keys(d.O).every((e=>d.O[e](f[o])))?f.splice(o--,1):(r=!1,b<t&&(t=b));if(r){e.splice(i--,1);var n=c();void 0!==n&&(a=n)}}return a}b=b||0;for(var i=e.length;i>0&&e[i-1] [...]
\ No newline at end of file
diff --git a/blog/archive/index.html b/blog/archive/index.html
index ed72f9e..16893d1 100644
--- a/blog/archive/index.html
+++ b/blog/archive/index.html
@@ -5,11 +5,11 @@
<meta name="generator" content="Docusaurus v3.0.1">
<title data-rh="true">Archive | Apache Fury (incubating)</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://fury.apache.org/blog/archive"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docusaurus_tag" content="default"><meta data-rh= [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache Fury (incubating) Atom Feed"><link rel="stylesheet" href="/assets/css/styles.d3c1e154.css">
-<script src="/assets/js/runtime~main.4b29d538.js" defer="defer"></script>
-<script src="/assets/js/main.4989193f.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.1a67ee30.js" defer="defer"></script>
+<script src="/assets/js/main.683e6d58.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
-<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
<p> Apache Fury is an effort undergoing incubation at The Apache Software Foundation (ASF), sponsored by the Apache Incubator. Incubation is required of all newly accepted projects until a further review indicates that the infrastructure, communications, and decision making process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the [...]
<p>
Copyright © 2024 The Apache Software Foundation, Licensed under the Apache License, Version 2.0. <br>
diff --git a/blog/atom.xml b/blog/atom.xml
index 0794a18..0edaca8 100644
--- a/blog/atom.xml
+++ b/blog/atom.xml
@@ -2,11 +2,173 @@
<feed xmlns="http://www.w3.org/2005/Atom">
<id>https://fury.apache.org/blog</id>
<title>Apache Fury (incubating) Blog</title>
- <updated>2023-12-09T00:00:00.000Z</updated>
+ <updated>2024-04-25T00:00:00.000Z</updated>
<generator>https://github.com/jpmonette/feed</generator>
<link rel="alternate" href="https://fury.apache.org/blog"/>
<subtitle>Apache Fury (incubating) Blog</subtitle>
<icon>https://fury.apache.org/img/favicon.ico</icon>
+ <entry>
+ <title type="html"><![CDATA[Apache Fury: A blazing fast multi-language serialization framework powered by JIT and zero-copy]]></title>
+ <id>https://fury.apache.org/blog/fury_blazing_fast_multiple_language_serialization_framework</id>
+ <link href="https://fury.apache.org/blog/fury_blazing_fast_multiple_language_serialization_framework"/>
+ <updated>2024-04-25T00:00:00.000Z</updated>
+ <summary type="html"><![CDATA[Apache Fury (incubating) is a multi-language serialization framework powered by JIT dynamic compilation and zero copy. It implements multi-language SDKs: Java, Python, Golang, JavaScript, Rust, C++. It provides automatic multi-language objects serialization features, and 170x speedup compared to JDK serialization.]]></summary>
+ <content type="html"><![CDATA[<p>Apache Fury (incubating) is a multi-language serialization framework powered by JIT dynamic compilation and zero copy. It implements multi-language SDKs: Java, Python, Golang, JavaScript, Rust, C++. It provides automatic multi-language objects serialization features, and 170x speedup compared to JDK serialization.</p>
+<p>The GitHub address of fury repository is: <a href="https://github.com/apache/incubator-fury" target="_blank" rel="noopener noreferrer">https://github.com/apache/incubator-fury</a></p>
+<img alt="fury banner" src="https://fury.apache.org/img/fury_banner.png">
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="background">Background<a href="https://fury.apache.org/blog/fury_blazing_fast_multiple_language_serialization_framework#background" class="hash-link" aria-label="Direct link to Background" title="Direct link to Background"></a></h2>
+<p>Serialization is a basic component of system communication, and widely used in big data, AI framework, cloud native and other distributed systems. <strong>Data transfer between processes, languages, nodes, or object persistence, state read-write and copy</strong>, all need serialization. The performance and ease-of-use of serialization affects <strong>runtime and development efficiency</strong> of the system.</p>
+<p>Static serialization frameworks like <a href="https://github.com/protocolbuffers/protobuf" target="_blank" rel="noopener noreferrer">Protobuf</a> or <a href="https://github.com/google/flatbuffers" target="_blank" rel="noopener noreferrer">FlatBuffers</a> cannot be used for cross-language <a href="https://en.wikipedia.org/wiki/Domain-driven_design" target="_blank" rel="noopener noreferrer">application development</a> directly, because they <strong>don't support shared reference and pol [...]
+<p>Dynamic serialization frameworks such as JDK serialization, Kryo, Fst, Hessian, Pickle provide ease-of-use and dynamics, but <strong>don't support cross-language</strong> and suffer significant <strong>performance issues</strong>, which is unsuitable for high throughput, low latency, and large-scale data transfer scenarios.</p>
+<p>Therefore, we developed a new multi-language serialization framework <strong>Apache Fury</strong>, which is open-sourced on <a href="https://github.com/apache/incubator-fury" target="_blank" rel="noopener noreferrer">https://github.com/apache/incubator-fury</a>. Through <strong>highly optimized serialization primitives, JIT dynamic compilation and zero-copy</strong> technologies, Fury is both fast and easy-to-use. It can <strong>cross-language serialize any object automatically</stron [...]
+<p><img width="44%" alt="serialization" src="https://fury.apache.org/img/case1.png"><img width="44%" alt="deserialization" src="https://fury.apache.org/img/case2.png"></p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-is-apache-fury">What is Apache Fury?<a href="https://fury.apache.org/blog/fury_blazing_fast_multiple_language_serialization_framework#what-is-apache-fury" class="hash-link" aria-label="Direct link to What is Apache Fury?" title="Direct link to What is Apache Fury?"></a></h2>
+<p>Apache Fury is a multi-language serialization framework powered by JIT dynamic compilation and zero copy, providing blazing
+fast speed and ease of use:</p>
+<ul>
+<li><strong>Multiple languages</strong>: Java, Python, C++, Golang, JavaScript, Rust. Other languages can be added easily.</li>
+<li><strong>Highly optimized serialization primitives</strong>.</li>
+<li><strong>Zero-copy</strong>: Support <a href="https://peps.python.org/pep-0574/" target="_blank" rel="noopener noreferrer">out-of-band</a> serialization and off-heap read/write.</li>
+<li><strong>High performance</strong>: Use JIT to generate serialization code at runtime in an async multithreaded way, which can optimize methods inlining, code cache, dead code elimination, hash lookup, meta writing and memory read/write.</li>
+<li><strong>Multi protocols</strong>: Provide flexibility and ease of use of dynamic serialization, as well as the cross-language of static serialization.<!-- -->
+<ul>
+<li><strong>Java Serialization</strong>:<!-- -->
+<ul>
+<li>Drop-in replaces JDK, Kryo, and Hessian. No need to modify user code, but providing 170x speed up at most, which can improve efficiency of rpc, data transfer and object persistence significantly.</li>
+<li>100% JDK compatible, support JDK custom serialization methods <code>writeObject</code>, <code>readObject</code>, <code>writeReplace</code>, <code>readResolve</code>, <code>readObjectNoData</code> natively.</li>
+</ul>
+</li>
+<li><strong>Cross-language object graph</strong>:<!-- -->
+<ul>
+<li>Cross-language serialize any objects automatically, no need for IDL, schema compilation, and object/protocol conversion.</li>
+<li>Cross-language serialize shared/circular reference, no data duplication or recursion error.</li>
+<li>Support object polymorphism, multiple children type objects can be serialized simultaneously.</li>
+</ul>
+</li>
+<li><strong>Row format</strong>
+<ul>
+<li>A cache-friendly binary random-access format, supports skipping deserialization and lazy deserialization, efficient for high-performance computing and large-scale data transfer.</li>
+<li>Support automatic conversion to Apache Arrow.</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="core-serialization-capabilities">Core Serialization Capabilities<a href="https://fury.apache.org/blog/fury_blazing_fast_multiple_language_serialization_framework#core-serialization-capabilities" class="hash-link" aria-label="Direct link to Core Serialization Capabilities" title="Direct link to Core Serialization Capabilities"></a></h2>
+<p>Although different scenarios require different serialization protocols, the underlying operations of serialization are
+similar.</p>
+<p>Therefore, Fury defines and implements <strong>a set of basic serialization capabilities</strong>, which can be used for quickly building new multi-language serialization protocols and get speedup by JIT acceleration and other optimizations.</p>
+<p>At the same time, performance optimization for a protocol on the primitives can also benefit all other protocols.</p>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" id="serialization-primitives">Serialization Primitives<a href="https://fury.apache.org/blog/fury_blazing_fast_multiple_language_serialization_framework#serialization-primitives" class="hash-link" aria-label="Direct link to Serialization Primitives" title="Direct link to Serialization Primitives"></a></h3>
+<p>Common serialization operations contains:</p>
+<ul>
+<li>Bitmap operations</li>
+<li>Number encoding and decoding</li>
+<li>Compression for int and long</li>
+<li>String creation and copy</li>
+<li>String encoding: ASCII, UTF8, UTF16</li>
+<li>Memory copy</li>
+<li>Array copy and compression</li>
+<li>Meta encoding, compression, and cache</li>
+</ul>
+<p>Fury use SIMD and other advanced language features to make basic operations extremely fast in every languages.</p>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" id="zero-copy-serialization">Zero-copy Serialization<a href="https://fury.apache.org/blog/fury_blazing_fast_multiple_language_serialization_framework#zero-copy-serialization" class="hash-link" aria-label="Direct link to Zero-copy Serialization" title="Direct link to Zero-copy Serialization"></a></h3>
+<p>Large-scale data transfer often has multiple binary buffers in an object graph. Some serialization frameworks will write the binaries into an intermediate buffer and introduce multiple time-consuming memory copies. Fury implemented an <strong>out-of-band serialization protocol</strong> inspired by <a href="https://peps.python.org/pep-0574/" target="_blank" rel="noopener noreferrer">pickle5</a>, Ray and Apache Arrow, which can <strong>capture all binary buffers</strong> in an object gr [...]
+<p>The following figure shows the serialization process of zero-copy:</p>
+<img alt="fury zero copy" src="https://fury.apache.org/img/fury_zero_copy.jpeg">
+<p>Currently, Fury supports the following types of zero-copy:</p>
+<ul>
+<li>Java: all basic types of arrays, <code>ByteBuffer</code>, <code>ArrowRecordBatch</code>, and <code>VectorSchemaRoot</code></li>
+<li>Python: all arrays of the array module, numpy arrays, <code>pyarrow.Table</code>, and <code>pyarrow.RecordBatch</code></li>
+<li>Golang: byte slice</li>
+</ul>
+<p>You can also add the new zero copy type based on the Fury interface.</p>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" id="jit-dynamic-compilation-acceleration">JIT dynamic compilation acceleration<a href="https://fury.apache.org/blog/fury_blazing_fast_multiple_language_serialization_framework#jit-dynamic-compilation-acceleration" class="hash-link" aria-label="Direct link to JIT dynamic compilation acceleration" title="Direct link to JIT dynamic compilation acceleration"></a></h3>
+<p>Custom type objects usually contain lots of type information, Fury used this information to generate efficient serialization code at runtime, which can push lots of runtime operations into the dynamic compilation stage. By inlining more methods, better code cache, reducing virtual method calls, conditional branches, hash lookup, metadata writes, and memory reads/writes, the serialization performance is greatly accelerated.</p>
+<p>For Java, Fury implements a <strong>runtime codegen framework</strong> and defines an <a href="https://en.wikipedia.org/wiki/Intermediate_representation" target="_blank" rel="noopener noreferrer">operator expression IR</a>. Then fury can perform type inference based on the generic type information of the object at runtime to build an expression tree that describes the logic of serialized code.</p>
+<p>The codegen framework will generate efficient Java code from the expression tree, then pass to <a href="https://github.com/janino-compiler/janino" target="_blank" rel="noopener noreferrer">Janino</a> to compile it into bytecode, and load it into the user's ClassLoader or the ClassLoader created by Fury, and finally compile it into efficient assembly code through Java JIT.</p>
+<p>Since JVM JIT skips Big method compilation and inlining, Fury also implements an optimizer to <strong>split big methods into small methods recursively</strong>, thus ensuring that all code can be compiled and inlined.</p>
+<img alt="fury java codegen" src="https://fury.apache.org/img/fury_java_codegen.png">
+<p>Fury also supports <strong>asynchronous multithreaded compilation</strong> by running the codegen tasks in a thread pool, and using interpretation mode until JIT finishes to ensure no serialization burrs. Users can skip warm up serialization of objects.</p>
+<p>Python and JavaScript codegen are similar. Generating source code is easier for development and troubleshooting problems.</p>
+<p>Since serialization will manipulate objects extensively in each programming language, and the language does not expose the low-level API of the memory model, native methods call has a large cost too, so we cannot use <a href="https://www.llvm.org/" target="_blank" rel="noopener noreferrer">LLVM</a> to build a unified serializer JIT framework. Instead, we implemented a codegen framework for every language separately.</p>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" id="static-code-generation">Static code generation<a href="https://fury.apache.org/blog/fury_blazing_fast_multiple_language_serialization_framework#static-code-generation" class="hash-link" aria-label="Direct link to Static code generation" title="Direct link to Static code generation"></a></h3>
+<p>Although JIT compilation can greatly improve serialization efficiency and generate better serialization code based on the statistical distribution of data at runtime, languages like C++ do not support reflection, have no virtual machines, and no low-level API for memory models. We cannot generate serialization code dynamically for such languages through JIT.</p>
+<p>In such scenarios, Fury is implementing an <strong>AOT codegen framework</strong>, which generates the serialized code statically according to the object schema, and objects can be serialized automatically using the generated serializer. For Rust, Rust macro is used to generate code statically.</p>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" id="cache-optimization">Cache optimization<a href="https://fury.apache.org/blog/fury_blazing_fast_multiple_language_serialization_framework#cache-optimization" class="hash-link" aria-label="Direct link to Cache optimization" title="Direct link to Cache optimization"></a></h3>
+<p>When serializing a custom type, fury will <strong>reorder fields</strong> to ensure that fields of the same type are serialized in order. This can hit more data cache and CPU instruction cache.</p>
+<p>The basic type fields are written <strong>in descending order by byte size</strong>. In this way, if the initial addresses are aligned, subsequent read and write operations will occur at the position where the memory addresses are aligned, making CPU execution more efficient.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="multi-protocol-design-and-implementation">Multi-protocol Design and Implementation<a href="https://fury.apache.org/blog/fury_blazing_fast_multiple_language_serialization_framework#multi-protocol-design-and-implementation" class="hash-link" aria-label="Direct link to Multi-protocol Design and Implementation" title="Direct link to Multi-protocol Design and Implementation"></a></h2>
+<p>Based on the multi-language serialization features provided by Fury core, we have built three serialization protocols for different scenarios:</p>
+<ul>
+<li><strong>Java serialization</strong>: Suitable for pure Java serialization scenarios and provides up to 170x speed up;</li>
+<li><strong>Cross-language object graph serialization</strong>: Suitable for application-oriented multi-language programming and
+high-performance cross-language serialization;</li>
+<li><strong>Row-format serialization</strong>: Suitable for distributed computing engines such as Apache Spark, Apache Flink, Apache Doris, Velox, and features frameworks.</li>
+</ul>
+<p>In the future, we will add new protocols for other core scenarios. Users can also build their own protocols based on Fury's serialization framework.</p>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" id="java-serialization">Java serialization<a href="https://fury.apache.org/blog/fury_blazing_fast_multiple_language_serialization_framework#java-serialization" class="hash-link" aria-label="Direct link to Java serialization" title="Direct link to Java serialization"></a></h3>
+<p>Java is widely used in <strong>big data, cloud native, microservices, and enterprise applications</strong>. Therefore, Fury made lots of optimizations for Java serialization, which reduces system latency and server costs a lot, and improves throughput significantly. Our implementation has the following highlights:</p>
+<ul>
+<li>Blazing fast performance: Based on Java types, JIT compilation and Unsafe low-level operations, <strong>Fury is 170x faster than JDK, and 50~110x faster than Kryo/Hessian</strong> at most.</li>
+<li><strong>100% JDK serialization API compatibility</strong> : Supports all JDK custom serialization methods <code>writeObject</code>, <code>readObject</code>, <code>writeReplace</code>, <code>readResolve</code>, <code>readObjectNoData</code> natively to ensure the serialization correctness in any scenario. Kryo and Hessian have some correctness issues in these scenarios.</li>
+<li><strong>Type compatibility</strong>: When the deserialization and serialization class schema are inconsistent, it can still deserialize correctly. It supports application upgrade and deployment, add/delete fields independently. Fury type-compatible mode is implemented with no performance loss compared to type-consistent mode.</li>
+<li><strong>Metadata sharing</strong> : share metadata(class name, field name&type, etc.) across multiple serializations under a context (TCP connection), meta will be sent to the peer only for the first serialization, the peer can reconstruct the same deserializer based on this information. Subsequent serialization will skip transferring metadata, which can reduce network traffic, and support type compatibility automatically.</li>
+<li><strong>Zero-copy support</strong>: supports out-of-band zero copy and off-heap memory read and write.</li>
+</ul>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" id="cross-language-object-graph-serialization">Cross-language object graph serialization<a href="https://fury.apache.org/blog/fury_blazing_fast_multiple_language_serialization_framework#cross-language-object-graph-serialization" class="hash-link" aria-label="Direct link to Cross-language object graph serialization" title="Direct link to Cross-language object graph serialization"></a></h3>
+<p>Fury cross-language object graph serialization is primarily used for scenarios that require higher dynamics and ease-of-use.</p>
+<p>Although frameworks like Protobuf or FlatBuffers support cross-language serialization, they still have limitations:</p>
+<ul>
+<li>They require <strong>pre-defined IDLs and generate code statically ahead</strong>, lacking sufficient dynamics and flexibility;</li>
+<li>The generated classes <strong>don't conform to object-oriented design</strong> and it's impossible to add behavior to classes, which make them unsuitable for use as domain objects in cross-language application development.</li>
+<li>They <strong>don't support polymorphism</strong>. Object-oriented programming uses interfaces to invoke subclass methods, but this pattern isn't supported well in those frameworks. Although FlatBuffers offers <code>Union</code>, and Protobuf provides <code>OneOf/Any</code>, those API require check object type during serialization and deserialization, which isn't polymorphic.</li>
+<li>They <strong>don't support circular references and shared references</strong>. Users need to define a set of IDLs for domain objects
+and implement reference resolution by themselves, as well as writing code to convert between domain objects and protocol objects in each language. If the object graph depth is deep, more code needs to be written.</li>
+</ul>
+<p>Due to the above limitations, Fury implemented a cross-language object graph serialization protocol that:</p>
+<ul>
+<li><strong>Automatically serializes any object across multiple languages</strong>: By defining classes in the serialization and deserialization peer, objects in one language can be automatically serialized into objects in another language without creating IDL files, compiling schema to generate code, or writing conversion code.</li>
+<li><strong>Automatically serializes shared and circular references</strong> across multiple languages.</li>
+<li><strong>Supports object type polymorphism</strong>, consistent with the object-oriented programming paradigm, and multiple subtypes can be automatically deserialized without manual intervention.</li>
+<li><strong>Out-of-band zero-copy</strong> is also supported in this protocol.</li>
+</ul>
+<p>Example of Automatic Cross-Language Serialization:</p>
+<img alt="xlang serialization example" src="https://fury.apache.org/img/xlang_serialization_example.png">
+<h3 class="anchor anchorWithStickyNavbar_LWe7" id="row-format">Row-format<a href="https://fury.apache.org/blog/fury_blazing_fast_multiple_language_serialization_framework#row-format" class="hash-link" aria-label="Direct link to Row-format" title="Direct link to Row-format"></a></h3>
+<p>For <strong>high-performance computing and large-scale data transfer</strong> scenarios, data serialization and transfer are often the <strong>performance bottlenecks</strong> of the system. If users only need to read part of the data or filter data based on some field of an object, deserializing the entire data will result in unnecessary overhead. Therefore, Fury provides a binary data structure for <strong>direct reading and writing on binary data to avoid serialization</strong>.</p>
+<p><a href="https://arrow.apache.org/" target="_blank" rel="noopener noreferrer">Apache Arrow</a> is a standardized columnar storage format that supports binary read and write. However, <strong>columnar format is not suitable for all scenarios</strong>. Data in online and streaming computing are naturally stored row by row, and row is also used in columnar computing engines when involving data updates, Hash/Join/Aggregation operations.</p>
+<p>However, there is no standardized implementation for row format. <strong>Computing engines such as Spark/Flink/Doris/Velox all defined their row format, which doesn't support cross-language and can only be used internally by themselves</strong>. FlatBuffers does support <strong>lazy deserialization</strong>, but it requires static compilation of schema IDL and management of offset, which is impossible for complex scenarios.</p>
+<p>Therefore, Fury implemented a <strong>binary row format</strong> inspired by <a href="https://databricks.com/blog/2015/04/28/project-tungsten-bringing-spark-closer-to-bare-metal.html" target="_blank" rel="noopener noreferrer">Spark Tungsten</a> and <a href="https://arrow.apache.org/docs/format/Columnar.html" target="_blank" rel="noopener noreferrer">Apache Arrow format</a>, which allows <strong>random access and partial deserialization</strong>. Currently, Java/Python/C++ versions hav [...]
+<img alt="xlang serialization example" src="https://fury.apache.org/img/row_format.png">
+<p>This format is densely stored, byte aligned and cache-friendly, which enables faster read and write operations. By avoiding deserialization, it reduces Java GC pressure and Python overhead. Based on Python's dynamics, Fury's data structure implements special methods such as <code>getattr</code>, <code>getitem</code>, <code>slice</code>, etc., ensuring behavior consistency with Python <code>dataclass</code>, <code>list</code>, <code>object</code>, and users have no perception of this.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="performance-comparison">Performance Comparison<a href="https://fury.apache.org/blog/fury_blazing_fast_multiple_language_serialization_framework#performance-comparison" class="hash-link" aria-label="Direct link to Performance Comparison" title="Direct link to Performance Comparison"></a></h2>
+<p>Here are some Java serialization performance data, where charts with "compatible" in the title are performance data under type compatible mode: Support type forward vs. Backward compatibility. Charts without "compatible" in the title are performance data without type compatibility: class schema must be same between serialization and deserialization.</p>
+<p>For fairness, Fury disabled the zero-copy feature for all tests.</p>
+<p><img width="44%" alt="serialization" src="https://fury.apache.org/img/case1.png"><img width="44%" alt="deserialization" src="https://fury.apache.org/img/case2.png"></p>
+<p><img width="44%" alt="bench_serialize_compatible_MEDIA_CONTENT_to_array_tps" src="https://fury.apache.org/img/benchmarks/serialization/bench_serialize_compatible_MEDIA_CONTENT_to_array_tps.png"><img width="44%" alt="bench_deserialize_compatible_MEDIA_CONTENT_from_array_tps" src="https://fury.apache.org/img/benchmarks/deserialization/bench_deserialize_compatible_MEDIA_CONTENT_from_array_tps.png"></p>
+<p><img width="44%" alt="bench_serialize_STRUCT_to_array_tps" src="https://fury.apache.org/img/benchmarks/serialization/bench_serialize_STRUCT_to_array_tps.png"><img width="44%" alt="bench_serialize_SAMPLE_to_array_tps" src="https://fury.apache.org/img/benchmarks/serialization/bench_serialize_SAMPLE_to_array_tps.png"></p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="roadmap">Roadmap<a href="https://fury.apache.org/blog/fury_blazing_fast_multiple_language_serialization_framework#roadmap" class="hash-link" aria-label="Direct link to Roadmap" title="Direct link to Roadmap"></a></h2>
+<ul>
+<li>Meta compression, auto meta sharing and cross-language schema compatibility.</li>
+<li>AOT Framework for C++ and Golang to generate code statically.</li>
+<li>Object graph serialization support for C++ and Rust</li>
+<li>Row format support for Golang, Rust, and NodeJS</li>
+<li>Protobuf compatibility support</li>
+<li>Protocols for features and knowledge graph serialization</li>
+<li>Continuously improve our serialization infrastructure for any new protocols</li>
+</ul>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="join-us">Join us<a href="https://fury.apache.org/blog/fury_blazing_fast_multiple_language_serialization_framework#join-us" class="hash-link" aria-label="Direct link to Join us" title="Direct link to Join us"></a></h2>
+<p>We are committed to building Apache Fury into an open and neutral community project that pursues passion and innovation. The development and discussion are open-sourced and transparent in the community. Any form of participation is welcome, including but not limited to questions, code contributions, technical discussions, etc. We are looking forward to receiving your ideas and feedback, participating in the project together, pushing the project forward and creating a better serializat [...]
+<p>The GitHub address of the fury repository is: <a href="https://github.com/apache/incubator-fury" target="_blank" rel="noopener noreferrer">https://github.com/apache/incubator-fury</a></p>
+<p>Official website: <a href="https://fury.apache.org/" target="_blank" rel="noopener noreferrer">https://fury.apache.org</a></p>
+<p>All issues, PR, and Discussion are welcome.</p>]]></content>
+ <author>
+ <name>Shawn Yang</name>
+ <uri>https://github.com/chaokunyang</uri>
+ </author>
+ <category label="fury" term="fury"/>
+ </entry>
<entry>
<title type="html"><![CDATA[Fury 0.4.1 Released]]></title>
<id>https://fury.apache.org/blog/fury_0_4_1_release</id>
@@ -1020,272 +1182,4 @@ For details, please refer to the following commit messages.</p>
</author>
<category label="fury" term="fury"/>
</entry>
- <entry>
- <title type="html"><![CDATA[Fury - A blazing fast multi-language serialization framework powered by jit and zero-copy]]></title>
- <id>https://fury.apache.org/blog/fury_blazing_fast_multiple_language_serialization_framework</id>
- <link href="https://fury.apache.org/blog/fury_blazing_fast_multiple_language_serialization_framework"/>
- <updated>2023-07-15T00:00:00.000Z</updated>
- <summary type="html"><![CDATA[Fury is a multi-language serialization framework powered by JIT dynamic compilation and zero copy. It supports Java/Python/Golang/JavaScript/Rust/C++, provide automatic multi-language objects serialization features, and 170x speedup compared to JDK serialization.]]></summary>
- <content type="html"><![CDATA[<p>Fury is a multi-language serialization framework powered by JIT dynamic compilation and zero copy. It supports Java/Python/Golang/JavaScript/Rust/C++, provide automatic multi-language objects serialization features, and 170x speedup compared to JDK serialization.</p>
-<p>Author: <a href="https://github.com/chaokunyang" target="_blank" rel="noopener noreferrer">chaokunyang</a></p>
-<blockquote>
-<p>Fury is a blazing fast <strong>multi-language serialization</strong> framework powered by <strong>jit(just-in-time compilation) and
-zero-copy</strong>, providing up to <strong>170x performance</strong> and ultimate <strong>ease of use</strong>.</p>
-</blockquote>
-<p>The GitHub address of fury repository is: <a href="https://github.com/alipay/fury" target="_blank" rel="noopener noreferrer">https://github.com/alipay/fury</a></p>
-<img alt="fury banner" src="https://fury.apache.org/img/fury_banner.png">
-<h1>Background</h1>
-<p>Serialization is a basic component of system communication, and widely used in big data, AI framework, cloud native and
-other distributed systems.
-<strong>Data transfer between processes/languages/nodes, or object persistence, state read/write and
-copy</strong> all need serialization.
-The performance and ease-of-use of serialization affects <strong>runtime and development efficiency</strong> of the system.</p>
-<p>Static serialization frameworks
-like <a href="https://github.com/protocolbuffers/protobuf" target="_blank" rel="noopener noreferrer">protobuf</a>/<a href="https://github.com/google/flatbuffers" target="_blank" rel="noopener noreferrer">flatbuffers</a>
-can't be used for cross-language <a href="https://en.wikipedia.org/wiki/Domain-driven_design" target="_blank" rel="noopener noreferrer">application development</a> directly,
-because they <strong>don't support shared reference and polymorphism</strong>, and also need to <strong>generate code ahead</strong>.
-Dynamic serialization frameworks such as JDK serialization, Kryo, Fst, Hessian, Pickle provide ease-of-use and dynamics,
-but <strong>don't support cross-language</strong> and suffer significant <strong>performance issues</strong>,
-which is unsuitable for high throughput, low latency, and large-scale data transfer scenarios.</p>
-<p>Therefore, we developed a new multi-language serialization framework <strong><a href="https://github.com/alipay/fury" target="_blank" rel="noopener noreferrer">Fury</a></strong>, which is
-now open-sourced on <a href="https://github.com/alipay/fury" target="_blank" rel="noopener noreferrer">https://github.com/alipay/fury</a>. Through <strong>highly optimized serialization primitives, JIT dynamic compilation and Zero-Copy</strong> technologies,
-Fury is both fast and easy to use. It can <strong>cross-language serialize any object automatically</strong> and provides <strong>ultimate performance</strong> at the same time.</p>
-<p><img width="44%" alt="serialization" src="https://fury.apache.org/img/case1.png"><img width="44%" alt="deserialization" src="https://fury.apache.org/img/case2.png"></p>
-<h1>What is Fury</h1>
-<p>Fury is a multi-language serialization framework powered by JIT dynamic compilation and zero copy, providing blazing
-fast speed and ease of use:</p>
-<ul>
-<li><strong>Multiple languages</strong>: Java/Python/C++/Golang/JavaScript/Rust, other languages can be added easily.</li>
-<li><strong>Highly optimized serialization primitives</strong>.</li>
-<li><strong>Zero-Copy</strong>: support <a href="https://peps.python.org/pep-0574/" target="_blank" rel="noopener noreferrer">out-of-band</a> serialization and off-heap read/write.</li>
-<li><strong>High performance</strong>: Use JIT(just-in-time) to generate serialization code at runtime in an async multithreaded way,
-which can optimize methods inlining, code cache, dead code elimination, hash lookup, meta writing and memory
-read/writing.</li>
-<li><strong>Multi protocols</strong>: providing flexibility and ease-of-use of dynamic serialization, as well as the cross-language of
-static serialization.<!-- -->
-<ul>
-<li><strong>Java Serialization</strong>:<!-- -->
-<ul>
-<li>Drop-in replaces <code>JDK/Kryo/Hessian</code>, no need to modify user code, but providing 170x speed up at most, which can
-improve efficiency of rpc, data transfer and object persistence significantly.</li>
-<li>100% JDK compatible, support JDK custom serialization
-methods <code>writeObject/readObject/writeReplace/readResolve/readObjectNoData</code> natively.</li>
-</ul>
-</li>
-<li><strong>Cross-language object graph</strong>:<!-- -->
-<ul>
-<li>Cross-language serialize any objects automatically, no need for IDL, schema compilation, and object/protocol
-conversion.</li>
-<li>Cross-language serialize shared/circular reference, no data duplication or recursion error.</li>
-<li>Support object polymorphism, multiple children type objects can be serialized simultaneously.</li>
-</ul>
-</li>
-<li><strong>Row format</strong>
-<ul>
-<li>A cache-friendly binary random-access format, supports skipping deserialization and lazy deserialization,
-efficient
-for high-performance computing and large-scale data transfer.</li>
-<li>Support automatic conversion to apache arrow.</li>
-</ul>
-</li>
-</ul>
-</li>
-</ul>
-<h1>Core Serialization Capabilities</h1>
-<p>Although different scenarios require different serialization protocols, the underlying operations of serialization are
-similar.
-Therefore, Fury defines and implements <strong>a set of basic serialization capabilities</strong>,
-which can be used for quickly building new multi-language serialization protocols
-and get speedup by jit acceleration and other optimizations.
-At the same time, performance optimization for a protocol on the primitives can also benefit all other protocols.</p>
-<h2 class="anchor anchorWithStickyNavbar_LWe7" id="serialization-primitives">Serialization Primitives<a href="https://fury.apache.org/blog/fury_blazing_fast_multiple_language_serialization_framework#serialization-primitives" class="hash-link" aria-label="Direct link to Serialization Primitives" title="Direct link to Serialization Primitives"></a></h2>
-<p>Common serialization operations contains:</p>
-<ul>
-<li>bitmap operations</li>
-<li>number encoding/decoding</li>
-<li>int/long compression</li>
-<li>String creation/copy</li>
-<li>String encoding: ASCII/UTF8/UTF16</li>
-<li>memory copy</li>
-<li>array copy&compression</li>
-<li>meta encoding&compression&cache</li>
-</ul>
-<p>Fury use SIMD and other advanced language features to make basic operations extremely fast in every languages.</p>
-<h2 class="anchor anchorWithStickyNavbar_LWe7" id="zero-copy-serialization">Zero-Copy Serialization<a href="https://fury.apache.org/blog/fury_blazing_fast_multiple_language_serialization_framework#zero-copy-serialization" class="hash-link" aria-label="Direct link to Zero-Copy Serialization" title="Direct link to Zero-Copy Serialization"></a></h2>
-<p>Large-scale data transfer often has multiple binary buffers in an object graph. Some serialization frameworks
-will write the binaries into an intermediate buffer and introduce multiple time-consuming memory
-copies. Fury implemented an <strong>out-of-band serialization protocol</strong> inspired by <a href="https://peps.python.org/pep-0574/" target="_blank" rel="noopener noreferrer">pickle5</a>,
-ray and arrow, which can
-<strong>capture all binary buffers</strong> in an object graph to avoid intermediate copies of these buffers.
-The following figure shows the serialization process of zero-copy:</p>
-<img alt="fury zero copy" src="https://fury.apache.org/img/fury_zero_copy.jpeg">
-<p>Currently, Fury supports the following types of zero-copy:</p>
-<ul>
-<li>java: all basic types of arrays, <code>ByteBuffer</code>, <code>ArrowRecordBatch</code>, and <code>VectorSchemaRoot</code></li>
-<li>python: all arrays of the array module, numpy arrays, <code>pyarrow.Table,</code> and <code>pyarrow.RecordBatch</code></li>
-<li>golang<!-- -->:byte<!-- --> slice</li>
-</ul>
-<p>You can also add the new zero copy type based on the Fury interface.</p>
-<h2 class="anchor anchorWithStickyNavbar_LWe7" id="jit-dynamic-compilation-acceleration">JIT dynamic compilation acceleration<a href="https://fury.apache.org/blog/fury_blazing_fast_multiple_language_serialization_framework#jit-dynamic-compilation-acceleration" class="hash-link" aria-label="Direct link to JIT dynamic compilation acceleration" title="Direct link to JIT dynamic compilation acceleration"></a></h2>
-<p>Custom type objects usually contain lots of type information, Fury used this information to generate
-efficient serialization code at runtime, which can push lots of runtime operations into the dynamic compilation
-stage. By inlining more methods, better code cache, reducing virtual method calls, conditional branches, hash lookup,
-metadata writes, and memory reads/writes, the serialization performance is greatly accelerated.</p>
-<p>For Java, Fury implements a <strong>runtime codegen framework</strong> and defines
-an <a href="https://en.wikipedia.org/wiki/Intermediate_representation" target="_blank" rel="noopener noreferrer">operator expression IR</a>.
-Then fury can perform type inference based
-on the generic type information of the object at runtime to build an expression tree
-that describes the logic of serialized code.
-The codegen framework will generate efficient Java code from the expression tree, then pass
-to <a href="https://github.com/janino-compiler/janino" target="_blank" rel="noopener noreferrer">Janino</a> to compile it into bytecode,
-and load it into the user's ClassLoader or the ClassLoader created by Fury,
-and finally compile it into efficient assembly code through Java JIT.</p>
-<p>Since JVM JIT skips Big method compilation and inlining, Fury also implements an optimizer to <strong>split big methods into
-small methods recursively</strong>, thus ensuring that all code can be compiled and inlined.</p>
-<img alt="fury java codegen" src="https://fury.apache.org/img/fury_java_codegen.png">
-<p>Fury also supports <strong>asynchronous multithreaded compilation</strong> by running the codegen tasks in a thread pool,
-and using interpretation mode until JIT finishes to ensure no serialization burrs.
-Users can skip warm up serialization of objects.</p>
-<p>Python and JavaScript codegen are similar. Generating source code is easier for development
-and troubleshooting problems.</p>
-<p>Since serialization will manipulate objects extensively in each programming language, and the language
-does not expose the low-level API of the memory model, native methods call has a large cost too,
-so we cannot use <a href="https://www.llvm.org/" target="_blank" rel="noopener noreferrer">LLVM</a> to build a unified serializer JIT framework.
-Instead, we implemented a codegen framework for every language separately.</p>
-<h2 class="anchor anchorWithStickyNavbar_LWe7" id="static-code-generation">Static code generation<a href="https://fury.apache.org/blog/fury_blazing_fast_multiple_language_serialization_framework#static-code-generation" class="hash-link" aria-label="Direct link to Static code generation" title="Direct link to Static code generation"></a></h2>
-<p>Although JIT compilation can greatly improve serialization efficiency and generate better serialization code based on
-the statistical distribution of data at runtime, languages like <code>C++</code> do not support reflection,
-have no virtual machines, and no low-level API for memory models.
-We cannot generate serialization code dynamically for such languages through JIT.</p>
-<p>In such scenarios, Fury is implementing an <strong>AOT codegen framework</strong>, which generates the serialized code statically
-according to the object schema, and objects can be serialized automatically using the
-generated serializer. For Rust, Rust macro is used to generate code statically.</p>
-<h2 class="anchor anchorWithStickyNavbar_LWe7" id="cache-optimization">Cache optimization<a href="https://fury.apache.org/blog/fury_blazing_fast_multiple_language_serialization_framework#cache-optimization" class="hash-link" aria-label="Direct link to Cache optimization" title="Direct link to Cache optimization"></a></h2>
-<p>When serializing a custom type, fury will <strong>reorder fields</strong> to ensure that fields of the same type are serialized in
-order. This can hit more data cache and CPU instruction cache.</p>
-<p>The basic type fields are written <strong>in descending order by byte size</strong>. In this way, if the initial addresses are aligned,
-subsequent read and write operations will occur at the position where the memory addresses are aligned, making CPU
-execution more efficient.</p>
-<h1>Multi-protocol Design and Implementation</h1>
-<p>Based on the multi-language serialization features provided by Fury core, we have built three serialization protocols
-for different scenarios:</p>
-<ul>
-<li><strong>Java serialization</strong>: suitable for pure Java serialization scenarios and provides up to170x speed up;</li>
-<li><strong>Cross-language object graph serialization</strong>: suitable for application-oriented multi-language programming and
-high-performance cross-language serialization;</li>
-<li><strong>Row-format serialization</strong>: suitable for distributed computing engines such as Spark/Flink/Dories/Velox/Features
-frameworks;</li>
-</ul>
-<p>In the future, we will add new protocols for other core scenarios. Users can also build their own protocols based on
-Fury's serialization framework.</p>
-<h2 class="anchor anchorWithStickyNavbar_LWe7" id="java-serialization">Java serialization<a href="https://fury.apache.org/blog/fury_blazing_fast_multiple_language_serialization_framework#java-serialization" class="hash-link" aria-label="Direct link to Java serialization" title="Direct link to Java serialization"></a></h2>
-<p>Java is widely used in <strong>big data, cloud native, microservices, and enterprise applications</strong>.
-Therefore, Fury made lots of optimizations for Java serialization, which reduces system latency and server costs a lot,
-and improves throughput significantly. Our implementation has the following highlights:</p>
-<ul>
-<li>Blazing fast performance: Based on Java types, JIT compilation and Unsafe low-level
-operations, <strong>Fury is 170x faster than JDK, and 50~110x faster than Kryo/Hessian</strong> at most.</li>
-<li><strong>100% JDK serialization API compatibility</strong> : supports all JDK custom serialization
-methods <code>writeObject/readObject/writeReplace/readResolve/readObjectNoData</code> natively to ensure the serialization
-correctness
-in any scenario. Kryo/Hessian have some correctness issues in these scenarios.</li>
-<li><strong>Type compatibility</strong>: When the deserialization and serialization class schema are inconsistent, it can still
-deserialize correctly.
-It supports application upgrade and deployment, add/delete fields independently.
-Fury type-compatible mode is implemented with no performance loss compared to type-consistent mode.</li>
-<li><strong>Metadata sharing</strong> : share metadata(class name, field name&type, etc.) across multiple
-serializations under a context (TCP connection),
-meta will be sent to the peer only for the first
-serialization, the peer can reconstruct the same deserializer based on this information.
-Subsequent serialization will skip transferring metadata, which can reduce network traffic,
-and support type compatibility automatically.</li>
-<li><strong>Zero copy support</strong>: supports out-of-band zero copy and off-heap memory read/write.</li>
-</ul>
-<h2 class="anchor anchorWithStickyNavbar_LWe7" id="cross-language-object-graph-serialization">Cross-language object graph serialization<a href="https://fury.apache.org/blog/fury_blazing_fast_multiple_language_serialization_framework#cross-language-object-graph-serialization" class="hash-link" aria-label="Direct link to Cross-language object graph serialization" title="Direct link to Cross-language object graph serialization"></a></h2>
-<p>Fury cross-language object graph serialization is primarily used for scenarios that require
-higher dynamics and ease-of-use.
-Although frameworks like Protobuf/Flatbuffers support cross-language serialization, they still have limitations:</p>
-<ul>
-<li>They require <strong>pre-defined IDLs and generate code statically ahead</strong>, lacking sufficient dynamics and flexibility;</li>
-<li>The generated classes <strong>don't conform to object-oriented design</strong> and it's impossible to add behavior to classes,
-which make them unsuitable for use as domain objects in cross-language application development.</li>
-<li>They <strong>don't support polymorphism</strong>. Object-oriented programming uses interfaces to invoke subclass methods,
-but this pattern isn't supported well in those frameworks. Although Flatbuffers offers <code>Union</code>,
-and Protobuf provides <code>OneOf/Any</code>, those API require check object type during serialization and deserialization, which
-isn't polymorphic.</li>
-<li>They <strong>don't support circular references and shared references</strong>.
-Users need to define a set of IDLs for domain objects
-and implement reference resolution by themselves,
-as well as writing code to convert between domain objects and protocol objects in each language.
-If the object graph depth is deep, more code needs to be written.</li>
-</ul>
-<p>Due to the above limitations, Fury implemented a cross-language object graph serialization protocol that:</p>
-<ul>
-<li><strong>Automatically serializes any object across multiple languages</strong>: By defining classes in the serialization and
-deserialization peer, objects in one language can be automatically serialized into objects in another language without
-creating IDL files, compiling schema to generate code, or writing conversion code.</li>
-<li><strong>Automatically serializes shared and circular references</strong> across multiple languages.</li>
-<li><strong>Supports object type polymorphism</strong>, consistent with the object-oriented programming paradigm,
-and multiple subtypes can be automatically deserialized without manual intervention.</li>
-<li><strong>Out-of-band zero-copy</strong> is also supported in this protocol.</li>
-</ul>
-<p>Example of Automatic Cross-Language Serialization:</p>
-<img alt="xlang serialization example" src="https://fury.apache.org/img/xlang_serialization_example.png">
-<h2 class="anchor anchorWithStickyNavbar_LWe7" id="row-format">Row-format<a href="https://fury.apache.org/blog/fury_blazing_fast_multiple_language_serialization_framework#row-format" class="hash-link" aria-label="Direct link to Row-format" title="Direct link to Row-format"></a></h2>
-<p>For <strong>high-performance computing and large-scale data transfer</strong> scenarios, data serialization and transfer are often
-the <strong>performance bottlenecks</strong> of the system. If users only need to read part of the data or filter data based on some
-field of an object, deserializing the entire data will result in unnecessary overhead. Therefore, Fury provides a
-binary data structure for <strong>direct reading and writing on binary data to avoid serialization</strong>.</p>
-<p><a href="https://arrow.apache.org/" target="_blank" rel="noopener noreferrer">Apache Arrow</a> is a standardized columnar storage format that supports binary read and write.
-However, <strong>columnar format is not suitable for all scenarios</strong>.
-Data in online and streaming computing are naturally stored row by row,
-and row is also used in columnar computing engines when involving data updates, Hash/Join/Aggregation operations.</p>
-<p>However, there is no standardized implementation for row format.
-<strong>Computing engines such as Spark/Flink/Doris/Velox all defined their row format,
-which doesn't support cross-language and can only be used internally by themselves</strong>.
-Flatbuffers does support <strong>lazy deserialization</strong>, but it requires static compilation of schema IDL
-and management of offset, which is impossible for complex scenarios.</p>
-<p>Therefore, Fury implemented a <strong>binary row format</strong> inspired
-by <a href="https://databricks.com/blog/2015/04/28/project-tungsten-bringing-spark-closer-to-bare-metal.html" target="_blank" rel="noopener noreferrer">Spark Tungsten</a>
-and <a href="https://arrow.apache.org/docs/format/Columnar.html" target="_blank" rel="noopener noreferrer">Apache Arrow format</a>, which
-allows <strong>random access and partial deserialization</strong>. Currently, Java/Python/C++ versions have been implemented,
-allowing direct reading and writing on binary data to avoid all serialization overhead, and can convert to arrow format automatically.</p>
-<img alt="xlang serialization example" src="https://fury.apache.org/img/row_format.png">
-<p>This format is densely stored, byte aligned and cache-friendly, which enables faster read and write operations. By avoiding deserialization, it reduces Java GC pressure and Python overhead. Based on Python's dynamics, Fury's data structure implements special methods such as <code>getattr_/getitem/slice/etc.</code>, ensuring behavior consistency with Python dataclass/list/object, and users have no perception of this.</p>
-<h1>Performance Comparison</h1>
-<p>Here are some Java serialization performance data,
-where charts with "compatible" in the title are performance data under type compatible mode:
-support type forward/backward compatibility.
-and charts without "compatible" in the title are performance data without type compatibility:
-class schema must be same between serialization and deserialization.
-For fairness, Fury disabled the zero-copy feature for all tests.</p>
-<p><img width="44%" alt="serialization" src="https://fury.apache.org/img/case1.png"><img width="44%" alt="deserialization" src="https://fury.apache.org/img/case2.png"></p>
-<p><img width="44%" alt="bench_serialize_compatible_MEDIA_CONTENT_to_array_tps" src="https://fury.apache.org/img/benchmarks/serialization/bench_serialize_compatible_MEDIA_CONTENT_to_array_tps.png"><img width="44%" alt="bench_deserialize_compatible_MEDIA_CONTENT_from_array_tps" src="https://fury.apache.org/img/benchmarks/deserialization/bench_deserialize_compatible_MEDIA_CONTENT_from_array_tps.png"></p>
-<p><img width="44%" alt="bench_serialize_STRUCT_to_array_tps" src="https://fury.apache.org/img/benchmarks/serialization/bench_serialize_STRUCT_to_array_tps.png"><img width="44%" alt="bench_serialize_SAMPLE_to_array_tps" src="https://fury.apache.org/img/benchmarks/serialization/bench_serialize_SAMPLE_to_array_tps.png"></p>
-<h1>Future planning(RoadMap)</h1>
-<ul>
-<li>Meta compression, auto meta sharing and cross-language schema compatibility.</li>
-<li>AOT Framework for c++/golang to generate code statically.</li>
-<li>C++/Rust object graph serialization support</li>
-<li>Golang/Rust/NodeJS row format support</li>
-<li>ProtoBuf compatibility support</li>
-<li>Protocols for features and knowledge graph serialization</li>
-<li>Continuously improve our serialization infrastructure for any new protocols</li>
-</ul>
-<h1>Join US</h1>
-<p>We are committed to building Fury into an open and neutral community project that pursues passion and innovation. The
-development and discussion are open-sourced and transparent in the community. Any form of participation is welcome,
-including but not limited to questions, code contributions, technical discussions, etc. We are looking forward to
-receiving your ideas and feedback, participating in the project together, pushing the project forward and creating a
-better serialization framework.</p>
-<p>The GitHub address of the fury repository is:
-<a href="https://github.com/alipay/fury" target="_blank" rel="noopener noreferrer">https://github.com/alipay/fury</a></p>
-<p>Official website: <a href="https://furyio.org/" target="_blank" rel="noopener noreferrer">https://furyio.org</a></p>
-<p>All issues, PR, and Discussion are welcome.</p>]]></content>
- <author>
- <name>Shawn Yang</name>
- <uri>https://github.com/chaokunyang</uri>
- </author>
- <category label="fury" term="fury"/>
- </entry>
</feed>
\ No newline at end of file
diff --git a/blog/fury_0_1_0_release/index.html b/blog/fury_0_1_0_release/index.html
index b14c0b7..bc31fff 100644
--- a/blog/fury_0_1_0_release/index.html
+++ b/blog/fury_0_1_0_release/index.html
@@ -5,11 +5,11 @@
<meta name="generator" content="Docusaurus v3.0.1">
<title data-rh="true">Fury v0.1.0 released | Apache Fury (incubating)</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://fury.apache.org/blog/fury_0_1_0_release"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docusaurus_tag" content= [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache Fury (incubating) Atom Feed"><link rel="stylesheet" href="/assets/css/styles.d3c1e154.css">
-<script src="/assets/js/runtime~main.4b29d538.js" defer="defer"></script>
-<script src="/assets/js/main.4989193f.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.1a67ee30.js" defer="defer"></script>
+<script src="/assets/js/main.683e6d58.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
-<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
<p>I'm pleased to announce the 0.1.0 release of the Fury. Fury 0.1.0 is our first release since we started the development in github in 2023.04.28, and open sourced in 2023.07.15. This release includes many features: production-ready Java serialization, cross language serialization for Java/Python/JavaScript/Rust, row format support and so on.</p>
<p>Author: <a href="https://github.com/chaokunyang" target="_blank" rel="noopener noreferrer">chaokunyang</a></p>
<p>I'm excited to release Fury v0.1.0 . Fury 0.1.0 is our first release since we started the development in github in 2023.04.28, and open sourced in 2023.07.15.</p>
@@ -470,7 +470,7 @@ For details, please refer to the following commit messages.</p>
<li>chore: apply license format by @tisonkun in <a href="https://github.com/alipay/fury/pull/783" target="_blank" rel="noopener noreferrer">https://github.com/alipay/fury/pull/783</a></li>
<li>[Java] use soft reference to avoid duplicate codegen by @chaokunyang in <a href="https://github.com/alipay/fury/pull/809" target="_blank" rel="noopener noreferrer">https://github.com/alipay/fury/pull/809</a></li>
</ul>
-<p><strong>Full Changelog</strong>: <a href="https://github.com/alipay/fury/commits/v0.1.0" target="_blank" rel="noopener noreferrer">https://github.com/alipay/fury/commits/v0.1.0</a></p></div><footer class="row docusaurus-mt-lg blogPostFooterDetailsFull_mRVl"><div class="col"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/blog/tags/fury">fury</a></li></ul></div></footer></article><nav class="pagination-nav [...]
+<p><strong>Full Changelog</strong>: <a href="https://github.com/alipay/fury/commits/v0.1.0" target="_blank" rel="noopener noreferrer">https://github.com/alipay/fury/commits/v0.1.0</a></p></div><footer class="row docusaurus-mt-lg blogPostFooterDetailsFull_mRVl"><div class="col"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/blog/tags/fury">fury</a></li></ul></div></footer></article><nav class="pagination-nav [...]
<p> Apache Fury is an effort undergoing incubation at The Apache Software Foundation (ASF), sponsored by the Apache Incubator. Incubation is required of all newly accepted projects until a further review indicates that the infrastructure, communications, and decision making process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the [...]
<p>
Copyright © 2024 The Apache Software Foundation, Licensed under the Apache License, Version 2.0. <br>
diff --git a/blog/fury_0_1_1_release/index.html b/blog/fury_0_1_1_release/index.html
index f335859..970830d 100644
--- a/blog/fury_0_1_1_release/index.html
+++ b/blog/fury_0_1_1_release/index.html
@@ -5,11 +5,11 @@
<meta name="generator" content="Docusaurus v3.0.1">
<title data-rh="true">Fury v0.1.1 released | Apache Fury (incubating)</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://fury.apache.org/blog/fury_0_1_1_release"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docusaurus_tag" content= [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache Fury (incubating) Atom Feed"><link rel="stylesheet" href="/assets/css/styles.d3c1e154.css">
-<script src="/assets/js/runtime~main.4b29d538.js" defer="defer"></script>
-<script src="/assets/js/main.4989193f.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.1a67ee30.js" defer="defer"></script>
+<script src="/assets/js/main.683e6d58.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
-<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
<p>Author: <a href="https://github.com/chaokunyang" target="_blank" rel="noopener noreferrer">chaokunyang</a></p>
<p>I'm pleased to announce the <code>0.1.1</code> release of Fury. This release is a enhanced verson based on fury <code>0.1.0</code>. It keeps binary compatibility with <code>0.1.0</code>.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="highlights">Highlights<a href="#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights"></a></h2>
diff --git a/blog/fury_0_1_2_release/index.html b/blog/fury_0_1_2_release/index.html
index 9cb79c1..798366b 100644
--- a/blog/fury_0_1_2_release/index.html
+++ b/blog/fury_0_1_2_release/index.html
@@ -5,11 +5,11 @@
<meta name="generator" content="Docusaurus v3.0.1">
<title data-rh="true">Fury v0.1.2 released | Apache Fury (incubating)</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://fury.apache.org/blog/fury_0_1_2_release"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docusaurus_tag" content= [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache Fury (incubating) Atom Feed"><link rel="stylesheet" href="/assets/css/styles.d3c1e154.css">
-<script src="/assets/js/runtime~main.4b29d538.js" defer="defer"></script>
-<script src="/assets/js/main.4989193f.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.1a67ee30.js" defer="defer"></script>
+<script src="/assets/js/main.683e6d58.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
-<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
<p>Author: <a href="https://github.com/chaokunyang" target="_blank" rel="noopener noreferrer">chaokunyang</a></p>
<p>I'm pleased to announce the <code>0.1.2</code> release of Fury. This release is a enhanced verson based on fury <code>0.1.1</code>. It keeps binary compatibility with <code>0.1.0</code>/<code>0.1.1</code>.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="whats-changed">What's Changed<a href="#whats-changed" class="hash-link" aria-label="Direct link to What's Changed" title="Direct link to What's Changed"></a></h2>
diff --git a/blog/fury_0_2_0_release/index.html b/blog/fury_0_2_0_release/index.html
index bf2be4e..b55624a 100644
--- a/blog/fury_0_2_0_release/index.html
+++ b/blog/fury_0_2_0_release/index.html
@@ -5,11 +5,11 @@
<meta name="generator" content="Docusaurus v3.0.1">
<title data-rh="true">Fury v0.2.0 released | Apache Fury (incubating)</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://fury.apache.org/blog/fury_0_2_0_release"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docusaurus_tag" content= [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache Fury (incubating) Atom Feed"><link rel="stylesheet" href="/assets/css/styles.d3c1e154.css">
-<script src="/assets/js/runtime~main.4b29d538.js" defer="defer"></script>
-<script src="/assets/js/main.4989193f.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.1a67ee30.js" defer="defer"></script>
+<script src="/assets/js/main.683e6d58.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
-<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
<p>I'm so excited to announce the 0.2.0 release of the Fury. This a very exciting version of fury. With this version, we have 1X speedup, <code>30%~50%</code> smaller serialized size. And now we are the fastest serialization framework in the <a href="https://github.com/eishay/jvm-serializers/wiki" target="_blank" rel="noopener noreferrer">JVM-Serializers</a>. At the same time, fury has fully support for JDK17/21, I supported JDK17+ record JIT serialization, JDK9+ ImmutableList JIT s [...]
<p>Author: <a href="https://github.com/chaokunyang" target="_blank" rel="noopener noreferrer">chaokunyang</a></p>
<p>I'm so excited to announce the 0.2.0 release of the Fury. This a very exciting version of fury. With this version, we have 1X speedup, 30%~50% smaller serialized size. And now we are the fastest serialization framework in the <a href="https://github.com/eishay/jvm-serializers/wiki" target="_blank" rel="noopener noreferrer">JVM-Serializers</a>. At the same time, fury has fully support for JDK17/21, I supported JDK17+ record JIT serialization, JDK9+ ImmutableList JIT serialization. [...]
diff --git a/blog/fury_0_2_1_release/index.html b/blog/fury_0_2_1_release/index.html
index 2a17063..178f3da 100644
--- a/blog/fury_0_2_1_release/index.html
+++ b/blog/fury_0_2_1_release/index.html
@@ -5,11 +5,11 @@
<meta name="generator" content="Docusaurus v3.0.1">
<title data-rh="true">Fury v0.2.1 released | Apache Fury (incubating)</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://fury.apache.org/blog/fury_0_2_1_release"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docusaurus_tag" content= [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache Fury (incubating) Atom Feed"><link rel="stylesheet" href="/assets/css/styles.d3c1e154.css">
-<script src="/assets/js/runtime~main.4b29d538.js" defer="defer"></script>
-<script src="/assets/js/main.4989193f.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.1a67ee30.js" defer="defer"></script>
+<script src="/assets/js/main.683e6d58.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
-<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
<p>I'm pleased to announce the 0.2.1 release of the Fury. This version provides beter jdk17+ record support and bettern jit for private classes.</p>
<p>Author: <a href="https://github.com/chaokunyang" target="_blank" rel="noopener noreferrer">chaokunyang</a></p>
<p>I'm pleased to announce the 0.2.1 release of the Fury. This version provides beter jdk17+ record support and bettern jit for private classes. Feel free to try it out and let me know if you have any issues.</p>
diff --git a/blog/fury_0_3_0_release/index.html b/blog/fury_0_3_0_release/index.html
index 64fd494..da1cac1 100644
--- a/blog/fury_0_3_0_release/index.html
+++ b/blog/fury_0_3_0_release/index.html
@@ -5,11 +5,11 @@
<meta name="generator" content="Docusaurus v3.0.1">
<title data-rh="true">Fury v0.3.0 released | Apache Fury (incubating)</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://fury.apache.org/blog/fury_0_3_0_release"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docusaurus_tag" content= [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache Fury (incubating) Atom Feed"><link rel="stylesheet" href="/assets/css/styles.d3c1e154.css">
-<script src="/assets/js/runtime~main.4b29d538.js" defer="defer"></script>
-<script src="/assets/js/main.4989193f.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.1a67ee30.js" defer="defer"></script>
+<script src="/assets/js/main.683e6d58.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
-<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
<p>I'm pleased to announce the 0.3.0 release of the Fury. With this release, fury supports all scala 2/3 objects serializaiton now, including: <strong>case/pojo/object/option/tuple/collecton/enum and other types</strong>. case/pojo/object are tightly integrated with fury JIT. Fury will generate highly-optimized serializer by generate serialize code at runtime to speed up serializaiton. The serialization for those objects will be extremely fast.</p>
<p>Author: <a href="https://github.com/chaokunyang" target="_blank" rel="noopener noreferrer">chaokunyang</a></p>
<p>I'm pleased to announce the 0.3.0 release of the Fury. With this release, fury supports all scala 2/3 objects serializaiton now, including: <strong>case/pojo/object/option/tuple/collecton/enum and other types</strong>. case/pojo/object are tightly integrated with fury JIT. Fury will generate highly-optimized serializer by generate serialize code at runtime to speed up serializaiton. The serialization for those objects will be extremely fast.</p>
diff --git a/blog/fury_0_3_1_release/index.html b/blog/fury_0_3_1_release/index.html
index 4837298..60fa4a8 100644
--- a/blog/fury_0_3_1_release/index.html
+++ b/blog/fury_0_3_1_release/index.html
@@ -5,11 +5,11 @@
<meta name="generator" content="Docusaurus v3.0.1">
<title data-rh="true">Fury v0.3.1 released | Apache Fury (incubating)</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://fury.apache.org/blog/fury_0_3_1_release"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docusaurus_tag" content= [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache Fury (incubating) Atom Feed"><link rel="stylesheet" href="/assets/css/styles.d3c1e154.css">
-<script src="/assets/js/runtime~main.4b29d538.js" defer="defer"></script>
-<script src="/assets/js/main.4989193f.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.1a67ee30.js" defer="defer"></script>
+<script src="/assets/js/main.683e6d58.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
-<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
<p>I'm pleased to announce the 0.3.1 release of the Fury. With this release, fury supports python 3.11&3.12, droped python 3.6 support.
Multiple scala serialization JIT optimization are included, and java serialization compatibility is improved too.</p>
<p>Author: <a href="https://github.com/chaokunyang" target="_blank" rel="noopener noreferrer">chaokunyang</a></p>
diff --git a/blog/fury_0_4_0_release/index.html b/blog/fury_0_4_0_release/index.html
index b48d370..10330e4 100644
--- a/blog/fury_0_4_0_release/index.html
+++ b/blog/fury_0_4_0_release/index.html
@@ -5,11 +5,11 @@
<meta name="generator" content="Docusaurus v3.0.1">
<title data-rh="true">Fury 0.4.0 Released | Apache Fury (incubating)</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://fury.apache.org/blog/fury_0_4_0_release"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docusaurus_tag" content=" [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache Fury (incubating) Atom Feed"><link rel="stylesheet" href="/assets/css/styles.d3c1e154.css">
-<script src="/assets/js/runtime~main.4b29d538.js" defer="defer"></script>
-<script src="/assets/js/main.4989193f.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.1a67ee30.js" defer="defer"></script>
+<script src="/assets/js/main.683e6d58.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
-<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
<p>I'm pleased to announce the 0.4.0 release of the Fury. With this release, <a href="https://www.graalvm.org/latest/reference-manual/native-image/" target="_blank" rel="noopener noreferrer">GraalVM native image</a> and C++ row format automatic encoder based on compile-time reflection are supported. Please try it out and share your feedbacks with us.</p>
<p>Author: <a href="https://github.com/chaokunyang" target="_blank" rel="noopener noreferrer">chaokunyang</a></p>
<p>I'm pleased to announce the 0.4.0 release of the Fury. With this release, <a href="https://www.graalvm.org/latest/reference-manual/native-image/" target="_blank" rel="noopener noreferrer">GraalVM native image</a> and C++ row format automatic encoder based on compile-time reflection are supported. Please try it out and share your feedbacks with us.</p>
diff --git a/blog/fury_0_4_1_release/index.html b/blog/fury_0_4_1_release/index.html
index f3bf964..456030b 100644
--- a/blog/fury_0_4_1_release/index.html
+++ b/blog/fury_0_4_1_release/index.html
@@ -5,11 +5,11 @@
<meta name="generator" content="Docusaurus v3.0.1">
<title data-rh="true">Fury 0.4.1 Released | Apache Fury (incubating)</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://fury.apache.org/blog/fury_0_4_1_release"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docusaurus_tag" content=" [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache Fury (incubating) Atom Feed"><link rel="stylesheet" href="/assets/css/styles.d3c1e154.css">
-<script src="/assets/js/runtime~main.4b29d538.js" defer="defer"></script>
-<script src="/assets/js/main.4989193f.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.1a67ee30.js" defer="defer"></script>
+<script src="/assets/js/main.683e6d58.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
-<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
<p>I'm pleased to announce the 0.4.1 release of the Fury: <a href="https://github.com/alipay/fury/releases/tag/v0.4.1" target="_blank" rel="noopener noreferrer">https://github.com/alipay/fury/releases/tag/v0.4.1</a>. With this release, Fury support rust row format now. C++ row format has been enhanced too, now iterable types can be encoded to fury row format. Please try it out and share your feedbacks with us.</p>
<p>Author: <a href="https://github.com/chaokunyang" target="_blank" rel="noopener noreferrer">chaokunyang</a></p>
<p>I'm pleased to announce the 0.4.1 release of the Fury: <a href="https://github.com/alipay/fury/releases/tag/v0.4.1" target="_blank" rel="noopener noreferrer">https://github.com/alipay/fury/releases/tag/v0.4.1</a>. With this release, Fury support rust row format now. C++ row format has been enhanced too, now iterable types can be encoded to fury row format too.</p>
@@ -43,7 +43,7 @@
<ul>
<li>@bytemain made their first contribution in <a href="https://github.com/alipay/fury/pull/1211" target="_blank" rel="noopener noreferrer">https://github.com/alipay/fury/pull/1211</a></li>
</ul>
-<p><strong>Full Changelog</strong>: <a href="https://github.com/alipay/fury/compare/v0.4.0...v0.4.1" target="_blank" rel="noopener noreferrer">https://github.com/alipay/fury/compare/v0.4.0...v0.4.1</a></p></div><footer class="row docusaurus-mt-lg blogPostFooterDetailsFull_mRVl"><div class="col"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/blog/tags/fury">fury</a></li></ul></div></footer></article><nav clas [...]
+<p><strong>Full Changelog</strong>: <a href="https://github.com/alipay/fury/compare/v0.4.0...v0.4.1" target="_blank" rel="noopener noreferrer">https://github.com/alipay/fury/compare/v0.4.0...v0.4.1</a></p></div><footer class="row docusaurus-mt-lg blogPostFooterDetailsFull_mRVl"><div class="col"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/blog/tags/fury">fury</a></li></ul></div></footer></article><nav clas [...]
<p> Apache Fury is an effort undergoing incubation at The Apache Software Foundation (ASF), sponsored by the Apache Incubator. Incubation is required of all newly accepted projects until a further review indicates that the infrastructure, communications, and decision making process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the [...]
<p>
Copyright © 2024 The Apache Software Foundation, Licensed under the Apache License, Version 2.0. <br>
diff --git a/blog/fury_blazing_fast_multiple_language_serialization_framework/index.html b/blog/fury_blazing_fast_multiple_language_serialization_framework/index.html
index a2c4e63..b856fb7 100644
--- a/blog/fury_blazing_fast_multiple_language_serialization_framework/index.html
+++ b/blog/fury_blazing_fast_multiple_language_serialization_framework/index.html
@@ -3,268 +3,162 @@
<head>
<meta charset="UTF-8">
<meta name="generator" content="Docusaurus v3.0.1">
-<title data-rh="true">Fury - A blazing fast multi-language serialization framework powered by jit and zero-copy | Apache Fury (incubating)</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://fury.apache.org/blog/fury_blazing_fast_multiple_language_serialization_framework"><meta data-rh="true" property="og:locale" content="en"> [...]
+<title data-rh="true">Apache Fury: A blazing fast multi-language serialization framework powered by JIT and zero-copy | Apache Fury (incubating)</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://fury.apache.org/blog/fury_blazing_fast_multiple_language_serialization_framework"><meta data-rh="true" property="og:locale" content [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache Fury (incubating) Atom Feed"><link rel="stylesheet" href="/assets/css/styles.d3c1e154.css">
-<script src="/assets/js/runtime~main.4b29d538.js" defer="defer"></script>
-<script src="/assets/js/main.4989193f.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.1a67ee30.js" defer="defer"></script>
+<script src="/assets/js/main.683e6d58.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
-<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
-<p>Author: <a href="https://github.com/chaokunyang" target="_blank" rel="noopener noreferrer">chaokunyang</a></p>
-<blockquote>
-<p>Fury is a blazing fast <strong>multi-language serialization</strong> framework powered by <strong>jit(just-in-time compilation) and
-zero-copy</strong>, providing up to <strong>170x performance</strong> and ultimate <strong>ease of use</strong>.</p>
-</blockquote>
-<p>The GitHub address of fury repository is: <a href="https://github.com/alipay/fury" target="_blank" rel="noopener noreferrer">https://github.com/alipay/fury</a></p>
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
+<p>The GitHub address of fury repository is: <a href="https://github.com/apache/incubator-fury" target="_blank" rel="noopener noreferrer">https://github.com/apache/incubator-fury</a></p>
<img alt="fury banner" src="/img/fury_banner.png">
-<h1>Background</h1>
-<p>Serialization is a basic component of system communication, and widely used in big data, AI framework, cloud native and
-other distributed systems.
-<strong>Data transfer between processes/languages/nodes, or object persistence, state read/write and
-copy</strong> all need serialization.
-The performance and ease-of-use of serialization affects <strong>runtime and development efficiency</strong> of the system.</p>
-<p>Static serialization frameworks
-like <a href="https://github.com/protocolbuffers/protobuf" target="_blank" rel="noopener noreferrer">protobuf</a>/<a href="https://github.com/google/flatbuffers" target="_blank" rel="noopener noreferrer">flatbuffers</a>
-can't be used for cross-language <a href="https://en.wikipedia.org/wiki/Domain-driven_design" target="_blank" rel="noopener noreferrer">application development</a> directly,
-because they <strong>don't support shared reference and polymorphism</strong>, and also need to <strong>generate code ahead</strong>.
-Dynamic serialization frameworks such as JDK serialization, Kryo, Fst, Hessian, Pickle provide ease-of-use and dynamics,
-but <strong>don't support cross-language</strong> and suffer significant <strong>performance issues</strong>,
-which is unsuitable for high throughput, low latency, and large-scale data transfer scenarios.</p>
-<p>Therefore, we developed a new multi-language serialization framework <strong><a href="https://github.com/alipay/fury" target="_blank" rel="noopener noreferrer">Fury</a></strong>, which is
-now open-sourced on <a href="https://github.com/alipay/fury" target="_blank" rel="noopener noreferrer">https://github.com/alipay/fury</a>. Through <strong>highly optimized serialization primitives, JIT dynamic compilation and Zero-Copy</strong> technologies,
-Fury is both fast and easy to use. It can <strong>cross-language serialize any object automatically</strong> and provides <strong>ultimate performance</strong> at the same time.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="background">Background<a href="#background" class="hash-link" aria-label="Direct link to Background" title="Direct link to Background"></a></h2>
+<p>Serialization is a basic component of system communication, and widely used in big data, AI framework, cloud native and other distributed systems. <strong>Data transfer between processes, languages, nodes, or object persistence, state read-write and copy</strong>, all need serialization. The performance and ease-of-use of serialization affects <strong>runtime and development efficiency</strong> of the system.</p>
+<p>Static serialization frameworks like <a href="https://github.com/protocolbuffers/protobuf" target="_blank" rel="noopener noreferrer">Protobuf</a> or <a href="https://github.com/google/flatbuffers" target="_blank" rel="noopener noreferrer">FlatBuffers</a> cannot be used for cross-language <a href="https://en.wikipedia.org/wiki/Domain-driven_design" target="_blank" rel="noopener noreferrer">application development</a> directly, because they <strong>don't support shared reference an [...]
+<p>Dynamic serialization frameworks such as JDK serialization, Kryo, Fst, Hessian, Pickle provide ease-of-use and dynamics, but <strong>don't support cross-language</strong> and suffer significant <strong>performance issues</strong>, which is unsuitable for high throughput, low latency, and large-scale data transfer scenarios.</p>
+<p>Therefore, we developed a new multi-language serialization framework <strong>Apache Fury</strong>, which is open-sourced on <a href="https://github.com/apache/incubator-fury" target="_blank" rel="noopener noreferrer">https://github.com/apache/incubator-fury</a>. Through <strong>highly optimized serialization primitives, JIT dynamic compilation and zero-copy</strong> technologies, Fury is both fast and easy-to-use. It can <strong>cross-language serialize any object automatically</stron [...]
<p><img width="44%" alt="serialization" src="/img/case1.png"><img width="44%" alt="deserialization" src="/img/case2.png"></p>
-<h1>What is Fury</h1>
-<p>Fury is a multi-language serialization framework powered by JIT dynamic compilation and zero copy, providing blazing
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-is-apache-fury">What is Apache Fury?<a href="#what-is-apache-fury" class="hash-link" aria-label="Direct link to What is Apache Fury?" title="Direct link to What is Apache Fury?"></a></h2>
+<p>Apache Fury is a multi-language serialization framework powered by JIT dynamic compilation and zero copy, providing blazing
fast speed and ease of use:</p>
<ul>
-<li><strong>Multiple languages</strong>: Java/Python/C++/Golang/JavaScript/Rust, other languages can be added easily.</li>
+<li><strong>Multiple languages</strong>: Java, Python, C++, Golang, JavaScript, Rust. Other languages can be added easily.</li>
<li><strong>Highly optimized serialization primitives</strong>.</li>
-<li><strong>Zero-Copy</strong>: support <a href="https://peps.python.org/pep-0574/" target="_blank" rel="noopener noreferrer">out-of-band</a> serialization and off-heap read/write.</li>
-<li><strong>High performance</strong>: Use JIT(just-in-time) to generate serialization code at runtime in an async multithreaded way,
-which can optimize methods inlining, code cache, dead code elimination, hash lookup, meta writing and memory
-read/writing.</li>
-<li><strong>Multi protocols</strong>: providing flexibility and ease-of-use of dynamic serialization, as well as the cross-language of
-static serialization.<!-- -->
+<li><strong>Zero-copy</strong>: Support <a href="https://peps.python.org/pep-0574/" target="_blank" rel="noopener noreferrer">out-of-band</a> serialization and off-heap read/write.</li>
+<li><strong>High performance</strong>: Use JIT to generate serialization code at runtime in an async multithreaded way, which can optimize methods inlining, code cache, dead code elimination, hash lookup, meta writing and memory read/write.</li>
+<li><strong>Multi protocols</strong>: Provide flexibility and ease of use of dynamic serialization, as well as the cross-language of static serialization.<!-- -->
<ul>
<li><strong>Java Serialization</strong>:<!-- -->
<ul>
-<li>Drop-in replaces <code>JDK/Kryo/Hessian</code>, no need to modify user code, but providing 170x speed up at most, which can
-improve efficiency of rpc, data transfer and object persistence significantly.</li>
-<li>100% JDK compatible, support JDK custom serialization
-methods <code>writeObject/readObject/writeReplace/readResolve/readObjectNoData</code> natively.</li>
+<li>Drop-in replaces JDK, Kryo, and Hessian. No need to modify user code, but providing 170x speed up at most, which can improve efficiency of rpc, data transfer and object persistence significantly.</li>
+<li>100% JDK compatible, support JDK custom serialization methods <code>writeObject</code>, <code>readObject</code>, <code>writeReplace</code>, <code>readResolve</code>, <code>readObjectNoData</code> natively.</li>
</ul>
</li>
<li><strong>Cross-language object graph</strong>:<!-- -->
<ul>
-<li>Cross-language serialize any objects automatically, no need for IDL, schema compilation, and object/protocol
-conversion.</li>
+<li>Cross-language serialize any objects automatically, no need for IDL, schema compilation, and object/protocol conversion.</li>
<li>Cross-language serialize shared/circular reference, no data duplication or recursion error.</li>
<li>Support object polymorphism, multiple children type objects can be serialized simultaneously.</li>
</ul>
</li>
<li><strong>Row format</strong>
<ul>
-<li>A cache-friendly binary random-access format, supports skipping deserialization and lazy deserialization,
-efficient
-for high-performance computing and large-scale data transfer.</li>
-<li>Support automatic conversion to apache arrow.</li>
+<li>A cache-friendly binary random-access format, supports skipping deserialization and lazy deserialization, efficient for high-performance computing and large-scale data transfer.</li>
+<li>Support automatic conversion to Apache Arrow.</li>
</ul>
</li>
</ul>
</li>
</ul>
-<h1>Core Serialization Capabilities</h1>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="core-serialization-capabilities">Core Serialization Capabilities<a href="#core-serialization-capabilities" class="hash-link" aria-label="Direct link to Core Serialization Capabilities" title="Direct link to Core Serialization Capabilities"></a></h2>
<p>Although different scenarios require different serialization protocols, the underlying operations of serialization are
-similar.
-Therefore, Fury defines and implements <strong>a set of basic serialization capabilities</strong>,
-which can be used for quickly building new multi-language serialization protocols
-and get speedup by jit acceleration and other optimizations.
-At the same time, performance optimization for a protocol on the primitives can also benefit all other protocols.</p>
-<h2 class="anchor anchorWithStickyNavbar_LWe7" id="serialization-primitives">Serialization Primitives<a href="#serialization-primitives" class="hash-link" aria-label="Direct link to Serialization Primitives" title="Direct link to Serialization Primitives"></a></h2>
+similar.</p>
+<p>Therefore, Fury defines and implements <strong>a set of basic serialization capabilities</strong>, which can be used for quickly building new multi-language serialization protocols and get speedup by JIT acceleration and other optimizations.</p>
+<p>At the same time, performance optimization for a protocol on the primitives can also benefit all other protocols.</p>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" id="serialization-primitives">Serialization Primitives<a href="#serialization-primitives" class="hash-link" aria-label="Direct link to Serialization Primitives" title="Direct link to Serialization Primitives"></a></h3>
<p>Common serialization operations contains:</p>
<ul>
-<li>bitmap operations</li>
-<li>number encoding/decoding</li>
-<li>int/long compression</li>
-<li>String creation/copy</li>
-<li>String encoding: ASCII/UTF8/UTF16</li>
-<li>memory copy</li>
-<li>array copy&compression</li>
-<li>meta encoding&compression&cache</li>
+<li>Bitmap operations</li>
+<li>Number encoding and decoding</li>
+<li>Compression for int and long</li>
+<li>String creation and copy</li>
+<li>String encoding: ASCII, UTF8, UTF16</li>
+<li>Memory copy</li>
+<li>Array copy and compression</li>
+<li>Meta encoding, compression, and cache</li>
</ul>
<p>Fury use SIMD and other advanced language features to make basic operations extremely fast in every languages.</p>
-<h2 class="anchor anchorWithStickyNavbar_LWe7" id="zero-copy-serialization">Zero-Copy Serialization<a href="#zero-copy-serialization" class="hash-link" aria-label="Direct link to Zero-Copy Serialization" title="Direct link to Zero-Copy Serialization"></a></h2>
-<p>Large-scale data transfer often has multiple binary buffers in an object graph. Some serialization frameworks
-will write the binaries into an intermediate buffer and introduce multiple time-consuming memory
-copies. Fury implemented an <strong>out-of-band serialization protocol</strong> inspired by <a href="https://peps.python.org/pep-0574/" target="_blank" rel="noopener noreferrer">pickle5</a>,
-ray and arrow, which can
-<strong>capture all binary buffers</strong> in an object graph to avoid intermediate copies of these buffers.
-The following figure shows the serialization process of zero-copy:</p>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" id="zero-copy-serialization">Zero-copy Serialization<a href="#zero-copy-serialization" class="hash-link" aria-label="Direct link to Zero-copy Serialization" title="Direct link to Zero-copy Serialization"></a></h3>
+<p>Large-scale data transfer often has multiple binary buffers in an object graph. Some serialization frameworks will write the binaries into an intermediate buffer and introduce multiple time-consuming memory copies. Fury implemented an <strong>out-of-band serialization protocol</strong> inspired by <a href="https://peps.python.org/pep-0574/" target="_blank" rel="noopener noreferrer">pickle5</a>, Ray and Apache Arrow, which can <strong>capture all binary buffers</strong> in an object gr [...]
+<p>The following figure shows the serialization process of zero-copy:</p>
<img alt="fury zero copy" src="/img/fury_zero_copy.jpeg">
<p>Currently, Fury supports the following types of zero-copy:</p>
<ul>
-<li>java: all basic types of arrays, <code>ByteBuffer</code>, <code>ArrowRecordBatch</code>, and <code>VectorSchemaRoot</code></li>
-<li>python: all arrays of the array module, numpy arrays, <code>pyarrow.Table,</code> and <code>pyarrow.RecordBatch</code></li>
-<li>golang<!-- -->:byte<!-- --> slice</li>
+<li>Java: all basic types of arrays, <code>ByteBuffer</code>, <code>ArrowRecordBatch</code>, and <code>VectorSchemaRoot</code></li>
+<li>Python: all arrays of the array module, numpy arrays, <code>pyarrow.Table</code>, and <code>pyarrow.RecordBatch</code></li>
+<li>Golang: byte slice</li>
</ul>
<p>You can also add the new zero copy type based on the Fury interface.</p>
-<h2 class="anchor anchorWithStickyNavbar_LWe7" id="jit-dynamic-compilation-acceleration">JIT dynamic compilation acceleration<a href="#jit-dynamic-compilation-acceleration" class="hash-link" aria-label="Direct link to JIT dynamic compilation acceleration" title="Direct link to JIT dynamic compilation acceleration"></a></h2>
-<p>Custom type objects usually contain lots of type information, Fury used this information to generate
-efficient serialization code at runtime, which can push lots of runtime operations into the dynamic compilation
-stage. By inlining more methods, better code cache, reducing virtual method calls, conditional branches, hash lookup,
-metadata writes, and memory reads/writes, the serialization performance is greatly accelerated.</p>
-<p>For Java, Fury implements a <strong>runtime codegen framework</strong> and defines
-an <a href="https://en.wikipedia.org/wiki/Intermediate_representation" target="_blank" rel="noopener noreferrer">operator expression IR</a>.
-Then fury can perform type inference based
-on the generic type information of the object at runtime to build an expression tree
-that describes the logic of serialized code.
-The codegen framework will generate efficient Java code from the expression tree, then pass
-to <a href="https://github.com/janino-compiler/janino" target="_blank" rel="noopener noreferrer">Janino</a> to compile it into bytecode,
-and load it into the user's ClassLoader or the ClassLoader created by Fury,
-and finally compile it into efficient assembly code through Java JIT.</p>
-<p>Since JVM JIT skips Big method compilation and inlining, Fury also implements an optimizer to <strong>split big methods into
-small methods recursively</strong>, thus ensuring that all code can be compiled and inlined.</p>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" id="jit-dynamic-compilation-acceleration">JIT dynamic compilation acceleration<a href="#jit-dynamic-compilation-acceleration" class="hash-link" aria-label="Direct link to JIT dynamic compilation acceleration" title="Direct link to JIT dynamic compilation acceleration"></a></h3>
+<p>Custom type objects usually contain lots of type information, Fury used this information to generate efficient serialization code at runtime, which can push lots of runtime operations into the dynamic compilation stage. By inlining more methods, better code cache, reducing virtual method calls, conditional branches, hash lookup, metadata writes, and memory reads/writes, the serialization performance is greatly accelerated.</p>
+<p>For Java, Fury implements a <strong>runtime codegen framework</strong> and defines an <a href="https://en.wikipedia.org/wiki/Intermediate_representation" target="_blank" rel="noopener noreferrer">operator expression IR</a>. Then fury can perform type inference based on the generic type information of the object at runtime to build an expression tree that describes the logic of serialized code.</p>
+<p>The codegen framework will generate efficient Java code from the expression tree, then pass to <a href="https://github.com/janino-compiler/janino" target="_blank" rel="noopener noreferrer">Janino</a> to compile it into bytecode, and load it into the user's ClassLoader or the ClassLoader created by Fury, and finally compile it into efficient assembly code through Java JIT.</p>
+<p>Since JVM JIT skips Big method compilation and inlining, Fury also implements an optimizer to <strong>split big methods into small methods recursively</strong>, thus ensuring that all code can be compiled and inlined.</p>
<img alt="fury java codegen" src="/img/fury_java_codegen.png">
-<p>Fury also supports <strong>asynchronous multithreaded compilation</strong> by running the codegen tasks in a thread pool,
-and using interpretation mode until JIT finishes to ensure no serialization burrs.
-Users can skip warm up serialization of objects.</p>
-<p>Python and JavaScript codegen are similar. Generating source code is easier for development
-and troubleshooting problems.</p>
-<p>Since serialization will manipulate objects extensively in each programming language, and the language
-does not expose the low-level API of the memory model, native methods call has a large cost too,
-so we cannot use <a href="https://www.llvm.org/" target="_blank" rel="noopener noreferrer">LLVM</a> to build a unified serializer JIT framework.
-Instead, we implemented a codegen framework for every language separately.</p>
-<h2 class="anchor anchorWithStickyNavbar_LWe7" id="static-code-generation">Static code generation<a href="#static-code-generation" class="hash-link" aria-label="Direct link to Static code generation" title="Direct link to Static code generation"></a></h2>
-<p>Although JIT compilation can greatly improve serialization efficiency and generate better serialization code based on
-the statistical distribution of data at runtime, languages like <code>C++</code> do not support reflection,
-have no virtual machines, and no low-level API for memory models.
-We cannot generate serialization code dynamically for such languages through JIT.</p>
-<p>In such scenarios, Fury is implementing an <strong>AOT codegen framework</strong>, which generates the serialized code statically
-according to the object schema, and objects can be serialized automatically using the
-generated serializer. For Rust, Rust macro is used to generate code statically.</p>
-<h2 class="anchor anchorWithStickyNavbar_LWe7" id="cache-optimization">Cache optimization<a href="#cache-optimization" class="hash-link" aria-label="Direct link to Cache optimization" title="Direct link to Cache optimization"></a></h2>
-<p>When serializing a custom type, fury will <strong>reorder fields</strong> to ensure that fields of the same type are serialized in
-order. This can hit more data cache and CPU instruction cache.</p>
-<p>The basic type fields are written <strong>in descending order by byte size</strong>. In this way, if the initial addresses are aligned,
-subsequent read and write operations will occur at the position where the memory addresses are aligned, making CPU
-execution more efficient.</p>
-<h1>Multi-protocol Design and Implementation</h1>
-<p>Based on the multi-language serialization features provided by Fury core, we have built three serialization protocols
-for different scenarios:</p>
+<p>Fury also supports <strong>asynchronous multithreaded compilation</strong> by running the codegen tasks in a thread pool, and using interpretation mode until JIT finishes to ensure no serialization burrs. Users can skip warm up serialization of objects.</p>
+<p>Python and JavaScript codegen are similar. Generating source code is easier for development and troubleshooting problems.</p>
+<p>Since serialization will manipulate objects extensively in each programming language, and the language does not expose the low-level API of the memory model, native methods call has a large cost too, so we cannot use <a href="https://www.llvm.org/" target="_blank" rel="noopener noreferrer">LLVM</a> to build a unified serializer JIT framework. Instead, we implemented a codegen framework for every language separately.</p>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" id="static-code-generation">Static code generation<a href="#static-code-generation" class="hash-link" aria-label="Direct link to Static code generation" title="Direct link to Static code generation"></a></h3>
+<p>Although JIT compilation can greatly improve serialization efficiency and generate better serialization code based on the statistical distribution of data at runtime, languages like C++ do not support reflection, have no virtual machines, and no low-level API for memory models. We cannot generate serialization code dynamically for such languages through JIT.</p>
+<p>In such scenarios, Fury is implementing an <strong>AOT codegen framework</strong>, which generates the serialized code statically according to the object schema, and objects can be serialized automatically using the generated serializer. For Rust, Rust macro is used to generate code statically.</p>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" id="cache-optimization">Cache optimization<a href="#cache-optimization" class="hash-link" aria-label="Direct link to Cache optimization" title="Direct link to Cache optimization"></a></h3>
+<p>When serializing a custom type, fury will <strong>reorder fields</strong> to ensure that fields of the same type are serialized in order. This can hit more data cache and CPU instruction cache.</p>
+<p>The basic type fields are written <strong>in descending order by byte size</strong>. In this way, if the initial addresses are aligned, subsequent read and write operations will occur at the position where the memory addresses are aligned, making CPU execution more efficient.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="multi-protocol-design-and-implementation">Multi-protocol Design and Implementation<a href="#multi-protocol-design-and-implementation" class="hash-link" aria-label="Direct link to Multi-protocol Design and Implementation" title="Direct link to Multi-protocol Design and Implementation"></a></h2>
+<p>Based on the multi-language serialization features provided by Fury core, we have built three serialization protocols for different scenarios:</p>
<ul>
-<li><strong>Java serialization</strong>: suitable for pure Java serialization scenarios and provides up to170x speed up;</li>
-<li><strong>Cross-language object graph serialization</strong>: suitable for application-oriented multi-language programming and
+<li><strong>Java serialization</strong>: Suitable for pure Java serialization scenarios and provides up to 170x speed up;</li>
+<li><strong>Cross-language object graph serialization</strong>: Suitable for application-oriented multi-language programming and
high-performance cross-language serialization;</li>
-<li><strong>Row-format serialization</strong>: suitable for distributed computing engines such as Spark/Flink/Dories/Velox/Features
-frameworks;</li>
+<li><strong>Row-format serialization</strong>: Suitable for distributed computing engines such as Apache Spark, Apache Flink, Apache Doris, Velox, and features frameworks.</li>
</ul>
-<p>In the future, we will add new protocols for other core scenarios. Users can also build their own protocols based on
-Fury's serialization framework.</p>
-<h2 class="anchor anchorWithStickyNavbar_LWe7" id="java-serialization">Java serialization<a href="#java-serialization" class="hash-link" aria-label="Direct link to Java serialization" title="Direct link to Java serialization"></a></h2>
-<p>Java is widely used in <strong>big data, cloud native, microservices, and enterprise applications</strong>.
-Therefore, Fury made lots of optimizations for Java serialization, which reduces system latency and server costs a lot,
-and improves throughput significantly. Our implementation has the following highlights:</p>
+<p>In the future, we will add new protocols for other core scenarios. Users can also build their own protocols based on Fury's serialization framework.</p>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" id="java-serialization">Java serialization<a href="#java-serialization" class="hash-link" aria-label="Direct link to Java serialization" title="Direct link to Java serialization"></a></h3>
+<p>Java is widely used in <strong>big data, cloud native, microservices, and enterprise applications</strong>. Therefore, Fury made lots of optimizations for Java serialization, which reduces system latency and server costs a lot, and improves throughput significantly. Our implementation has the following highlights:</p>
<ul>
-<li>Blazing fast performance: Based on Java types, JIT compilation and Unsafe low-level
-operations, <strong>Fury is 170x faster than JDK, and 50~110x faster than Kryo/Hessian</strong> at most.</li>
-<li><strong>100% JDK serialization API compatibility</strong> : supports all JDK custom serialization
-methods <code>writeObject/readObject/writeReplace/readResolve/readObjectNoData</code> natively to ensure the serialization
-correctness
-in any scenario. Kryo/Hessian have some correctness issues in these scenarios.</li>
-<li><strong>Type compatibility</strong>: When the deserialization and serialization class schema are inconsistent, it can still
-deserialize correctly.
-It supports application upgrade and deployment, add/delete fields independently.
-Fury type-compatible mode is implemented with no performance loss compared to type-consistent mode.</li>
-<li><strong>Metadata sharing</strong> : share metadata(class name, field name&type, etc.) across multiple
-serializations under a context (TCP connection),
-meta will be sent to the peer only for the first
-serialization, the peer can reconstruct the same deserializer based on this information.
-Subsequent serialization will skip transferring metadata, which can reduce network traffic,
-and support type compatibility automatically.</li>
-<li><strong>Zero copy support</strong>: supports out-of-band zero copy and off-heap memory read/write.</li>
+<li>Blazing fast performance: Based on Java types, JIT compilation and Unsafe low-level operations, <strong>Fury is 170x faster than JDK, and 50~110x faster than Kryo/Hessian</strong> at most.</li>
+<li><strong>100% JDK serialization API compatibility</strong> : Supports all JDK custom serialization methods <code>writeObject</code>, <code>readObject</code>, <code>writeReplace</code>, <code>readResolve</code>, <code>readObjectNoData</code> natively to ensure the serialization correctness in any scenario. Kryo and Hessian have some correctness issues in these scenarios.</li>
+<li><strong>Type compatibility</strong>: When the deserialization and serialization class schema are inconsistent, it can still deserialize correctly. It supports application upgrade and deployment, add/delete fields independently. Fury type-compatible mode is implemented with no performance loss compared to type-consistent mode.</li>
+<li><strong>Metadata sharing</strong> : share metadata(class name, field name&type, etc.) across multiple serializations under a context (TCP connection), meta will be sent to the peer only for the first serialization, the peer can reconstruct the same deserializer based on this information. Subsequent serialization will skip transferring metadata, which can reduce network traffic, and support type compatibility automatically.</li>
+<li><strong>Zero-copy support</strong>: supports out-of-band zero copy and off-heap memory read and write.</li>
</ul>
-<h2 class="anchor anchorWithStickyNavbar_LWe7" id="cross-language-object-graph-serialization">Cross-language object graph serialization<a href="#cross-language-object-graph-serialization" class="hash-link" aria-label="Direct link to Cross-language object graph serialization" title="Direct link to Cross-language object graph serialization"></a></h2>
-<p>Fury cross-language object graph serialization is primarily used for scenarios that require
-higher dynamics and ease-of-use.
-Although frameworks like Protobuf/Flatbuffers support cross-language serialization, they still have limitations:</p>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" id="cross-language-object-graph-serialization">Cross-language object graph serialization<a href="#cross-language-object-graph-serialization" class="hash-link" aria-label="Direct link to Cross-language object graph serialization" title="Direct link to Cross-language object graph serialization"></a></h3>
+<p>Fury cross-language object graph serialization is primarily used for scenarios that require higher dynamics and ease-of-use.</p>
+<p>Although frameworks like Protobuf or FlatBuffers support cross-language serialization, they still have limitations:</p>
<ul>
<li>They require <strong>pre-defined IDLs and generate code statically ahead</strong>, lacking sufficient dynamics and flexibility;</li>
-<li>The generated classes <strong>don't conform to object-oriented design</strong> and it's impossible to add behavior to classes,
-which make them unsuitable for use as domain objects in cross-language application development.</li>
-<li>They <strong>don't support polymorphism</strong>. Object-oriented programming uses interfaces to invoke subclass methods,
-but this pattern isn't supported well in those frameworks. Although Flatbuffers offers <code>Union</code>,
-and Protobuf provides <code>OneOf/Any</code>, those API require check object type during serialization and deserialization, which
-isn't polymorphic.</li>
-<li>They <strong>don't support circular references and shared references</strong>.
-Users need to define a set of IDLs for domain objects
-and implement reference resolution by themselves,
-as well as writing code to convert between domain objects and protocol objects in each language.
-If the object graph depth is deep, more code needs to be written.</li>
+<li>The generated classes <strong>don't conform to object-oriented design</strong> and it's impossible to add behavior to classes, which make them unsuitable for use as domain objects in cross-language application development.</li>
+<li>They <strong>don't support polymorphism</strong>. Object-oriented programming uses interfaces to invoke subclass methods, but this pattern isn't supported well in those frameworks. Although FlatBuffers offers <code>Union</code>, and Protobuf provides <code>OneOf/Any</code>, those API require check object type during serialization and deserialization, which isn't polymorphic.</li>
+<li>They <strong>don't support circular references and shared references</strong>. Users need to define a set of IDLs for domain objects
+and implement reference resolution by themselves, as well as writing code to convert between domain objects and protocol objects in each language. If the object graph depth is deep, more code needs to be written.</li>
</ul>
<p>Due to the above limitations, Fury implemented a cross-language object graph serialization protocol that:</p>
<ul>
-<li><strong>Automatically serializes any object across multiple languages</strong>: By defining classes in the serialization and
-deserialization peer, objects in one language can be automatically serialized into objects in another language without
-creating IDL files, compiling schema to generate code, or writing conversion code.</li>
+<li><strong>Automatically serializes any object across multiple languages</strong>: By defining classes in the serialization and deserialization peer, objects in one language can be automatically serialized into objects in another language without creating IDL files, compiling schema to generate code, or writing conversion code.</li>
<li><strong>Automatically serializes shared and circular references</strong> across multiple languages.</li>
-<li><strong>Supports object type polymorphism</strong>, consistent with the object-oriented programming paradigm,
-and multiple subtypes can be automatically deserialized without manual intervention.</li>
+<li><strong>Supports object type polymorphism</strong>, consistent with the object-oriented programming paradigm, and multiple subtypes can be automatically deserialized without manual intervention.</li>
<li><strong>Out-of-band zero-copy</strong> is also supported in this protocol.</li>
</ul>
<p>Example of Automatic Cross-Language Serialization:</p>
<img alt="xlang serialization example" src="/img/xlang_serialization_example.png">
-<h2 class="anchor anchorWithStickyNavbar_LWe7" id="row-format">Row-format<a href="#row-format" class="hash-link" aria-label="Direct link to Row-format" title="Direct link to Row-format"></a></h2>
-<p>For <strong>high-performance computing and large-scale data transfer</strong> scenarios, data serialization and transfer are often
-the <strong>performance bottlenecks</strong> of the system. If users only need to read part of the data or filter data based on some
-field of an object, deserializing the entire data will result in unnecessary overhead. Therefore, Fury provides a
-binary data structure for <strong>direct reading and writing on binary data to avoid serialization</strong>.</p>
-<p><a href="https://arrow.apache.org/" target="_blank" rel="noopener noreferrer">Apache Arrow</a> is a standardized columnar storage format that supports binary read and write.
-However, <strong>columnar format is not suitable for all scenarios</strong>.
-Data in online and streaming computing are naturally stored row by row,
-and row is also used in columnar computing engines when involving data updates, Hash/Join/Aggregation operations.</p>
-<p>However, there is no standardized implementation for row format.
-<strong>Computing engines such as Spark/Flink/Doris/Velox all defined their row format,
-which doesn't support cross-language and can only be used internally by themselves</strong>.
-Flatbuffers does support <strong>lazy deserialization</strong>, but it requires static compilation of schema IDL
-and management of offset, which is impossible for complex scenarios.</p>
-<p>Therefore, Fury implemented a <strong>binary row format</strong> inspired
-by <a href="https://databricks.com/blog/2015/04/28/project-tungsten-bringing-spark-closer-to-bare-metal.html" target="_blank" rel="noopener noreferrer">Spark Tungsten</a>
-and <a href="https://arrow.apache.org/docs/format/Columnar.html" target="_blank" rel="noopener noreferrer">Apache Arrow format</a>, which
-allows <strong>random access and partial deserialization</strong>. Currently, Java/Python/C++ versions have been implemented,
-allowing direct reading and writing on binary data to avoid all serialization overhead, and can convert to arrow format automatically.</p>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" id="row-format">Row-format<a href="#row-format" class="hash-link" aria-label="Direct link to Row-format" title="Direct link to Row-format"></a></h3>
+<p>For <strong>high-performance computing and large-scale data transfer</strong> scenarios, data serialization and transfer are often the <strong>performance bottlenecks</strong> of the system. If users only need to read part of the data or filter data based on some field of an object, deserializing the entire data will result in unnecessary overhead. Therefore, Fury provides a binary data structure for <strong>direct reading and writing on binary data to avoid serialization</strong>.</p>
+<p><a href="https://arrow.apache.org/" target="_blank" rel="noopener noreferrer">Apache Arrow</a> is a standardized columnar storage format that supports binary read and write. However, <strong>columnar format is not suitable for all scenarios</strong>. Data in online and streaming computing are naturally stored row by row, and row is also used in columnar computing engines when involving data updates, Hash/Join/Aggregation operations.</p>
+<p>However, there is no standardized implementation for row format. <strong>Computing engines such as Spark/Flink/Doris/Velox all defined their row format, which doesn't support cross-language and can only be used internally by themselves</strong>. FlatBuffers does support <strong>lazy deserialization</strong>, but it requires static compilation of schema IDL and management of offset, which is impossible for complex scenarios.</p>
+<p>Therefore, Fury implemented a <strong>binary row format</strong> inspired by <a href="https://databricks.com/blog/2015/04/28/project-tungsten-bringing-spark-closer-to-bare-metal.html" target="_blank" rel="noopener noreferrer">Spark Tungsten</a> and <a href="https://arrow.apache.org/docs/format/Columnar.html" target="_blank" rel="noopener noreferrer">Apache Arrow format</a>, which allows <strong>random access and partial deserialization</strong>. Currently, Java/Python/C++ versions hav [...]
<img alt="xlang serialization example" src="/img/row_format.png">
-<p>This format is densely stored, byte aligned and cache-friendly, which enables faster read and write operations. By avoiding deserialization, it reduces Java GC pressure and Python overhead. Based on Python's dynamics, Fury's data structure implements special methods such as <code>getattr_/getitem/slice/etc.</code>, ensuring behavior consistency with Python dataclass/list/object, and users have no perception of this.</p>
-<h1>Performance Comparison</h1>
-<p>Here are some Java serialization performance data,
-where charts with "compatible" in the title are performance data under type compatible mode:
-support type forward/backward compatibility.
-and charts without "compatible" in the title are performance data without type compatibility:
-class schema must be same between serialization and deserialization.
-For fairness, Fury disabled the zero-copy feature for all tests.</p>
+<p>This format is densely stored, byte aligned and cache-friendly, which enables faster read and write operations. By avoiding deserialization, it reduces Java GC pressure and Python overhead. Based on Python's dynamics, Fury's data structure implements special methods such as <code>getattr</code>, <code>getitem</code>, <code>slice</code>, etc., ensuring behavior consistency with Python <code>dataclass</code>, <code>list</code>, <code>object</code>, and users have no perception [...]
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="performance-comparison">Performance Comparison<a href="#performance-comparison" class="hash-link" aria-label="Direct link to Performance Comparison" title="Direct link to Performance Comparison"></a></h2>
+<p>Here are some Java serialization performance data, where charts with "compatible" in the title are performance data under type compatible mode: Support type forward vs. Backward compatibility. Charts without "compatible" in the title are performance data without type compatibility: class schema must be same between serialization and deserialization.</p>
+<p>For fairness, Fury disabled the zero-copy feature for all tests.</p>
<p><img width="44%" alt="serialization" src="/img/case1.png"><img width="44%" alt="deserialization" src="/img/case2.png"></p>
<p><img width="44%" alt="bench_serialize_compatible_MEDIA_CONTENT_to_array_tps" src="/img/benchmarks/serialization/bench_serialize_compatible_MEDIA_CONTENT_to_array_tps.png"><img width="44%" alt="bench_deserialize_compatible_MEDIA_CONTENT_from_array_tps" src="/img/benchmarks/deserialization/bench_deserialize_compatible_MEDIA_CONTENT_from_array_tps.png"></p>
<p><img width="44%" alt="bench_serialize_STRUCT_to_array_tps" src="/img/benchmarks/serialization/bench_serialize_STRUCT_to_array_tps.png"><img width="44%" alt="bench_serialize_SAMPLE_to_array_tps" src="/img/benchmarks/serialization/bench_serialize_SAMPLE_to_array_tps.png"></p>
-<h1>Future planning(RoadMap)</h1>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="roadmap">Roadmap<a href="#roadmap" class="hash-link" aria-label="Direct link to Roadmap" title="Direct link to Roadmap"></a></h2>
<ul>
<li>Meta compression, auto meta sharing and cross-language schema compatibility.</li>
-<li>AOT Framework for c++/golang to generate code statically.</li>
-<li>C++/Rust object graph serialization support</li>
-<li>Golang/Rust/NodeJS row format support</li>
-<li>ProtoBuf compatibility support</li>
+<li>AOT Framework for C++ and Golang to generate code statically.</li>
+<li>Object graph serialization support for C++ and Rust</li>
+<li>Row format support for Golang, Rust, and NodeJS</li>
+<li>Protobuf compatibility support</li>
<li>Protocols for features and knowledge graph serialization</li>
<li>Continuously improve our serialization infrastructure for any new protocols</li>
</ul>
-<h1>Join US</h1>
-<p>We are committed to building Fury into an open and neutral community project that pursues passion and innovation. The
-development and discussion are open-sourced and transparent in the community. Any form of participation is welcome,
-including but not limited to questions, code contributions, technical discussions, etc. We are looking forward to
-receiving your ideas and feedback, participating in the project together, pushing the project forward and creating a
-better serialization framework.</p>
-<p>The GitHub address of the fury repository is:
-<a href="https://github.com/alipay/fury" target="_blank" rel="noopener noreferrer">https://github.com/alipay/fury</a></p>
-<p>Official website: <a href="https://furyio.org" target="_blank" rel="noopener noreferrer">https://furyio.org</a></p>
-<p>All issues, PR, and Discussion are welcome.</p></div><footer class="row docusaurus-mt-lg blogPostFooterDetailsFull_mRVl"><div class="col"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/blog/tags/fury">fury</a></li></ul></div></footer></article><nav class="pagination-nav docusaurus-mt-lg" aria-label="Blog post page navigation"><a class="pagination-nav__link pagination-nav__link--prev" href="/blog/fury_0_1_ [...]
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="join-us">Join us<a href="#join-us" class="hash-link" aria-label="Direct link to Join us" title="Direct link to Join us"></a></h2>
+<p>We are committed to building Apache Fury into an open and neutral community project that pursues passion and innovation. The development and discussion are open-sourced and transparent in the community. Any form of participation is welcome, including but not limited to questions, code contributions, technical discussions, etc. We are looking forward to receiving your ideas and feedback, participating in the project together, pushing the project forward and creating a better serializat [...]
+<p>The GitHub address of the fury repository is: <a href="https://github.com/apache/incubator-fury" target="_blank" rel="noopener noreferrer">https://github.com/apache/incubator-fury</a></p>
+<p>Official website: <a href="https://fury.apache.org" target="_blank" rel="noopener noreferrer">https://fury.apache.org</a></p>
+<p>All issues, PR, and Discussion are welcome.</p></div><footer class="row docusaurus-mt-lg blogPostFooterDetailsFull_mRVl"><div class="col"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/blog/tags/fury">fury</a></li></ul></div></footer></article><nav class="pagination-nav docusaurus-mt-lg" aria-label="Blog post page navigation"><a class="pagination-nav__link pagination-nav__link--next" href="/blog/fury_0_4_ [...]
<p> Apache Fury is an effort undergoing incubation at The Apache Software Foundation (ASF), sponsored by the Apache Incubator. Incubation is required of all newly accepted projects until a further review indicates that the infrastructure, communications, and decision making process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the [...]
<p>
Copyright © 2024 The Apache Software Foundation, Licensed under the Apache License, Version 2.0. <br>
diff --git a/blog/index.html b/blog/index.html
index 389d07e..8979eff 100644
--- a/blog/index.html
+++ b/blog/index.html
@@ -5,11 +5,11 @@
<meta name="generator" content="Docusaurus v3.0.1">
<title data-rh="true">Blog | Apache Fury (incubating)</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://fury.apache.org/blog"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" http- [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache Fury (incubating) Atom Feed"><link rel="stylesheet" href="/assets/css/styles.d3c1e154.css">
-<script src="/assets/js/runtime~main.4b29d538.js" defer="defer"></script>
-<script src="/assets/js/main.4989193f.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.1a67ee30.js" defer="defer"></script>
+<script src="/assets/js/main.683e6d58.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
-<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
<p>I'm pleased to announce the 0.4.1 release of the Fury: <a href="https://github.com/alipay/fury/releases/tag/v0.4.1" target="_blank" rel="noopener noreferrer">https://github.com/alipay/fury/releases/tag/v0.4.1</a>. With this release, Fury support rust row format now. C++ row format has been enhanced too, now iterable types can be encoded to fury row format. Please try it out and share your feedbacks with us.</p></div><footer class="row docusaurus-mt-lg"><div class="col col--9"><b> [...]
<p>I'm pleased to announce the 0.4.0 release of the Fury. With this release, <a href="https://www.graalvm.org/latest/reference-manual/native-image/" target="_blank" rel="noopener noreferrer">GraalVM native image</a> and C++ row format automatic encoder based on compile-time reflection are supported. Please try it out and share your feedbacks with us.</p></div><footer class="row docusaurus-mt-lg"><div class="col col--9"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"> [...]
<p>I'm pleased to announce the 0.3.1 release of the Fury. With this release, fury supports python 3.11&3.12, droped python 3.6 support.
@@ -96,7 +96,7 @@ Multiple scala serialization JIT optimization are included, and java serializati
<li>[[Java] refine AllowListChecker (#893)</li>
</ul>
<p><strong>Full Changelog</strong>: <a href="https://github.com/alipay/fury/compare/v0.1.0...v0.1.1" target="_blank" rel="noopener noreferrer">https://github.com/alipay/fury/compare/v0.1.0...v0.1.1</a></p></div><footer class="row docusaurus-mt-lg"><div class="col"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/blog/tags/fury">fury</a></li></ul></div></footer></article><article class="margin-bottom--xl" itemp [...]
-<p>I'm pleased to announce the 0.1.0 release of the Fury. Fury 0.1.0 is our first release since we started the development in github in 2023.04.28, and open sourced in 2023.07.15. This release includes many features: production-ready Java serialization, cross language serialization for Java/Python/JavaScript/Rust, row format support and so on.</p></div><footer class="row docusaurus-mt-lg"><div class="col col--9"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li cla [...]
+<p>I'm pleased to announce the 0.1.0 release of the Fury. Fury 0.1.0 is our first release since we started the development in github in 2023.04.28, and open sourced in 2023.07.15. This release includes many features: production-ready Java serialization, cross language serialization for Java/Python/JavaScript/Rust, row format support and so on.</p></div><footer class="row docusaurus-mt-lg"><div class="col col--9"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li cla [...]
<p> Apache Fury is an effort undergoing incubation at The Apache Software Foundation (ASF), sponsored by the Apache Incubator. Incubation is required of all newly accepted projects until a further review indicates that the infrastructure, communications, and decision making process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the [...]
<p>
Copyright © 2024 The Apache Software Foundation, Licensed under the Apache License, Version 2.0. <br>
diff --git a/blog/rss.xml b/blog/rss.xml
index 2680809..d9b1cd7 100644
--- a/blog/rss.xml
+++ b/blog/rss.xml
@@ -4,10 +4,168 @@
<title>Apache Fury (incubating) Blog</title>
<link>https://fury.apache.org/blog</link>
<description>Apache Fury (incubating) Blog</description>
- <lastBuildDate>Sat, 09 Dec 2023 00:00:00 GMT</lastBuildDate>
+ <lastBuildDate>Thu, 25 Apr 2024 00:00:00 GMT</lastBuildDate>
<docs>https://validator.w3.org/feed/docs/rss2.html</docs>
<generator>https://github.com/jpmonette/feed</generator>
<language>en</language>
+ <item>
+ <title><![CDATA[Apache Fury: A blazing fast multi-language serialization framework powered by JIT and zero-copy]]></title>
+ <link>https://fury.apache.org/blog/fury_blazing_fast_multiple_language_serialization_framework</link>
+ <guid>https://fury.apache.org/blog/fury_blazing_fast_multiple_language_serialization_framework</guid>
+ <pubDate>Thu, 25 Apr 2024 00:00:00 GMT</pubDate>
+ <description><![CDATA[Apache Fury (incubating) is a multi-language serialization framework powered by JIT dynamic compilation and zero copy. It implements multi-language SDKs: Java, Python, Golang, JavaScript, Rust, C++. It provides automatic multi-language objects serialization features, and 170x speedup compared to JDK serialization.]]></description>
+ <content:encoded><![CDATA[<p>Apache Fury (incubating) is a multi-language serialization framework powered by JIT dynamic compilation and zero copy. It implements multi-language SDKs: Java, Python, Golang, JavaScript, Rust, C++. It provides automatic multi-language objects serialization features, and 170x speedup compared to JDK serialization.</p>
+<p>The GitHub address of fury repository is: <a href="https://github.com/apache/incubator-fury" target="_blank" rel="noopener noreferrer">https://github.com/apache/incubator-fury</a></p>
+<img alt="fury banner" src="https://fury.apache.org/img/fury_banner.png">
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="background">Background<a href="https://fury.apache.org/blog/fury_blazing_fast_multiple_language_serialization_framework#background" class="hash-link" aria-label="Direct link to Background" title="Direct link to Background"></a></h2>
+<p>Serialization is a basic component of system communication, and widely used in big data, AI framework, cloud native and other distributed systems. <strong>Data transfer between processes, languages, nodes, or object persistence, state read-write and copy</strong>, all need serialization. The performance and ease-of-use of serialization affects <strong>runtime and development efficiency</strong> of the system.</p>
+<p>Static serialization frameworks like <a href="https://github.com/protocolbuffers/protobuf" target="_blank" rel="noopener noreferrer">Protobuf</a> or <a href="https://github.com/google/flatbuffers" target="_blank" rel="noopener noreferrer">FlatBuffers</a> cannot be used for cross-language <a href="https://en.wikipedia.org/wiki/Domain-driven_design" target="_blank" rel="noopener noreferrer">application development</a> directly, because they <strong>don't support shared reference and pol [...]
+<p>Dynamic serialization frameworks such as JDK serialization, Kryo, Fst, Hessian, Pickle provide ease-of-use and dynamics, but <strong>don't support cross-language</strong> and suffer significant <strong>performance issues</strong>, which is unsuitable for high throughput, low latency, and large-scale data transfer scenarios.</p>
+<p>Therefore, we developed a new multi-language serialization framework <strong>Apache Fury</strong>, which is open-sourced on <a href="https://github.com/apache/incubator-fury" target="_blank" rel="noopener noreferrer">https://github.com/apache/incubator-fury</a>. Through <strong>highly optimized serialization primitives, JIT dynamic compilation and zero-copy</strong> technologies, Fury is both fast and easy-to-use. It can <strong>cross-language serialize any object automatically</stron [...]
+<p><img width="44%" alt="serialization" src="https://fury.apache.org/img/case1.png"><img width="44%" alt="deserialization" src="https://fury.apache.org/img/case2.png"></p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-is-apache-fury">What is Apache Fury?<a href="https://fury.apache.org/blog/fury_blazing_fast_multiple_language_serialization_framework#what-is-apache-fury" class="hash-link" aria-label="Direct link to What is Apache Fury?" title="Direct link to What is Apache Fury?"></a></h2>
+<p>Apache Fury is a multi-language serialization framework powered by JIT dynamic compilation and zero copy, providing blazing
+fast speed and ease of use:</p>
+<ul>
+<li><strong>Multiple languages</strong>: Java, Python, C++, Golang, JavaScript, Rust. Other languages can be added easily.</li>
+<li><strong>Highly optimized serialization primitives</strong>.</li>
+<li><strong>Zero-copy</strong>: Support <a href="https://peps.python.org/pep-0574/" target="_blank" rel="noopener noreferrer">out-of-band</a> serialization and off-heap read/write.</li>
+<li><strong>High performance</strong>: Use JIT to generate serialization code at runtime in an async multithreaded way, which can optimize methods inlining, code cache, dead code elimination, hash lookup, meta writing and memory read/write.</li>
+<li><strong>Multi protocols</strong>: Provide flexibility and ease of use of dynamic serialization, as well as the cross-language of static serialization.<!-- -->
+<ul>
+<li><strong>Java Serialization</strong>:<!-- -->
+<ul>
+<li>Drop-in replaces JDK, Kryo, and Hessian. No need to modify user code, but providing 170x speed up at most, which can improve efficiency of rpc, data transfer and object persistence significantly.</li>
+<li>100% JDK compatible, support JDK custom serialization methods <code>writeObject</code>, <code>readObject</code>, <code>writeReplace</code>, <code>readResolve</code>, <code>readObjectNoData</code> natively.</li>
+</ul>
+</li>
+<li><strong>Cross-language object graph</strong>:<!-- -->
+<ul>
+<li>Cross-language serialize any objects automatically, no need for IDL, schema compilation, and object/protocol conversion.</li>
+<li>Cross-language serialize shared/circular reference, no data duplication or recursion error.</li>
+<li>Support object polymorphism, multiple children type objects can be serialized simultaneously.</li>
+</ul>
+</li>
+<li><strong>Row format</strong>
+<ul>
+<li>A cache-friendly binary random-access format, supports skipping deserialization and lazy deserialization, efficient for high-performance computing and large-scale data transfer.</li>
+<li>Support automatic conversion to Apache Arrow.</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="core-serialization-capabilities">Core Serialization Capabilities<a href="https://fury.apache.org/blog/fury_blazing_fast_multiple_language_serialization_framework#core-serialization-capabilities" class="hash-link" aria-label="Direct link to Core Serialization Capabilities" title="Direct link to Core Serialization Capabilities"></a></h2>
+<p>Although different scenarios require different serialization protocols, the underlying operations of serialization are
+similar.</p>
+<p>Therefore, Fury defines and implements <strong>a set of basic serialization capabilities</strong>, which can be used for quickly building new multi-language serialization protocols and get speedup by JIT acceleration and other optimizations.</p>
+<p>At the same time, performance optimization for a protocol on the primitives can also benefit all other protocols.</p>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" id="serialization-primitives">Serialization Primitives<a href="https://fury.apache.org/blog/fury_blazing_fast_multiple_language_serialization_framework#serialization-primitives" class="hash-link" aria-label="Direct link to Serialization Primitives" title="Direct link to Serialization Primitives"></a></h3>
+<p>Common serialization operations contains:</p>
+<ul>
+<li>Bitmap operations</li>
+<li>Number encoding and decoding</li>
+<li>Compression for int and long</li>
+<li>String creation and copy</li>
+<li>String encoding: ASCII, UTF8, UTF16</li>
+<li>Memory copy</li>
+<li>Array copy and compression</li>
+<li>Meta encoding, compression, and cache</li>
+</ul>
+<p>Fury use SIMD and other advanced language features to make basic operations extremely fast in every languages.</p>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" id="zero-copy-serialization">Zero-copy Serialization<a href="https://fury.apache.org/blog/fury_blazing_fast_multiple_language_serialization_framework#zero-copy-serialization" class="hash-link" aria-label="Direct link to Zero-copy Serialization" title="Direct link to Zero-copy Serialization"></a></h3>
+<p>Large-scale data transfer often has multiple binary buffers in an object graph. Some serialization frameworks will write the binaries into an intermediate buffer and introduce multiple time-consuming memory copies. Fury implemented an <strong>out-of-band serialization protocol</strong> inspired by <a href="https://peps.python.org/pep-0574/" target="_blank" rel="noopener noreferrer">pickle5</a>, Ray and Apache Arrow, which can <strong>capture all binary buffers</strong> in an object gr [...]
+<p>The following figure shows the serialization process of zero-copy:</p>
+<img alt="fury zero copy" src="https://fury.apache.org/img/fury_zero_copy.jpeg">
+<p>Currently, Fury supports the following types of zero-copy:</p>
+<ul>
+<li>Java: all basic types of arrays, <code>ByteBuffer</code>, <code>ArrowRecordBatch</code>, and <code>VectorSchemaRoot</code></li>
+<li>Python: all arrays of the array module, numpy arrays, <code>pyarrow.Table</code>, and <code>pyarrow.RecordBatch</code></li>
+<li>Golang: byte slice</li>
+</ul>
+<p>You can also add the new zero copy type based on the Fury interface.</p>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" id="jit-dynamic-compilation-acceleration">JIT dynamic compilation acceleration<a href="https://fury.apache.org/blog/fury_blazing_fast_multiple_language_serialization_framework#jit-dynamic-compilation-acceleration" class="hash-link" aria-label="Direct link to JIT dynamic compilation acceleration" title="Direct link to JIT dynamic compilation acceleration"></a></h3>
+<p>Custom type objects usually contain lots of type information, Fury used this information to generate efficient serialization code at runtime, which can push lots of runtime operations into the dynamic compilation stage. By inlining more methods, better code cache, reducing virtual method calls, conditional branches, hash lookup, metadata writes, and memory reads/writes, the serialization performance is greatly accelerated.</p>
+<p>For Java, Fury implements a <strong>runtime codegen framework</strong> and defines an <a href="https://en.wikipedia.org/wiki/Intermediate_representation" target="_blank" rel="noopener noreferrer">operator expression IR</a>. Then fury can perform type inference based on the generic type information of the object at runtime to build an expression tree that describes the logic of serialized code.</p>
+<p>The codegen framework will generate efficient Java code from the expression tree, then pass to <a href="https://github.com/janino-compiler/janino" target="_blank" rel="noopener noreferrer">Janino</a> to compile it into bytecode, and load it into the user's ClassLoader or the ClassLoader created by Fury, and finally compile it into efficient assembly code through Java JIT.</p>
+<p>Since JVM JIT skips Big method compilation and inlining, Fury also implements an optimizer to <strong>split big methods into small methods recursively</strong>, thus ensuring that all code can be compiled and inlined.</p>
+<img alt="fury java codegen" src="https://fury.apache.org/img/fury_java_codegen.png">
+<p>Fury also supports <strong>asynchronous multithreaded compilation</strong> by running the codegen tasks in a thread pool, and using interpretation mode until JIT finishes to ensure no serialization burrs. Users can skip warm up serialization of objects.</p>
+<p>Python and JavaScript codegen are similar. Generating source code is easier for development and troubleshooting problems.</p>
+<p>Since serialization will manipulate objects extensively in each programming language, and the language does not expose the low-level API of the memory model, native methods call has a large cost too, so we cannot use <a href="https://www.llvm.org/" target="_blank" rel="noopener noreferrer">LLVM</a> to build a unified serializer JIT framework. Instead, we implemented a codegen framework for every language separately.</p>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" id="static-code-generation">Static code generation<a href="https://fury.apache.org/blog/fury_blazing_fast_multiple_language_serialization_framework#static-code-generation" class="hash-link" aria-label="Direct link to Static code generation" title="Direct link to Static code generation"></a></h3>
+<p>Although JIT compilation can greatly improve serialization efficiency and generate better serialization code based on the statistical distribution of data at runtime, languages like C++ do not support reflection, have no virtual machines, and no low-level API for memory models. We cannot generate serialization code dynamically for such languages through JIT.</p>
+<p>In such scenarios, Fury is implementing an <strong>AOT codegen framework</strong>, which generates the serialized code statically according to the object schema, and objects can be serialized automatically using the generated serializer. For Rust, Rust macro is used to generate code statically.</p>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" id="cache-optimization">Cache optimization<a href="https://fury.apache.org/blog/fury_blazing_fast_multiple_language_serialization_framework#cache-optimization" class="hash-link" aria-label="Direct link to Cache optimization" title="Direct link to Cache optimization"></a></h3>
+<p>When serializing a custom type, fury will <strong>reorder fields</strong> to ensure that fields of the same type are serialized in order. This can hit more data cache and CPU instruction cache.</p>
+<p>The basic type fields are written <strong>in descending order by byte size</strong>. In this way, if the initial addresses are aligned, subsequent read and write operations will occur at the position where the memory addresses are aligned, making CPU execution more efficient.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="multi-protocol-design-and-implementation">Multi-protocol Design and Implementation<a href="https://fury.apache.org/blog/fury_blazing_fast_multiple_language_serialization_framework#multi-protocol-design-and-implementation" class="hash-link" aria-label="Direct link to Multi-protocol Design and Implementation" title="Direct link to Multi-protocol Design and Implementation"></a></h2>
+<p>Based on the multi-language serialization features provided by Fury core, we have built three serialization protocols for different scenarios:</p>
+<ul>
+<li><strong>Java serialization</strong>: Suitable for pure Java serialization scenarios and provides up to 170x speed up;</li>
+<li><strong>Cross-language object graph serialization</strong>: Suitable for application-oriented multi-language programming and
+high-performance cross-language serialization;</li>
+<li><strong>Row-format serialization</strong>: Suitable for distributed computing engines such as Apache Spark, Apache Flink, Apache Doris, Velox, and features frameworks.</li>
+</ul>
+<p>In the future, we will add new protocols for other core scenarios. Users can also build their own protocols based on Fury's serialization framework.</p>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" id="java-serialization">Java serialization<a href="https://fury.apache.org/blog/fury_blazing_fast_multiple_language_serialization_framework#java-serialization" class="hash-link" aria-label="Direct link to Java serialization" title="Direct link to Java serialization"></a></h3>
+<p>Java is widely used in <strong>big data, cloud native, microservices, and enterprise applications</strong>. Therefore, Fury made lots of optimizations for Java serialization, which reduces system latency and server costs a lot, and improves throughput significantly. Our implementation has the following highlights:</p>
+<ul>
+<li>Blazing fast performance: Based on Java types, JIT compilation and Unsafe low-level operations, <strong>Fury is 170x faster than JDK, and 50~110x faster than Kryo/Hessian</strong> at most.</li>
+<li><strong>100% JDK serialization API compatibility</strong> : Supports all JDK custom serialization methods <code>writeObject</code>, <code>readObject</code>, <code>writeReplace</code>, <code>readResolve</code>, <code>readObjectNoData</code> natively to ensure the serialization correctness in any scenario. Kryo and Hessian have some correctness issues in these scenarios.</li>
+<li><strong>Type compatibility</strong>: When the deserialization and serialization class schema are inconsistent, it can still deserialize correctly. It supports application upgrade and deployment, add/delete fields independently. Fury type-compatible mode is implemented with no performance loss compared to type-consistent mode.</li>
+<li><strong>Metadata sharing</strong> : share metadata(class name, field name&type, etc.) across multiple serializations under a context (TCP connection), meta will be sent to the peer only for the first serialization, the peer can reconstruct the same deserializer based on this information. Subsequent serialization will skip transferring metadata, which can reduce network traffic, and support type compatibility automatically.</li>
+<li><strong>Zero-copy support</strong>: supports out-of-band zero copy and off-heap memory read and write.</li>
+</ul>
+<h3 class="anchor anchorWithStickyNavbar_LWe7" id="cross-language-object-graph-serialization">Cross-language object graph serialization<a href="https://fury.apache.org/blog/fury_blazing_fast_multiple_language_serialization_framework#cross-language-object-graph-serialization" class="hash-link" aria-label="Direct link to Cross-language object graph serialization" title="Direct link to Cross-language object graph serialization"></a></h3>
+<p>Fury cross-language object graph serialization is primarily used for scenarios that require higher dynamics and ease-of-use.</p>
+<p>Although frameworks like Protobuf or FlatBuffers support cross-language serialization, they still have limitations:</p>
+<ul>
+<li>They require <strong>pre-defined IDLs and generate code statically ahead</strong>, lacking sufficient dynamics and flexibility;</li>
+<li>The generated classes <strong>don't conform to object-oriented design</strong> and it's impossible to add behavior to classes, which make them unsuitable for use as domain objects in cross-language application development.</li>
+<li>They <strong>don't support polymorphism</strong>. Object-oriented programming uses interfaces to invoke subclass methods, but this pattern isn't supported well in those frameworks. Although FlatBuffers offers <code>Union</code>, and Protobuf provides <code>OneOf/Any</code>, those API require check object type during serialization and deserialization, which isn't polymorphic.</li>
+<li>They <strong>don't support circular references and shared references</strong>. Users need to define a set of IDLs for domain objects
+and implement reference resolution by themselves, as well as writing code to convert between domain objects and protocol objects in each language. If the object graph depth is deep, more code needs to be written.</li>
+</ul>
+<p>Due to the above limitations, Fury implemented a cross-language object graph serialization protocol that:</p>
+<ul>
+<li><strong>Automatically serializes any object across multiple languages</strong>: By defining classes in the serialization and deserialization peer, objects in one language can be automatically serialized into objects in another language without creating IDL files, compiling schema to generate code, or writing conversion code.</li>
+<li><strong>Automatically serializes shared and circular references</strong> across multiple languages.</li>
+<li><strong>Supports object type polymorphism</strong>, consistent with the object-oriented programming paradigm, and multiple subtypes can be automatically deserialized without manual intervention.</li>
+<li><strong>Out-of-band zero-copy</strong> is also supported in this protocol.</li>
+</ul>
+<p>Example of Automatic Cross-Language Serialization:</p>
+<img alt="xlang serialization example" src="https://fury.apache.org/img/xlang_serialization_example.png">
+<h3 class="anchor anchorWithStickyNavbar_LWe7" id="row-format">Row-format<a href="https://fury.apache.org/blog/fury_blazing_fast_multiple_language_serialization_framework#row-format" class="hash-link" aria-label="Direct link to Row-format" title="Direct link to Row-format"></a></h3>
+<p>For <strong>high-performance computing and large-scale data transfer</strong> scenarios, data serialization and transfer are often the <strong>performance bottlenecks</strong> of the system. If users only need to read part of the data or filter data based on some field of an object, deserializing the entire data will result in unnecessary overhead. Therefore, Fury provides a binary data structure for <strong>direct reading and writing on binary data to avoid serialization</strong>.</p>
+<p><a href="https://arrow.apache.org/" target="_blank" rel="noopener noreferrer">Apache Arrow</a> is a standardized columnar storage format that supports binary read and write. However, <strong>columnar format is not suitable for all scenarios</strong>. Data in online and streaming computing are naturally stored row by row, and row is also used in columnar computing engines when involving data updates, Hash/Join/Aggregation operations.</p>
+<p>However, there is no standardized implementation for row format. <strong>Computing engines such as Spark/Flink/Doris/Velox all defined their row format, which doesn't support cross-language and can only be used internally by themselves</strong>. FlatBuffers does support <strong>lazy deserialization</strong>, but it requires static compilation of schema IDL and management of offset, which is impossible for complex scenarios.</p>
+<p>Therefore, Fury implemented a <strong>binary row format</strong> inspired by <a href="https://databricks.com/blog/2015/04/28/project-tungsten-bringing-spark-closer-to-bare-metal.html" target="_blank" rel="noopener noreferrer">Spark Tungsten</a> and <a href="https://arrow.apache.org/docs/format/Columnar.html" target="_blank" rel="noopener noreferrer">Apache Arrow format</a>, which allows <strong>random access and partial deserialization</strong>. Currently, Java/Python/C++ versions hav [...]
+<img alt="xlang serialization example" src="https://fury.apache.org/img/row_format.png">
+<p>This format is densely stored, byte aligned and cache-friendly, which enables faster read and write operations. By avoiding deserialization, it reduces Java GC pressure and Python overhead. Based on Python's dynamics, Fury's data structure implements special methods such as <code>getattr</code>, <code>getitem</code>, <code>slice</code>, etc., ensuring behavior consistency with Python <code>dataclass</code>, <code>list</code>, <code>object</code>, and users have no perception of this.</p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="performance-comparison">Performance Comparison<a href="https://fury.apache.org/blog/fury_blazing_fast_multiple_language_serialization_framework#performance-comparison" class="hash-link" aria-label="Direct link to Performance Comparison" title="Direct link to Performance Comparison"></a></h2>
+<p>Here are some Java serialization performance data, where charts with "compatible" in the title are performance data under type compatible mode: Support type forward vs. Backward compatibility. Charts without "compatible" in the title are performance data without type compatibility: class schema must be same between serialization and deserialization.</p>
+<p>For fairness, Fury disabled the zero-copy feature for all tests.</p>
+<p><img width="44%" alt="serialization" src="https://fury.apache.org/img/case1.png"><img width="44%" alt="deserialization" src="https://fury.apache.org/img/case2.png"></p>
+<p><img width="44%" alt="bench_serialize_compatible_MEDIA_CONTENT_to_array_tps" src="https://fury.apache.org/img/benchmarks/serialization/bench_serialize_compatible_MEDIA_CONTENT_to_array_tps.png"><img width="44%" alt="bench_deserialize_compatible_MEDIA_CONTENT_from_array_tps" src="https://fury.apache.org/img/benchmarks/deserialization/bench_deserialize_compatible_MEDIA_CONTENT_from_array_tps.png"></p>
+<p><img width="44%" alt="bench_serialize_STRUCT_to_array_tps" src="https://fury.apache.org/img/benchmarks/serialization/bench_serialize_STRUCT_to_array_tps.png"><img width="44%" alt="bench_serialize_SAMPLE_to_array_tps" src="https://fury.apache.org/img/benchmarks/serialization/bench_serialize_SAMPLE_to_array_tps.png"></p>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="roadmap">Roadmap<a href="https://fury.apache.org/blog/fury_blazing_fast_multiple_language_serialization_framework#roadmap" class="hash-link" aria-label="Direct link to Roadmap" title="Direct link to Roadmap"></a></h2>
+<ul>
+<li>Meta compression, auto meta sharing and cross-language schema compatibility.</li>
+<li>AOT Framework for C++ and Golang to generate code statically.</li>
+<li>Object graph serialization support for C++ and Rust</li>
+<li>Row format support for Golang, Rust, and NodeJS</li>
+<li>Protobuf compatibility support</li>
+<li>Protocols for features and knowledge graph serialization</li>
+<li>Continuously improve our serialization infrastructure for any new protocols</li>
+</ul>
+<h2 class="anchor anchorWithStickyNavbar_LWe7" id="join-us">Join us<a href="https://fury.apache.org/blog/fury_blazing_fast_multiple_language_serialization_framework#join-us" class="hash-link" aria-label="Direct link to Join us" title="Direct link to Join us"></a></h2>
+<p>We are committed to building Apache Fury into an open and neutral community project that pursues passion and innovation. The development and discussion are open-sourced and transparent in the community. Any form of participation is welcome, including but not limited to questions, code contributions, technical discussions, etc. We are looking forward to receiving your ideas and feedback, participating in the project together, pushing the project forward and creating a better serializat [...]
+<p>The GitHub address of the fury repository is: <a href="https://github.com/apache/incubator-fury" target="_blank" rel="noopener noreferrer">https://github.com/apache/incubator-fury</a></p>
+<p>Official website: <a href="https://fury.apache.org/" target="_blank" rel="noopener noreferrer">https://fury.apache.org</a></p>
+<p>All issues, PR, and Discussion are welcome.</p>]]></content:encoded>
+ <category>fury</category>
+ </item>
<item>
<title><![CDATA[Fury 0.4.1 Released]]></title>
<link>https://fury.apache.org/blog/fury_0_4_1_release</link>
@@ -985,269 +1143,5 @@ For details, please refer to the following commit messages.</p>
<p><strong>Full Changelog</strong>: <a href="https://github.com/alipay/fury/commits/v0.1.0" target="_blank" rel="noopener noreferrer">https://github.com/alipay/fury/commits/v0.1.0</a></p>]]></content:encoded>
<category>fury</category>
</item>
- <item>
- <title><![CDATA[Fury - A blazing fast multi-language serialization framework powered by jit and zero-copy]]></title>
- <link>https://fury.apache.org/blog/fury_blazing_fast_multiple_language_serialization_framework</link>
- <guid>https://fury.apache.org/blog/fury_blazing_fast_multiple_language_serialization_framework</guid>
- <pubDate>Sat, 15 Jul 2023 00:00:00 GMT</pubDate>
- <description><![CDATA[Fury is a multi-language serialization framework powered by JIT dynamic compilation and zero copy. It supports Java/Python/Golang/JavaScript/Rust/C++, provide automatic multi-language objects serialization features, and 170x speedup compared to JDK serialization.]]></description>
- <content:encoded><![CDATA[<p>Fury is a multi-language serialization framework powered by JIT dynamic compilation and zero copy. It supports Java/Python/Golang/JavaScript/Rust/C++, provide automatic multi-language objects serialization features, and 170x speedup compared to JDK serialization.</p>
-<p>Author: <a href="https://github.com/chaokunyang" target="_blank" rel="noopener noreferrer">chaokunyang</a></p>
-<blockquote>
-<p>Fury is a blazing fast <strong>multi-language serialization</strong> framework powered by <strong>jit(just-in-time compilation) and
-zero-copy</strong>, providing up to <strong>170x performance</strong> and ultimate <strong>ease of use</strong>.</p>
-</blockquote>
-<p>The GitHub address of fury repository is: <a href="https://github.com/alipay/fury" target="_blank" rel="noopener noreferrer">https://github.com/alipay/fury</a></p>
-<img alt="fury banner" src="https://fury.apache.org/img/fury_banner.png">
-<h1>Background</h1>
-<p>Serialization is a basic component of system communication, and widely used in big data, AI framework, cloud native and
-other distributed systems.
-<strong>Data transfer between processes/languages/nodes, or object persistence, state read/write and
-copy</strong> all need serialization.
-The performance and ease-of-use of serialization affects <strong>runtime and development efficiency</strong> of the system.</p>
-<p>Static serialization frameworks
-like <a href="https://github.com/protocolbuffers/protobuf" target="_blank" rel="noopener noreferrer">protobuf</a>/<a href="https://github.com/google/flatbuffers" target="_blank" rel="noopener noreferrer">flatbuffers</a>
-can't be used for cross-language <a href="https://en.wikipedia.org/wiki/Domain-driven_design" target="_blank" rel="noopener noreferrer">application development</a> directly,
-because they <strong>don't support shared reference and polymorphism</strong>, and also need to <strong>generate code ahead</strong>.
-Dynamic serialization frameworks such as JDK serialization, Kryo, Fst, Hessian, Pickle provide ease-of-use and dynamics,
-but <strong>don't support cross-language</strong> and suffer significant <strong>performance issues</strong>,
-which is unsuitable for high throughput, low latency, and large-scale data transfer scenarios.</p>
-<p>Therefore, we developed a new multi-language serialization framework <strong><a href="https://github.com/alipay/fury" target="_blank" rel="noopener noreferrer">Fury</a></strong>, which is
-now open-sourced on <a href="https://github.com/alipay/fury" target="_blank" rel="noopener noreferrer">https://github.com/alipay/fury</a>. Through <strong>highly optimized serialization primitives, JIT dynamic compilation and Zero-Copy</strong> technologies,
-Fury is both fast and easy to use. It can <strong>cross-language serialize any object automatically</strong> and provides <strong>ultimate performance</strong> at the same time.</p>
-<p><img width="44%" alt="serialization" src="https://fury.apache.org/img/case1.png"><img width="44%" alt="deserialization" src="https://fury.apache.org/img/case2.png"></p>
-<h1>What is Fury</h1>
-<p>Fury is a multi-language serialization framework powered by JIT dynamic compilation and zero copy, providing blazing
-fast speed and ease of use:</p>
-<ul>
-<li><strong>Multiple languages</strong>: Java/Python/C++/Golang/JavaScript/Rust, other languages can be added easily.</li>
-<li><strong>Highly optimized serialization primitives</strong>.</li>
-<li><strong>Zero-Copy</strong>: support <a href="https://peps.python.org/pep-0574/" target="_blank" rel="noopener noreferrer">out-of-band</a> serialization and off-heap read/write.</li>
-<li><strong>High performance</strong>: Use JIT(just-in-time) to generate serialization code at runtime in an async multithreaded way,
-which can optimize methods inlining, code cache, dead code elimination, hash lookup, meta writing and memory
-read/writing.</li>
-<li><strong>Multi protocols</strong>: providing flexibility and ease-of-use of dynamic serialization, as well as the cross-language of
-static serialization.<!-- -->
-<ul>
-<li><strong>Java Serialization</strong>:<!-- -->
-<ul>
-<li>Drop-in replaces <code>JDK/Kryo/Hessian</code>, no need to modify user code, but providing 170x speed up at most, which can
-improve efficiency of rpc, data transfer and object persistence significantly.</li>
-<li>100% JDK compatible, support JDK custom serialization
-methods <code>writeObject/readObject/writeReplace/readResolve/readObjectNoData</code> natively.</li>
-</ul>
-</li>
-<li><strong>Cross-language object graph</strong>:<!-- -->
-<ul>
-<li>Cross-language serialize any objects automatically, no need for IDL, schema compilation, and object/protocol
-conversion.</li>
-<li>Cross-language serialize shared/circular reference, no data duplication or recursion error.</li>
-<li>Support object polymorphism, multiple children type objects can be serialized simultaneously.</li>
-</ul>
-</li>
-<li><strong>Row format</strong>
-<ul>
-<li>A cache-friendly binary random-access format, supports skipping deserialization and lazy deserialization,
-efficient
-for high-performance computing and large-scale data transfer.</li>
-<li>Support automatic conversion to apache arrow.</li>
-</ul>
-</li>
-</ul>
-</li>
-</ul>
-<h1>Core Serialization Capabilities</h1>
-<p>Although different scenarios require different serialization protocols, the underlying operations of serialization are
-similar.
-Therefore, Fury defines and implements <strong>a set of basic serialization capabilities</strong>,
-which can be used for quickly building new multi-language serialization protocols
-and get speedup by jit acceleration and other optimizations.
-At the same time, performance optimization for a protocol on the primitives can also benefit all other protocols.</p>
-<h2 class="anchor anchorWithStickyNavbar_LWe7" id="serialization-primitives">Serialization Primitives<a href="https://fury.apache.org/blog/fury_blazing_fast_multiple_language_serialization_framework#serialization-primitives" class="hash-link" aria-label="Direct link to Serialization Primitives" title="Direct link to Serialization Primitives"></a></h2>
-<p>Common serialization operations contains:</p>
-<ul>
-<li>bitmap operations</li>
-<li>number encoding/decoding</li>
-<li>int/long compression</li>
-<li>String creation/copy</li>
-<li>String encoding: ASCII/UTF8/UTF16</li>
-<li>memory copy</li>
-<li>array copy&compression</li>
-<li>meta encoding&compression&cache</li>
-</ul>
-<p>Fury use SIMD and other advanced language features to make basic operations extremely fast in every languages.</p>
-<h2 class="anchor anchorWithStickyNavbar_LWe7" id="zero-copy-serialization">Zero-Copy Serialization<a href="https://fury.apache.org/blog/fury_blazing_fast_multiple_language_serialization_framework#zero-copy-serialization" class="hash-link" aria-label="Direct link to Zero-Copy Serialization" title="Direct link to Zero-Copy Serialization"></a></h2>
-<p>Large-scale data transfer often has multiple binary buffers in an object graph. Some serialization frameworks
-will write the binaries into an intermediate buffer and introduce multiple time-consuming memory
-copies. Fury implemented an <strong>out-of-band serialization protocol</strong> inspired by <a href="https://peps.python.org/pep-0574/" target="_blank" rel="noopener noreferrer">pickle5</a>,
-ray and arrow, which can
-<strong>capture all binary buffers</strong> in an object graph to avoid intermediate copies of these buffers.
-The following figure shows the serialization process of zero-copy:</p>
-<img alt="fury zero copy" src="https://fury.apache.org/img/fury_zero_copy.jpeg">
-<p>Currently, Fury supports the following types of zero-copy:</p>
-<ul>
-<li>java: all basic types of arrays, <code>ByteBuffer</code>, <code>ArrowRecordBatch</code>, and <code>VectorSchemaRoot</code></li>
-<li>python: all arrays of the array module, numpy arrays, <code>pyarrow.Table,</code> and <code>pyarrow.RecordBatch</code></li>
-<li>golang<!-- -->:byte<!-- --> slice</li>
-</ul>
-<p>You can also add the new zero copy type based on the Fury interface.</p>
-<h2 class="anchor anchorWithStickyNavbar_LWe7" id="jit-dynamic-compilation-acceleration">JIT dynamic compilation acceleration<a href="https://fury.apache.org/blog/fury_blazing_fast_multiple_language_serialization_framework#jit-dynamic-compilation-acceleration" class="hash-link" aria-label="Direct link to JIT dynamic compilation acceleration" title="Direct link to JIT dynamic compilation acceleration"></a></h2>
-<p>Custom type objects usually contain lots of type information, Fury used this information to generate
-efficient serialization code at runtime, which can push lots of runtime operations into the dynamic compilation
-stage. By inlining more methods, better code cache, reducing virtual method calls, conditional branches, hash lookup,
-metadata writes, and memory reads/writes, the serialization performance is greatly accelerated.</p>
-<p>For Java, Fury implements a <strong>runtime codegen framework</strong> and defines
-an <a href="https://en.wikipedia.org/wiki/Intermediate_representation" target="_blank" rel="noopener noreferrer">operator expression IR</a>.
-Then fury can perform type inference based
-on the generic type information of the object at runtime to build an expression tree
-that describes the logic of serialized code.
-The codegen framework will generate efficient Java code from the expression tree, then pass
-to <a href="https://github.com/janino-compiler/janino" target="_blank" rel="noopener noreferrer">Janino</a> to compile it into bytecode,
-and load it into the user's ClassLoader or the ClassLoader created by Fury,
-and finally compile it into efficient assembly code through Java JIT.</p>
-<p>Since JVM JIT skips Big method compilation and inlining, Fury also implements an optimizer to <strong>split big methods into
-small methods recursively</strong>, thus ensuring that all code can be compiled and inlined.</p>
-<img alt="fury java codegen" src="https://fury.apache.org/img/fury_java_codegen.png">
-<p>Fury also supports <strong>asynchronous multithreaded compilation</strong> by running the codegen tasks in a thread pool,
-and using interpretation mode until JIT finishes to ensure no serialization burrs.
-Users can skip warm up serialization of objects.</p>
-<p>Python and JavaScript codegen are similar. Generating source code is easier for development
-and troubleshooting problems.</p>
-<p>Since serialization will manipulate objects extensively in each programming language, and the language
-does not expose the low-level API of the memory model, native methods call has a large cost too,
-so we cannot use <a href="https://www.llvm.org/" target="_blank" rel="noopener noreferrer">LLVM</a> to build a unified serializer JIT framework.
-Instead, we implemented a codegen framework for every language separately.</p>
-<h2 class="anchor anchorWithStickyNavbar_LWe7" id="static-code-generation">Static code generation<a href="https://fury.apache.org/blog/fury_blazing_fast_multiple_language_serialization_framework#static-code-generation" class="hash-link" aria-label="Direct link to Static code generation" title="Direct link to Static code generation"></a></h2>
-<p>Although JIT compilation can greatly improve serialization efficiency and generate better serialization code based on
-the statistical distribution of data at runtime, languages like <code>C++</code> do not support reflection,
-have no virtual machines, and no low-level API for memory models.
-We cannot generate serialization code dynamically for such languages through JIT.</p>
-<p>In such scenarios, Fury is implementing an <strong>AOT codegen framework</strong>, which generates the serialized code statically
-according to the object schema, and objects can be serialized automatically using the
-generated serializer. For Rust, Rust macro is used to generate code statically.</p>
-<h2 class="anchor anchorWithStickyNavbar_LWe7" id="cache-optimization">Cache optimization<a href="https://fury.apache.org/blog/fury_blazing_fast_multiple_language_serialization_framework#cache-optimization" class="hash-link" aria-label="Direct link to Cache optimization" title="Direct link to Cache optimization"></a></h2>
-<p>When serializing a custom type, fury will <strong>reorder fields</strong> to ensure that fields of the same type are serialized in
-order. This can hit more data cache and CPU instruction cache.</p>
-<p>The basic type fields are written <strong>in descending order by byte size</strong>. In this way, if the initial addresses are aligned,
-subsequent read and write operations will occur at the position where the memory addresses are aligned, making CPU
-execution more efficient.</p>
-<h1>Multi-protocol Design and Implementation</h1>
-<p>Based on the multi-language serialization features provided by Fury core, we have built three serialization protocols
-for different scenarios:</p>
-<ul>
-<li><strong>Java serialization</strong>: suitable for pure Java serialization scenarios and provides up to170x speed up;</li>
-<li><strong>Cross-language object graph serialization</strong>: suitable for application-oriented multi-language programming and
-high-performance cross-language serialization;</li>
-<li><strong>Row-format serialization</strong>: suitable for distributed computing engines such as Spark/Flink/Dories/Velox/Features
-frameworks;</li>
-</ul>
-<p>In the future, we will add new protocols for other core scenarios. Users can also build their own protocols based on
-Fury's serialization framework.</p>
-<h2 class="anchor anchorWithStickyNavbar_LWe7" id="java-serialization">Java serialization<a href="https://fury.apache.org/blog/fury_blazing_fast_multiple_language_serialization_framework#java-serialization" class="hash-link" aria-label="Direct link to Java serialization" title="Direct link to Java serialization"></a></h2>
-<p>Java is widely used in <strong>big data, cloud native, microservices, and enterprise applications</strong>.
-Therefore, Fury made lots of optimizations for Java serialization, which reduces system latency and server costs a lot,
-and improves throughput significantly. Our implementation has the following highlights:</p>
-<ul>
-<li>Blazing fast performance: Based on Java types, JIT compilation and Unsafe low-level
-operations, <strong>Fury is 170x faster than JDK, and 50~110x faster than Kryo/Hessian</strong> at most.</li>
-<li><strong>100% JDK serialization API compatibility</strong> : supports all JDK custom serialization
-methods <code>writeObject/readObject/writeReplace/readResolve/readObjectNoData</code> natively to ensure the serialization
-correctness
-in any scenario. Kryo/Hessian have some correctness issues in these scenarios.</li>
-<li><strong>Type compatibility</strong>: When the deserialization and serialization class schema are inconsistent, it can still
-deserialize correctly.
-It supports application upgrade and deployment, add/delete fields independently.
-Fury type-compatible mode is implemented with no performance loss compared to type-consistent mode.</li>
-<li><strong>Metadata sharing</strong> : share metadata(class name, field name&type, etc.) across multiple
-serializations under a context (TCP connection),
-meta will be sent to the peer only for the first
-serialization, the peer can reconstruct the same deserializer based on this information.
-Subsequent serialization will skip transferring metadata, which can reduce network traffic,
-and support type compatibility automatically.</li>
-<li><strong>Zero copy support</strong>: supports out-of-band zero copy and off-heap memory read/write.</li>
-</ul>
-<h2 class="anchor anchorWithStickyNavbar_LWe7" id="cross-language-object-graph-serialization">Cross-language object graph serialization<a href="https://fury.apache.org/blog/fury_blazing_fast_multiple_language_serialization_framework#cross-language-object-graph-serialization" class="hash-link" aria-label="Direct link to Cross-language object graph serialization" title="Direct link to Cross-language object graph serialization"></a></h2>
-<p>Fury cross-language object graph serialization is primarily used for scenarios that require
-higher dynamics and ease-of-use.
-Although frameworks like Protobuf/Flatbuffers support cross-language serialization, they still have limitations:</p>
-<ul>
-<li>They require <strong>pre-defined IDLs and generate code statically ahead</strong>, lacking sufficient dynamics and flexibility;</li>
-<li>The generated classes <strong>don't conform to object-oriented design</strong> and it's impossible to add behavior to classes,
-which make them unsuitable for use as domain objects in cross-language application development.</li>
-<li>They <strong>don't support polymorphism</strong>. Object-oriented programming uses interfaces to invoke subclass methods,
-but this pattern isn't supported well in those frameworks. Although Flatbuffers offers <code>Union</code>,
-and Protobuf provides <code>OneOf/Any</code>, those API require check object type during serialization and deserialization, which
-isn't polymorphic.</li>
-<li>They <strong>don't support circular references and shared references</strong>.
-Users need to define a set of IDLs for domain objects
-and implement reference resolution by themselves,
-as well as writing code to convert between domain objects and protocol objects in each language.
-If the object graph depth is deep, more code needs to be written.</li>
-</ul>
-<p>Due to the above limitations, Fury implemented a cross-language object graph serialization protocol that:</p>
-<ul>
-<li><strong>Automatically serializes any object across multiple languages</strong>: By defining classes in the serialization and
-deserialization peer, objects in one language can be automatically serialized into objects in another language without
-creating IDL files, compiling schema to generate code, or writing conversion code.</li>
-<li><strong>Automatically serializes shared and circular references</strong> across multiple languages.</li>
-<li><strong>Supports object type polymorphism</strong>, consistent with the object-oriented programming paradigm,
-and multiple subtypes can be automatically deserialized without manual intervention.</li>
-<li><strong>Out-of-band zero-copy</strong> is also supported in this protocol.</li>
-</ul>
-<p>Example of Automatic Cross-Language Serialization:</p>
-<img alt="xlang serialization example" src="https://fury.apache.org/img/xlang_serialization_example.png">
-<h2 class="anchor anchorWithStickyNavbar_LWe7" id="row-format">Row-format<a href="https://fury.apache.org/blog/fury_blazing_fast_multiple_language_serialization_framework#row-format" class="hash-link" aria-label="Direct link to Row-format" title="Direct link to Row-format"></a></h2>
-<p>For <strong>high-performance computing and large-scale data transfer</strong> scenarios, data serialization and transfer are often
-the <strong>performance bottlenecks</strong> of the system. If users only need to read part of the data or filter data based on some
-field of an object, deserializing the entire data will result in unnecessary overhead. Therefore, Fury provides a
-binary data structure for <strong>direct reading and writing on binary data to avoid serialization</strong>.</p>
-<p><a href="https://arrow.apache.org/" target="_blank" rel="noopener noreferrer">Apache Arrow</a> is a standardized columnar storage format that supports binary read and write.
-However, <strong>columnar format is not suitable for all scenarios</strong>.
-Data in online and streaming computing are naturally stored row by row,
-and row is also used in columnar computing engines when involving data updates, Hash/Join/Aggregation operations.</p>
-<p>However, there is no standardized implementation for row format.
-<strong>Computing engines such as Spark/Flink/Doris/Velox all defined their row format,
-which doesn't support cross-language and can only be used internally by themselves</strong>.
-Flatbuffers does support <strong>lazy deserialization</strong>, but it requires static compilation of schema IDL
-and management of offset, which is impossible for complex scenarios.</p>
-<p>Therefore, Fury implemented a <strong>binary row format</strong> inspired
-by <a href="https://databricks.com/blog/2015/04/28/project-tungsten-bringing-spark-closer-to-bare-metal.html" target="_blank" rel="noopener noreferrer">Spark Tungsten</a>
-and <a href="https://arrow.apache.org/docs/format/Columnar.html" target="_blank" rel="noopener noreferrer">Apache Arrow format</a>, which
-allows <strong>random access and partial deserialization</strong>. Currently, Java/Python/C++ versions have been implemented,
-allowing direct reading and writing on binary data to avoid all serialization overhead, and can convert to arrow format automatically.</p>
-<img alt="xlang serialization example" src="https://fury.apache.org/img/row_format.png">
-<p>This format is densely stored, byte aligned and cache-friendly, which enables faster read and write operations. By avoiding deserialization, it reduces Java GC pressure and Python overhead. Based on Python's dynamics, Fury's data structure implements special methods such as <code>getattr_/getitem/slice/etc.</code>, ensuring behavior consistency with Python dataclass/list/object, and users have no perception of this.</p>
-<h1>Performance Comparison</h1>
-<p>Here are some Java serialization performance data,
-where charts with "compatible" in the title are performance data under type compatible mode:
-support type forward/backward compatibility.
-and charts without "compatible" in the title are performance data without type compatibility:
-class schema must be same between serialization and deserialization.
-For fairness, Fury disabled the zero-copy feature for all tests.</p>
-<p><img width="44%" alt="serialization" src="https://fury.apache.org/img/case1.png"><img width="44%" alt="deserialization" src="https://fury.apache.org/img/case2.png"></p>
-<p><img width="44%" alt="bench_serialize_compatible_MEDIA_CONTENT_to_array_tps" src="https://fury.apache.org/img/benchmarks/serialization/bench_serialize_compatible_MEDIA_CONTENT_to_array_tps.png"><img width="44%" alt="bench_deserialize_compatible_MEDIA_CONTENT_from_array_tps" src="https://fury.apache.org/img/benchmarks/deserialization/bench_deserialize_compatible_MEDIA_CONTENT_from_array_tps.png"></p>
-<p><img width="44%" alt="bench_serialize_STRUCT_to_array_tps" src="https://fury.apache.org/img/benchmarks/serialization/bench_serialize_STRUCT_to_array_tps.png"><img width="44%" alt="bench_serialize_SAMPLE_to_array_tps" src="https://fury.apache.org/img/benchmarks/serialization/bench_serialize_SAMPLE_to_array_tps.png"></p>
-<h1>Future planning(RoadMap)</h1>
-<ul>
-<li>Meta compression, auto meta sharing and cross-language schema compatibility.</li>
-<li>AOT Framework for c++/golang to generate code statically.</li>
-<li>C++/Rust object graph serialization support</li>
-<li>Golang/Rust/NodeJS row format support</li>
-<li>ProtoBuf compatibility support</li>
-<li>Protocols for features and knowledge graph serialization</li>
-<li>Continuously improve our serialization infrastructure for any new protocols</li>
-</ul>
-<h1>Join US</h1>
-<p>We are committed to building Fury into an open and neutral community project that pursues passion and innovation. The
-development and discussion are open-sourced and transparent in the community. Any form of participation is welcome,
-including but not limited to questions, code contributions, technical discussions, etc. We are looking forward to
-receiving your ideas and feedback, participating in the project together, pushing the project forward and creating a
-better serialization framework.</p>
-<p>The GitHub address of the fury repository is:
-<a href="https://github.com/alipay/fury" target="_blank" rel="noopener noreferrer">https://github.com/alipay/fury</a></p>
-<p>Official website: <a href="https://furyio.org/" target="_blank" rel="noopener noreferrer">https://furyio.org</a></p>
-<p>All issues, PR, and Discussion are welcome.</p>]]></content:encoded>
- <category>fury</category>
- </item>
</channel>
</rss>
\ No newline at end of file
diff --git a/blog/tags/fury/index.html b/blog/tags/fury/index.html
index 5be2127..e371024 100644
--- a/blog/tags/fury/index.html
+++ b/blog/tags/fury/index.html
@@ -5,11 +5,11 @@
<meta name="generator" content="Docusaurus v3.0.1">
<title data-rh="true">10 posts tagged with "fury" | Apache Fury (incubating)</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://fury.apache.org/blog/tags/fury"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:langua [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache Fury (incubating) Atom Feed"><link rel="stylesheet" href="/assets/css/styles.d3c1e154.css">
-<script src="/assets/js/runtime~main.4b29d538.js" defer="defer"></script>
-<script src="/assets/js/main.4989193f.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.1a67ee30.js" defer="defer"></script>
+<script src="/assets/js/main.683e6d58.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
-<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
<p>I'm pleased to announce the 0.4.1 release of the Fury: <a href="https://github.com/alipay/fury/releases/tag/v0.4.1" target="_blank" rel="noopener noreferrer">https://github.com/alipay/fury/releases/tag/v0.4.1</a>. With this release, Fury support rust row format now. C++ row format has been enhanced too, now iterable types can be encoded to fury row format. Please try it out and share your feedbacks with us.</p></div><footer class="row docusaurus-mt-lg"><div class="col col--9"><b> [...]
<p>I'm pleased to announce the 0.4.0 release of the Fury. With this release, <a href="https://www.graalvm.org/latest/reference-manual/native-image/" target="_blank" rel="noopener noreferrer">GraalVM native image</a> and C++ row format automatic encoder based on compile-time reflection are supported. Please try it out and share your feedbacks with us.</p></div><footer class="row docusaurus-mt-lg"><div class="col col--9"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"> [...]
<p>I'm pleased to announce the 0.3.1 release of the Fury. With this release, fury supports python 3.11&3.12, droped python 3.6 support.
@@ -96,7 +96,7 @@ Multiple scala serialization JIT optimization are included, and java serializati
<li>[[Java] refine AllowListChecker (#893)</li>
</ul>
<p><strong>Full Changelog</strong>: <a href="https://github.com/alipay/fury/compare/v0.1.0...v0.1.1" target="_blank" rel="noopener noreferrer">https://github.com/alipay/fury/compare/v0.1.0...v0.1.1</a></p></div><footer class="row docusaurus-mt-lg"><div class="col"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/blog/tags/fury">fury</a></li></ul></div></footer></article><article class="margin-bottom--xl" itemp [...]
-<p>I'm pleased to announce the 0.1.0 release of the Fury. Fury 0.1.0 is our first release since we started the development in github in 2023.04.28, and open sourced in 2023.07.15. This release includes many features: production-ready Java serialization, cross language serialization for Java/Python/JavaScript/Rust, row format support and so on.</p></div><footer class="row docusaurus-mt-lg"><div class="col col--9"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li cla [...]
+<p>I'm pleased to announce the 0.1.0 release of the Fury. Fury 0.1.0 is our first release since we started the development in github in 2023.04.28, and open sourced in 2023.07.15. This release includes many features: production-ready Java serialization, cross language serialization for Java/Python/JavaScript/Rust, row format support and so on.</p></div><footer class="row docusaurus-mt-lg"><div class="col col--9"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li cla [...]
<p> Apache Fury is an effort undergoing incubation at The Apache Software Foundation (ASF), sponsored by the Apache Incubator. Incubation is required of all newly accepted projects until a further review indicates that the infrastructure, communications, and decision making process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the [...]
<p>
Copyright © 2024 The Apache Software Foundation, Licensed under the Apache License, Version 2.0. <br>
diff --git a/blog/tags/index.html b/blog/tags/index.html
index 55810ea..b1a4d69 100644
--- a/blog/tags/index.html
+++ b/blog/tags/index.html
@@ -5,11 +5,11 @@
<meta name="generator" content="Docusaurus v3.0.1">
<title data-rh="true">Tags | Apache Fury (incubating)</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://fury.apache.org/blog/tags"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache Fury (incubating) Atom Feed"><link rel="stylesheet" href="/assets/css/styles.d3c1e154.css">
-<script src="/assets/js/runtime~main.4b29d538.js" defer="defer"></script>
-<script src="/assets/js/main.4989193f.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.1a67ee30.js" defer="defer"></script>
+<script src="/assets/js/main.683e6d58.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
-<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
<p> Apache Fury is an effort undergoing incubation at The Apache Software Foundation (ASF), sponsored by the Apache Incubator. Incubation is required of all newly accepted projects until a further review indicates that the infrastructure, communications, and decision making process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the [...]
<p>
Copyright © 2024 The Apache Software Foundation, Licensed under the Apache License, Version 2.0. <br>
diff --git a/docs/download/index.html b/docs/download/index.html
index 3bdd02a..f5cd650 100644
--- a/docs/download/index.html
+++ b/docs/download/index.html
@@ -5,8 +5,8 @@
<meta name="generator" content="Docusaurus v3.0.1">
<title data-rh="true">Apache Fury(incubating) Download | Apache Fury (incubating)</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://fury.apache.org/docs/download"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" co [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache Fury (incubating) Atom Feed"><link rel="stylesheet" href="/assets/css/styles.d3c1e154.css">
-<script src="/assets/js/runtime~main.4b29d538.js" defer="defer"></script>
-<script src="/assets/js/main.4989193f.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.1a67ee30.js" defer="defer"></script>
+<script src="/assets/js/main.683e6d58.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/guide/development/index.html b/docs/guide/development/index.html
index c41299c..0254055 100644
--- a/docs/guide/development/index.html
+++ b/docs/guide/development/index.html
@@ -5,8 +5,8 @@
<meta name="generator" content="Docusaurus v3.0.1">
<title data-rh="true">Development | Apache Fury (incubating)</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://fury.apache.org/docs/guide/development"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en">< [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache Fury (incubating) Atom Feed"><link rel="stylesheet" href="/assets/css/styles.d3c1e154.css">
-<script src="/assets/js/runtime~main.4b29d538.js" defer="defer"></script>
-<script src="/assets/js/main.4989193f.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.1a67ee30.js" defer="defer"></script>
+<script src="/assets/js/main.683e6d58.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/guide/graalvm_guide/index.html b/docs/guide/graalvm_guide/index.html
index e7ff892..b0676c8 100644
--- a/docs/guide/graalvm_guide/index.html
+++ b/docs/guide/graalvm_guide/index.html
@@ -5,8 +5,8 @@
<meta name="generator" content="Docusaurus v3.0.1">
<title data-rh="true">GraalVM Guide | Apache Fury (incubating)</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://fury.apache.org/docs/guide/graalvm_guide"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="e [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache Fury (incubating) Atom Feed"><link rel="stylesheet" href="/assets/css/styles.d3c1e154.css">
-<script src="/assets/js/runtime~main.4b29d538.js" defer="defer"></script>
-<script src="/assets/js/main.4989193f.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.1a67ee30.js" defer="defer"></script>
+<script src="/assets/js/main.683e6d58.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/guide/java_object_graph_guide/index.html b/docs/guide/java_object_graph_guide/index.html
index 2f235e8..8a8b7f1 100644
--- a/docs/guide/java_object_graph_guide/index.html
+++ b/docs/guide/java_object_graph_guide/index.html
@@ -5,8 +5,8 @@
<meta name="generator" content="Docusaurus v3.0.1">
<title data-rh="true">Java Serialization Guide | Apache Fury (incubating)</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://fury.apache.org/docs/guide/java_object_graph_guide"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache Fury (incubating) Atom Feed"><link rel="stylesheet" href="/assets/css/styles.d3c1e154.css">
-<script src="/assets/js/runtime~main.4b29d538.js" defer="defer"></script>
-<script src="/assets/js/main.4989193f.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.1a67ee30.js" defer="defer"></script>
+<script src="/assets/js/main.683e6d58.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/guide/row_format_guide/index.html b/docs/guide/row_format_guide/index.html
index 934daaf..9a6400f 100644
--- a/docs/guide/row_format_guide/index.html
+++ b/docs/guide/row_format_guide/index.html
@@ -5,8 +5,8 @@
<meta name="generator" content="Docusaurus v3.0.1">
<title data-rh="true">Row Format Guide | Apache Fury (incubating)</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://fury.apache.org/docs/guide/row_format_guide"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" cont [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache Fury (incubating) Atom Feed"><link rel="stylesheet" href="/assets/css/styles.d3c1e154.css">
-<script src="/assets/js/runtime~main.4b29d538.js" defer="defer"></script>
-<script src="/assets/js/main.4989193f.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.1a67ee30.js" defer="defer"></script>
+<script src="/assets/js/main.683e6d58.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/guide/scala_guide/index.html b/docs/guide/scala_guide/index.html
index c4b57d4..5f25bd8 100644
--- a/docs/guide/scala_guide/index.html
+++ b/docs/guide/scala_guide/index.html
@@ -5,8 +5,8 @@
<meta name="generator" content="Docusaurus v3.0.1">
<title data-rh="true">Scala Serialization Guide | Apache Fury (incubating)</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://fury.apache.org/docs/guide/scala_guide"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache Fury (incubating) Atom Feed"><link rel="stylesheet" href="/assets/css/styles.d3c1e154.css">
-<script src="/assets/js/runtime~main.4b29d538.js" defer="defer"></script>
-<script src="/assets/js/main.4989193f.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.1a67ee30.js" defer="defer"></script>
+<script src="/assets/js/main.683e6d58.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/guide/xlang_object_graph_guide/index.html b/docs/guide/xlang_object_graph_guide/index.html
index e3f215d..95c122b 100644
--- a/docs/guide/xlang_object_graph_guide/index.html
+++ b/docs/guide/xlang_object_graph_guide/index.html
@@ -5,8 +5,8 @@
<meta name="generator" content="Docusaurus v3.0.1">
<title data-rh="true">Xlang Serialization Guide | Apache Fury (incubating)</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://fury.apache.org/docs/guide/xlang_object_graph_guide"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsear [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache Fury (incubating) Atom Feed"><link rel="stylesheet" href="/assets/css/styles.d3c1e154.css">
-<script src="/assets/js/runtime~main.4b29d538.js" defer="defer"></script>
-<script src="/assets/js/main.4989193f.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.1a67ee30.js" defer="defer"></script>
+<script src="/assets/js/main.683e6d58.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/guide/xlang_type_mapping/index.html b/docs/guide/xlang_type_mapping/index.html
index a1cc077..bc39c9c 100644
--- a/docs/guide/xlang_type_mapping/index.html
+++ b/docs/guide/xlang_type_mapping/index.html
@@ -5,8 +5,8 @@
<meta name="generator" content="Docusaurus v3.0.1">
<title data-rh="true">Type Mapping of Xlang Serialization | Apache Fury (incubating)</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://fury.apache.org/docs/guide/xlang_type_mapping"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="doc [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache Fury (incubating) Atom Feed"><link rel="stylesheet" href="/assets/css/styles.d3c1e154.css">
-<script src="/assets/js/runtime~main.4b29d538.js" defer="defer"></script>
-<script src="/assets/js/main.4989193f.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.1a67ee30.js" defer="defer"></script>
+<script src="/assets/js/main.683e6d58.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/introduction/benchmark/index.html b/docs/introduction/benchmark/index.html
index 2ba016b..89f13c5 100644
--- a/docs/introduction/benchmark/index.html
+++ b/docs/introduction/benchmark/index.html
@@ -5,8 +5,8 @@
<meta name="generator" content="Docusaurus v3.0.1">
<title data-rh="true">Benchmark | Apache Fury (incubating)</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://fury.apache.org/docs/introduction/benchmark"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache Fury (incubating) Atom Feed"><link rel="stylesheet" href="/assets/css/styles.d3c1e154.css">
-<script src="/assets/js/runtime~main.4b29d538.js" defer="defer"></script>
-<script src="/assets/js/main.4989193f.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.1a67ee30.js" defer="defer"></script>
+<script src="/assets/js/main.683e6d58.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/introduction/features/index.html b/docs/introduction/features/index.html
index cee1e6f..74e5f99 100644
--- a/docs/introduction/features/index.html
+++ b/docs/introduction/features/index.html
@@ -5,8 +5,8 @@
<meta name="generator" content="Docusaurus v3.0.1">
<title data-rh="true">Features | Apache Fury (incubating)</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://fury.apache.org/docs/introduction/features"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"> [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache Fury (incubating) Atom Feed"><link rel="stylesheet" href="/assets/css/styles.d3c1e154.css">
-<script src="/assets/js/runtime~main.4b29d538.js" defer="defer"></script>
-<script src="/assets/js/main.4989193f.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.1a67ee30.js" defer="defer"></script>
+<script src="/assets/js/main.683e6d58.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/introduction/index.html b/docs/introduction/index.html
index 0a5c278..6d5653d 100644
--- a/docs/introduction/index.html
+++ b/docs/introduction/index.html
@@ -5,8 +5,8 @@
<meta name="generator" content="Docusaurus v3.0.1">
<title data-rh="true">Introduction | Apache Fury (incubating)</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://fury.apache.org/docs/introduction/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><met [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache Fury (incubating) Atom Feed"><link rel="stylesheet" href="/assets/css/styles.d3c1e154.css">
-<script src="/assets/js/runtime~main.4b29d538.js" defer="defer"></script>
-<script src="/assets/js/main.4989193f.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.1a67ee30.js" defer="defer"></script>
+<script src="/assets/js/main.683e6d58.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/specification/fury_java_serialization_spec/index.html b/docs/specification/fury_java_serialization_spec/index.html
index 84e25c2..7df76df 100644
--- a/docs/specification/fury_java_serialization_spec/index.html
+++ b/docs/specification/fury_java_serialization_spec/index.html
@@ -5,8 +5,8 @@
<meta name="generator" content="Docusaurus v3.0.1">
<title data-rh="true">Fury Java Serialization Format | Apache Fury (incubating)</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://fury.apache.org/docs/specification/fury_java_serialization_spec"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="tr [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache Fury (incubating) Atom Feed"><link rel="stylesheet" href="/assets/css/styles.d3c1e154.css">
-<script src="/assets/js/runtime~main.4b29d538.js" defer="defer"></script>
-<script src="/assets/js/main.4989193f.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.1a67ee30.js" defer="defer"></script>
+<script src="/assets/js/main.683e6d58.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/specification/fury_row_format_spec/index.html b/docs/specification/fury_row_format_spec/index.html
index 6db81cf..3f61810 100644
--- a/docs/specification/fury_row_format_spec/index.html
+++ b/docs/specification/fury_row_format_spec/index.html
@@ -5,8 +5,8 @@
<meta name="generator" content="Docusaurus v3.0.1">
<title data-rh="true">Fury Row Format | Apache Fury (incubating)</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://fury.apache.org/docs/specification/fury_row_format_spec"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:lan [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache Fury (incubating) Atom Feed"><link rel="stylesheet" href="/assets/css/styles.d3c1e154.css">
-<script src="/assets/js/runtime~main.4b29d538.js" defer="defer"></script>
-<script src="/assets/js/main.4989193f.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.1a67ee30.js" defer="defer"></script>
+<script src="/assets/js/main.683e6d58.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/specification/fury_xlang_serialization_spec/index.html b/docs/specification/fury_xlang_serialization_spec/index.html
index 1ae1003..644fbfd 100644
--- a/docs/specification/fury_xlang_serialization_spec/index.html
+++ b/docs/specification/fury_xlang_serialization_spec/index.html
@@ -5,8 +5,8 @@
<meta name="generator" content="Docusaurus v3.0.1">
<title data-rh="true">Fury Xlang Serialization Format | Apache Fury (incubating)</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://fury.apache.org/docs/specification/fury_xlang_serialization_spec"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh=" [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache Fury (incubating) Atom Feed"><link rel="stylesheet" href="/assets/css/styles.d3c1e154.css">
-<script src="/assets/js/runtime~main.4b29d538.js" defer="defer"></script>
-<script src="/assets/js/main.4989193f.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.1a67ee30.js" defer="defer"></script>
+<script src="/assets/js/main.683e6d58.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/start/install/index.html b/docs/start/install/index.html
index 2c6232a..1d127b1 100644
--- a/docs/start/install/index.html
+++ b/docs/start/install/index.html
@@ -5,8 +5,8 @@
<meta name="generator" content="Docusaurus v3.0.1">
<title data-rh="true">Install | Apache Fury (incubating)</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://fury.apache.org/docs/start/install"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta dat [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache Fury (incubating) Atom Feed"><link rel="stylesheet" href="/assets/css/styles.d3c1e154.css">
-<script src="/assets/js/runtime~main.4b29d538.js" defer="defer"></script>
-<script src="/assets/js/main.4989193f.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.1a67ee30.js" defer="defer"></script>
+<script src="/assets/js/main.683e6d58.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/docs/start/usage/index.html b/docs/start/usage/index.html
index 3208b9b..60a1d7b 100644
--- a/docs/start/usage/index.html
+++ b/docs/start/usage/index.html
@@ -5,8 +5,8 @@
<meta name="generator" content="Docusaurus v3.0.1">
<title data-rh="true">Usage | Apache Fury (incubating)</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://fury.apache.org/docs/start/usage"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache Fury (incubating) Atom Feed"><link rel="stylesheet" href="/assets/css/styles.d3c1e154.css">
-<script src="/assets/js/runtime~main.4b29d538.js" defer="defer"></script>
-<script src="/assets/js/main.4989193f.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.1a67ee30.js" defer="defer"></script>
+<script src="/assets/js/main.683e6d58.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/index.html b/index.html
index 15594de..0a9956c 100644
--- a/index.html
+++ b/index.html
@@ -5,8 +5,8 @@
<meta name="generator" content="Docusaurus v3.0.1">
<title data-rh="true">Apache Fury (incubating) | Apache Fury (incubating)</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://fury.apache.org/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docusaurus_tag" content="default"><meta dat [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache Fury (incubating) Atom Feed"><link rel="stylesheet" href="/assets/css/styles.d3c1e154.css">
-<script src="/assets/js/runtime~main.4b29d538.js" defer="defer"></script>
-<script src="/assets/js/main.4989193f.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.1a67ee30.js" defer="defer"></script>
+<script src="/assets/js/main.683e6d58.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/lunr-index-1714013962251.json b/lunr-index-1714013962251.json
deleted file mode 100644
index 3c858b1..0000000
--- a/lunr-index-1714013962251.json
+++ /dev/null
@@ -1 +0,0 @@
-{"version":"2.3.9","fields":["title","content","keywords"],"fieldVectors":[["title/0",[0,83.266,1,833.918,2,382.028]],["content/0",[]],["keywords/0",[]],["title/1",[3,764.33]],["content/1",[0,1.361,4,3.932,5,11.24,6,8.733,7,11.24,8,11.24,9,1.289,10,13.634,11,2.756,12,9.963,13,6.536,14,6.387,15,7.879,16,6.536,17,13.634,18,7.443,19,4.056,20,10.53,21,9.087,22,5.218,23,16.606,24,13.634,25,12.191,26,13.634]],["keywords/1",[]],["title/2",[27,615.327,28,542.764]],["content/2",[0,1.518,4,3.838,5 [...]
\ No newline at end of file
diff --git a/lunr-index-1714018338519.json b/lunr-index-1714018338519.json
new file mode 100644
index 0000000..844b17e
--- /dev/null
+++ b/lunr-index-1714018338519.json
@@ -0,0 +1 @@
+{"version":"2.3.9","fields":["title","content","keywords"],"fieldVectors":[["title/0",[0,79.433,1,840.105,2,388.302]],["content/0",[]],["keywords/0",[]],["title/1",[3,773.681]],["content/1",[0,1.296,4,3.907,5,11.315,6,8.814,7,11.315,8,11.315,9,1.205,10,13.703,11,2.853,12,10.041,13,6.623,14,6.333,15,7.962,16,6.623,17,13.703,18,7.402,19,3.907,20,10.607,21,9.167,22,5.214,23,16.706,24,13.703,25,12.263,26,13.703]],["keywords/1",[]],["title/2",[27,622.819,28,550.267]],["content/2",[0,1.443,4,3 [...]
\ No newline at end of file
diff --git a/lunr-index.json b/lunr-index.json
index 3c858b1..844b17e 100644
--- a/lunr-index.json
+++ b/lunr-index.json
@@ -1 +1 @@
-{"version":"2.3.9","fields":["title","content","keywords"],"fieldVectors":[["title/0",[0,83.266,1,833.918,2,382.028]],["content/0",[]],["keywords/0",[]],["title/1",[3,764.33]],["content/1",[0,1.361,4,3.932,5,11.24,6,8.733,7,11.24,8,11.24,9,1.289,10,13.634,11,2.756,12,9.963,13,6.536,14,6.387,15,7.879,16,6.536,17,13.634,18,7.443,19,4.056,20,10.53,21,9.087,22,5.218,23,16.606,24,13.634,25,12.191,26,13.634]],["keywords/1",[]],["title/2",[27,615.327,28,542.764]],["content/2",[0,1.518,4,3.838,5 [...]
\ No newline at end of file
+{"version":"2.3.9","fields":["title","content","keywords"],"fieldVectors":[["title/0",[0,79.433,1,840.105,2,388.302]],["content/0",[]],["keywords/0",[]],["title/1",[3,773.681]],["content/1",[0,1.296,4,3.907,5,11.315,6,8.814,7,11.315,8,11.315,9,1.205,10,13.703,11,2.853,12,10.041,13,6.623,14,6.333,15,7.962,16,6.623,17,13.703,18,7.402,19,3.907,20,10.607,21,9.167,22,5.214,23,16.706,24,13.703,25,12.263,26,13.703]],["keywords/1",[]],["title/2",[27,622.819,28,550.267]],["content/2",[0,1.443,4,3 [...]
\ No newline at end of file
diff --git a/markdown-page/index.html b/markdown-page/index.html
index ff50c6e..78d0170 100644
--- a/markdown-page/index.html
+++ b/markdown-page/index.html
@@ -5,8 +5,8 @@
<meta name="generator" content="Docusaurus v3.0.1">
<title data-rh="true">Markdown page example | Apache Fury (incubating)</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://fury.apache.org/markdown-page"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docusaurus_tag" content="default" [...]
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache Fury (incubating) Atom Feed"><link rel="stylesheet" href="/assets/css/styles.d3c1e154.css">
-<script src="/assets/js/runtime~main.4b29d538.js" defer="defer"></script>
-<script src="/assets/js/main.4989193f.js" defer="defer"></script>
+<script src="/assets/js/runtime~main.1a67ee30.js" defer="defer"></script>
+<script src="/assets/js/main.683e6d58.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.se [...]
diff --git a/search-doc-1714013962251.json b/search-doc-1714013962251.json
deleted file mode 100644
index 3a5f41e..0000000
--- a/search-doc-1714013962251.json
+++ /dev/null
@@ -1 +0,0 @@
-{"searchDocs":[{"title":"Fury v0.1.1 released","type":0,"sectionRef":"#","url":"/blog/fury_0_1_1_release","content":"","keywords":"","version":null},{"title":"Highlights","type":1,"pageTitle":"Fury v0.1.1 released","url":"/blog/fury_0_1_1_release#highlights","content":" Java Dubbo fury integration: https://github.com/fury-project/dubbo-serialization-furyAdd class checker API to customize security check behaviour(#890) Python Support pyarrow6 bazel build (#859 #862)Support python 3.10 (# [...]
\ No newline at end of file
diff --git a/search-doc-1714018338519.json b/search-doc-1714018338519.json
new file mode 100644
index 0000000..3f62256
--- /dev/null
+++ b/search-doc-1714018338519.json
@@ -0,0 +1 @@
+{"searchDocs":[{"title":"Fury v0.1.1 released","type":0,"sectionRef":"#","url":"/blog/fury_0_1_1_release","content":"","keywords":"","version":null},{"title":"Highlights","type":1,"pageTitle":"Fury v0.1.1 released","url":"/blog/fury_0_1_1_release#highlights","content":" Java Dubbo fury integration: https://github.com/fury-project/dubbo-serialization-furyAdd class checker API to customize security check behaviour(#890) Python Support pyarrow6 bazel build (#859 #862)Support python 3.10 (# [...]
\ No newline at end of file
diff --git a/search-doc.json b/search-doc.json
index 3a5f41e..3f62256 100644
--- a/search-doc.json
+++ b/search-doc.json
@@ -1 +1 @@
-{"searchDocs":[{"title":"Fury v0.1.1 released","type":0,"sectionRef":"#","url":"/blog/fury_0_1_1_release","content":"","keywords":"","version":null},{"title":"Highlights","type":1,"pageTitle":"Fury v0.1.1 released","url":"/blog/fury_0_1_1_release#highlights","content":" Java Dubbo fury integration: https://github.com/fury-project/dubbo-serialization-furyAdd class checker API to customize security check behaviour(#890) Python Support pyarrow6 bazel build (#859 #862)Support python 3.10 (# [...]
\ No newline at end of file
+{"searchDocs":[{"title":"Fury v0.1.1 released","type":0,"sectionRef":"#","url":"/blog/fury_0_1_1_release","content":"","keywords":"","version":null},{"title":"Highlights","type":1,"pageTitle":"Fury v0.1.1 released","url":"/blog/fury_0_1_1_release#highlights","content":" Java Dubbo fury integration: https://github.com/fury-project/dubbo-serialization-furyAdd class checker API to customize security check behaviour(#890) Python Support pyarrow6 bazel build (#859 #862)Support python 3.10 (# [...]
\ No newline at end of file
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@fury.apache.org
For additional commands, e-mail: commits-help@fury.apache.org