This is an automated email from the ASF dual-hosted git repository.
chaokunyang pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/fory-site.git
The following commit(s) were added to refs/heads/main by this push:
new 2eb776f40d fix(i18n): track zh-CN specification docs to prevent
english fallback (#413)
2eb776f40d is described below
commit 2eb776f40d4b9a4babbfc7dcdc20693a55106955
Author: Shawn Yang <[email protected]>
AuthorDate: Tue Feb 10 16:03:52 2026 +0800
fix(i18n): track zh-CN specification docs to prevent english fallback (#413)
---
.gitignore | 6 +
.../specification/java_serialization_spec.md | 381 ++++++++++++++
.../current/specification/row_format_spec.md | 356 +++++++++++++
.../specification/xlang_implementation_guide.md | 251 +++++++++
.../specification/xlang_serialization_spec.md | 558 +++++++++++++++++++++
.../current/specification/xlang_type_mapping.md | 146 ++++++
.../specification/java_serialization_spec.md | 381 ++++++++++++++
.../version-0.15/specification/row_format_spec.md | 356 +++++++++++++
.../specification/xlang_implementation_guide.md | 251 +++++++++
.../specification/xlang_serialization_spec.md | 558 +++++++++++++++++++++
.../specification/xlang_type_mapping.md | 146 ++++++
11 files changed, 3390 insertions(+)
diff --git a/.gitignore b/.gitignore
index 36792b22df..a27d557c01 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,7 +9,13 @@
.cache-loader
# Generated i18n specification folders (copied by prebuild script)
+# Keep fallback-generated specification folders ignored by default.
i18n/zh-CN/docusaurus-plugin-content-docs/*/specification/
+# Explicitly track manually translated specification docs for current and
latest release.
+!i18n/zh-CN/docusaurus-plugin-content-docs/current/specification/
+!i18n/zh-CN/docusaurus-plugin-content-docs/current/specification/*.md
+!i18n/zh-CN/docusaurus-plugin-content-docs/version-0.15/specification/
+!i18n/zh-CN/docusaurus-plugin-content-docs/version-0.15/specification/*.md
# Misc
.DS_Store
diff --git
a/i18n/zh-CN/docusaurus-plugin-content-docs/current/specification/java_serialization_spec.md
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/specification/java_serialization_spec.md
new file mode 100644
index 0000000000..959eeb2b6b
--- /dev/null
+++
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/specification/java_serialization_spec.md
@@ -0,0 +1,381 @@
+---
+title: Java 序列化格式
+sidebar_position: 1
+id: java_serialization_spec
+license: |
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+---
+
+本文定义 Apache Fory Java 原生序列化格式的编码格式细节。
+
+## 规范概览
+
+Fory Java 原生格式面向 Java 对象图,支持:
+
+- 共享引用与循环引用
+- 多态对象
+- 可选 schema 演进
+- 流式写入(共享 type meta 按需内联,不要求预先 meta 区)
+
+Java native 是 xlang 编码格式的扩展,复用相同核心帧与基础编码。
+
+总体布局:
+
+```
+| fory header | object ref meta | object type meta | object value data |
+```
+
+字节序统一为 little-endian。大端平台实现需在数组等路径做字节序转换,确保线上格式一致。
+
+## Fory 头部
+
+Java 原生序列化头部是 1-byte 位图:
+
+```
+| 5 bits | 1 bit | 1 bit | 1 bit |
++--------------+-------+-------+-------+
+| reserved | oob | xlang | null |
+```
+
+含义:
+
+- `null`:对象是否为 null(为 1 时其余位不应置位)
+- `xlang`:1 表示 xlang 格式,0 表示 Java native
+- `oob`:1 表示存在 `BufferCallback`
+
+头部始终 1 字节,不额外写 language ID。
+
+## 引用元信息
+
+引用跟踪标记与 xlang 一致:
+
+| 标记 | 字节值 | 说明
|
+| -------------------- | ------ |
------------------------------------------------------ |
+| NULL FLAG | `-3` | 对象为 null,后续不写对象内容 |
+| REF FLAG | `-2` | 已出现对象,后接 `varuint32` 的 reference ID
|
+| NOT_NULL VALUE FLAG | `-1` | 非空但该类型未启用引用跟踪,后接对象内容 |
+| REF VALUE FLAG | `0` | 可引用对象首次出现,后接对象内容,并分配新 reference ID |
+
+当全局或字段级禁用引用跟踪时,仅使用 `NULL FLAG` 与 `NOT_NULL VALUE FLAG`。
+
+## Type system and type IDs
+
+Java native 使用与 xlang 统一的类型 ID 组合方式:
+
+```
+full_type_id = (user_type_id << 8) | internal_type_id
+```
+
+- `internal_type_id`:低 8 位,表示类型种类
+- `user_type_id`:用户注册数值 ID(适用于用户 enum/struct/ext)
+- named 类型使用 `NAMED_*`,其标识来自元信息(命名空间+类型名)
+
+### Shared internal type IDs (0-63)
+
+Java native 与 xlang 共享 `< 64` 的 internal IDs:
+
+- `0~56` 已定义
+- `57~63` 预留
+
+详见 [Xlang Serialization
Format](xlang_serialization_spec.md#internal-type-id-table)。
+
+### Java native built-in type IDs
+
+Java 专有内建类型从 `Types.BOUND + 5` 开始(`Types.BOUND=64`,预留 5 个)。
+
+| Type ID | Name | Description |
+| ------- | -------------------------- | ------------------------------ |
+| 69 | VOID_ID | java.lang.Void |
+| 70 | CHAR_ID | java.lang.Character |
+| 71 | PRIMITIVE_VOID_ID | void |
+| 72 | PRIMITIVE_BOOL_ID | boolean |
+| 73 | PRIMITIVE_INT8_ID | byte |
+| 74 | PRIMITIVE_CHAR_ID | char |
+| 75 | PRIMITIVE_INT16_ID | short |
+| 76 | PRIMITIVE_INT32_ID | int |
+| 77 | PRIMITIVE_FLOAT32_ID | float |
+| 78 | PRIMITIVE_INT64_ID | long |
+| 79 | PRIMITIVE_FLOAT64_ID | double |
+| 80 | PRIMITIVE_BOOLEAN_ARRAY_ID | boolean[] |
+| 81 | PRIMITIVE_BYTE_ARRAY_ID | byte[] |
+| 82 | PRIMITIVE_CHAR_ARRAY_ID | char[] |
+| 83 | PRIMITIVE_SHORT_ARRAY_ID | short[] |
+| 84 | PRIMITIVE_INT_ARRAY_ID | int[] |
+| 85 | PRIMITIVE_FLOAT_ARRAY_ID | float[] |
+| 86 | PRIMITIVE_LONG_ARRAY_ID | long[] |
+| 87 | PRIMITIVE_DOUBLE_ARRAY_ID | double[] |
+| 88 | STRING_ARRAY_ID | String[] |
+| 89 | OBJECT_ARRAY_ID | Object[] |
+| 90 | ARRAYLIST_ID | java.util.ArrayList |
+| 91 | HASHMAP_ID | java.util.HashMap |
+| 92 | HASHSET_ID | java.util.HashSet |
+| 93 | CLASS_ID | java.lang.Class |
+| 94 | EMPTY_OBJECT_ID | empty object stub |
+| 95 | LAMBDA_STUB_ID | lambda stub |
+| 96 | JDK_PROXY_STUB_ID | JDK proxy stub |
+| 97 | REPLACE_STUB_ID | writeReplace/readResolve stub |
+| 98 | NONEXISTENT_META_SHARED_ID | meta-shared unknown class stub |
+
+### Registration and named types
+
+用户类型可按数值或名称注册:
+
+- 数值注册:`full_type_id = (user_id << 8) | internal_type_id`
+- 名称注册:通过 namespace + typename
+- 未注册类型按 named 类型写出(namespace=包名,typename=类名)
+
+未注册时命名类型选择:
+
+- enum -> `NAMED_ENUM`
+- struct-like -> `NAMED_STRUCT`(兼容模式下 `NAMED_COMPATIBLE_STRUCT`)
+- 其他自定义 serializer -> `NAMED_EXT`
+
+## Type meta encoding
+
+每个值写入流程:
+
+1. 写 `type_id`(varuint32 small7)
+2. 对 `NAMED_*` / `COMPATIBLE_STRUCT` 等类型按规则写额外元信息
+3. 其余类型无需额外 meta
+
+### Shared class meta (streaming)
+
+开启 meta share 时,使用流式共享 class meta:
+
+```
+| varuint32: index_marker | [class def bytes if new] |
+
+index_marker = (index << 1) | flag
+flag = 1 -> reference
+flag = 0 -> new type
+```
+
+- `flag=1`:引用历史 type,后续无 class def bytes
+- `flag=0`:新 type,后续内联 class def
+- index 按首次出现顺序递增
+
+## Schema modes
+
+Java native 支持两种模式:
+
+- **Schema consistent**(compatible 关闭):字段按固定顺序写,不需要 ClassDef
+- **Schema evolution**(compatible 开启):按 ClassDef 元信息支持演进
+
+## ClassDef format (compatible mode)
+
+ClassDef 是 compatible struct 的演进元信息。
+
+### Binary layout
+
+```
+| 8 bytes header | [varuint32 extra size] | class meta bytes |
+```
+
+header 位布局:
+
+```
+| 50-bit hash | 4 bits reserved | 1 bit compress | 1 bit has_fields_meta |
8-bit size |
+```
+
+规则:
+
+- `size` 为低 8 位;若为 `0xFF`,后接扩展长度
+- `compress`:payload 是否压缩
+- `has_fields_meta`:是否含字段元信息
+- `reserved` 必须为 0
+- `hash` 为 payload + flags 的 50-bit 哈希
+
+### Class meta bytes
+
+表示线性化继承层次(父 -> 子)与字段信息:
+
+```
+| num_classes | class_layer_0 | class_layer_1 | ... |
+
+class_layer:
+| num_fields << 1 | registered_flag | [type_id if registered] |
+| namespace | type_name | field_infos |
+```
+
+### Field info
+
+每个字段:
+
+```
+| field_header | [field_name_bytes] | field_type |
+```
+
+`field_header`:
+
+- bit0: trackingRef
+- bit1: nullable
+- bit2-3: 字段名编码
+- bit4-6: name length/tag ID(7 表示扩展)
+- bit7: reserved=0
+
+字段名编码:
+
+- 0: UTF8
+- 1: ALL_TO_LOWER_SPECIAL
+- 2: LOWER_UPPER_DIGIT_SPECIAL
+- 3: TAG_ID(省略字段名,存 tag)
+
+### Field type encoding
+
+字段类型使用 type tag + 可选嵌套类型信息:
+
+| Tag | 字段类型 |
+| --- | ----------------------------------------- |
+| 0 | Object (ObjectFieldType) |
+| 1 | Map (MapFieldType) |
+| 2 | Collection/List/Set (CollectionFieldType) |
+| 3 | Array (ArrayFieldType) |
+| 4 | Enum (EnumFieldType) |
+| 5+ | Registered type (RegisteredFieldType) |
+
+嵌套类型头部低位可携带 `nullable/tracking_ref` 标志。
+
+## Meta string encoding
+
+namespace、type name、field name 复用 xlang 的 meta string 编码。
+
+### Package and type names
+
+头部:
+
+```
+| 6 bits size | 2 bits encoding |
+```
+
+- `size=63` 时追加扩展长度
+- package 支持:UTF8 / ALL_TO_LOWER_SPECIAL / LOWER_UPPER_DIGIT_SPECIAL
+- type name 支持:UTF8 / LOWER_UPPER_DIGIT_SPECIAL / FIRST_TO_LOWER_SPECIAL /
ALL_TO_LOWER_SPECIAL
+
+### Field names
+
+字段名编码与 ClassDef 的 field header 规则一致;若使用 TAG_ID,则不写名字字节。
+
+### Encoding algorithms
+
+具体算法参见 xlang 规范 `#meta-string`。
+
+## Value encodings
+
+以下为 Java native 常见内建 serializer 的值布局。自定义 `EXT` 可定义自身值格式,但必须遵循“引用元信息 +
类型元信息”通道规则。
+
+### Primitives
+
+- boolean: 1 byte(0/1)
+- byte: 1 byte
+- short: 2 bytes little-endian
+- char: 2 bytes little-endian(UTF-16 code unit)
+- int: fixed(4 bytes) 或 varint32(ZigZag)
+- long: fixed(8 bytes) / varint64(ZigZag) / tagged int64
+- float: IEEE754 float32
+- double: IEEE754 float64
+
+### String
+
+```
+| varuint36_small: (num_bytes << 2) | coder | string bytes |
+```
+
+- coder(2 bits):LATIN1 / UTF16 / UTF8
+- UTF16 采用 little-endian code unit
+
+### Enum
+
+- `serializeEnumByName=true`:写 enum 名称(meta string)
+- 否则:写 ordinal(varuint32 small7)
+
+### Binary (byte[])
+
+```
+| varuint32: num_bytes | raw bytes |
+```
+
+### Primitive arrays
+
+默认:
+
+```
+| varuint32: byte_length | raw bytes |
+```
+
+可选压缩:
+
+- `compressIntArray`:`| length | varint32... |`
+- `compressLongArray`:`| length | varint64/tagged... |`
+
+### Object arrays
+
+```
+| varuint32_small7: (length << 1) | mono_flag |
+```
+
+- `mono_flag=1`:单态数组,共享组件 serializer
+- `mono_flag=0`:每元素独立 class info + data
+
+### Collections (List/Set)
+
+```
+| varuint32_small7: length | elements_header | [elem_class_info] | elements...
|
+```
+
+`elements_header`:
+
+- bit0: TRACKING_REF
+- bit1: HAS_NULL
+- bit2: IS_DECL_ELEMENT_TYPE
+- bit3: IS_SAME_TYPE
+
+### Maps
+
+```
+| varuint32_small7: size | chunk_1 | chunk_2 | ... |
+
+chunk:
+| header | chunk_size | [key_class_info] | [value_class_info] | entries... |
+```
+
+Map 采用 chunk 编码,每块最多 255 entries;key/value 的引用跟踪与类型声明按 header 位图控制。
+
+#### Null key/value entries
+
+`null key` 或 `null value` 使用特殊单条 chunk,不写 `chunk_size`,只写对应 payload。
+
+### Objects and structs
+
+对象值通道:
+
+```
+| ref meta | type meta | field data |
+```
+
+标准对象序列化中:
+
+- 字段按稳定顺序(DescriptorGrouper)排序
+- compatible 模式可借助 ClassDef 映射字段并跳过未知字段
+- 字段是否写 ref/type meta 由 nullable/ref/polymorphic 策略决定
+
+### Extensions (EXT)
+
+EXT 类型值由注册 serializer 定义;但其外层仍遵循统一的引用与类型元信息协议。
+
+## Out-of-band buffers
+
+当提供 `BufferCallback` 时,header 的 `oob` 位置 1。此时 serializer
可输出“缓冲区引用”而非内联字节(如大数组)。
+主流中仅保留引用信息,具体 OOB 缓冲区协议由 callback 实现定义。
diff --git
a/i18n/zh-CN/docusaurus-plugin-content-docs/current/specification/row_format_spec.md
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/specification/row_format_spec.md
new file mode 100644
index 0000000000..3f7f9866ef
--- /dev/null
+++
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/specification/row_format_spec.md
@@ -0,0 +1,356 @@
+---
+title: Row 格式
+sidebar_position: 2
+id: row_format_spec
+license: |
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+---
+
+## 概述
+
+Apache Fory Row Format 是面向高性能数据处理的二进制布局,目标是“可随机访问 + 低拷贝 + 跨语言一致”。
+
+相较于必须整对象反序列化的格式,Row Format 支持:
+
+- **随机字段读取**:只读目标字段
+- **零拷贝访问**:在可行场景直接基于内存切片读取
+- **缓存友好布局**:降低 CPU cache miss
+- **跨语言一致性**:Java/C++/Python 可共享标准格式
+
+Fory 提供两种变体:
+
+| 格式 | 支持语言 | 典型用途 |
+| ---------------- | -------------------- | -------------------------------- |
+| Standard Format | Java、C++、Python | 跨语言一致、实现简单 |
+| Compact Format | 仅 Java | 更小体积、更高局部性 |
+
+## 格式对比
+
+| 特性 | Standard Format | Compact Format
|
+| ---------------------- | --------------------------------- |
-------------------------------------- |
+| 字段槽位大小 | 固定 8 字节 | 按自然宽度(1/2/4/8 字节)
|
+| Null Bitmap | 8 字节对齐 | 字节对齐,可借用尾部 padding
|
+| Null Bitmap 位置 | 字段槽位之前 | 字段槽位之后(尾部)
|
+| 固定大小 struct | 放在 variable region(offset+size) | 可内联到 fixed region
|
+| 字段顺序 | 按 schema 定义顺序 | 按对齐规则排序
|
+| 全非空字段 | 仍保留 bitmap | 可完全省略 bitmap
|
+| 对齐策略 | 严格 8 字节 | 放宽(2/4/8 字节)
|
+
+## 标准 Row 格式
+
+标准格式强调跨语言统一与实现稳定:字段槽位统一 8 字节。
+
+### 设计原则
+
+1. **8 字节对齐**:主要结构按 8-byte 对齐
+2. **固定槽位**:每字段固定 8-byte slot,便于常数时间寻址
+3. **位图标记 null**:通过 bitset 跟踪空值
+4. **相对偏移**:变长数据通过相对偏移定位
+
+### Row 二进制布局
+
+```
++----------------+------------------+------------------+-----+------------------+------------------+
+| Null Bitmap | Field 0 Slot | Field 1 Slot | ... | Field N-1 Slot
| Variable Data |
++----------------+------------------+------------------+-----+------------------+------------------+
+| B bytes | 8 bytes | 8 bytes | | 8 bytes
| Variable size |
+```
+
+#### Null Bitmap
+
+- 大小:`((num_fields + 63) / 64) * 8` 字节(向上取整到 8-byte word)
+- 编码:每 bit 对应一个字段
+- bit=1 表示 null,bit=0 表示非 null
+- 第一字节 bit0 对应 field0
+
+#### 字段槽位
+
+- 任意字段都占 8 字节 slot
+- 槽位偏移:`bitmap_size + field_index * 8`
+- 固定区总大小:`bitmap_size + num_fields * 8`
+
+槽位内容:
+
+| 字段类别 | 槽位内容 |
+| ---------------- | ----------------------------------------- |
+| 定长类型 | 值直接写入(不足补零) |
+| 变长类型 | `offset + size` 打包 |
+
+#### 变长字段编码
+
+变长字段(string/array/map/nested struct)在 slot 中写入:
+
+```
++---------------------------+---------------------------+
+| Relative Offset | Size |
+| (32 bits) | (32 bits) |
++---------------------------+---------------------------+
+```
+
+- 高 32 位:相对 row 起始地址偏移
+- 低 32 位:数据长度(字节)
+
+编码:
+
+```
+offset_and_size = (relative_offset << 32) | size
+```
+
+解码:
+
+```
+relative_offset = (offset_and_size >> 32) & 0xFFFFFFFF
+size = offset_and_size & 0xFFFFFFFF
+```
+
+#### Variable Data 区
+
+- 位于 fixed region 之后
+- 变长字段按写入顺序顺排
+- 每个条目按 8-byte 对齐
+- padding 字节清零,保证输出确定性
+
+### Array 二进制布局
+
+```
++------------------+------------------+------------------+
+| Element Count | Null Bitmap | Element Data |
++------------------+------------------+------------------+
+| 8 bytes | B bytes | Variable size |
+```
+
+#### Array Header
+
+| 字段 | 大小 | 说明 |
+| --------------- | ------------------------------- | ----------------------- |
+| Element Count | 8 字节 | 元素数量(uint64) |
+| Null Bitmap | `((count + 63) / 64) * 8` 字节 | 每元素 null 标记 |
+
+#### Array Element Data
+
+- 定长元素按自然宽度连续存储
+- 变长元素存 8-byte `offset+size`
+- 元素偏移:`header_size + element_index * element_size`
+- 数据区总大小按 8-byte 对齐
+
+#### Array 元素大小
+
+| 元素类型 | 元素占用 |
+| ---------------- | -------------------------- |
+| bool/int8 | 1 byte |
+| int16 | 2 bytes |
+| int32/float32 | 4 bytes |
+| int64/float64 | 8 bytes |
+| string/binary | 8 bytes(offset+size) |
+
+### Map 二进制布局
+
+Map 在 Row Format 中可视为键值对数组,并包含类型信息与可空位图。
+
+#### Map 结构
+
+推荐逻辑结构:
+
+1. entry count
+2. key/value null bitmap(按实现可拆分)
+3. key data
+4. value data
+
+#### 嵌套 Struct 布局
+
+嵌套 struct 在标准格式中作为变长字段处理:
+
+- slot 写 `offset+size`
+- value region 中存其完整 row 二进制
+- 可递归嵌套
+
+## Compact Row Format(仅 Java)
+
+Compact 格式针对 Java 本地执行链路做体积与局部性优化,不保证与标准格式完全同布局。
+
+### 设计原则
+
+1. 字段槽按自然宽度缩小
+2. 字段重排以减少 padding
+3. null bitmap 可省略或压缩
+4. 定长嵌套 struct 尽可能内联
+
+### Compact Row Binary Layout
+
+总体仍是“fixed + variable”双区结构,但 fixed region 更紧凑,null bitmap 可能后置。
+
+#### 与标准格式的关键差异
+
+- slot 宽度非固定 8 字节
+- bitmap 可后置
+- 全非空时 bitmap 可省略
+- 可内联定长 nested struct
+
+#### Null Bitmap(Compact)
+
+- 按字节对齐
+- 可能复用尾部 padding
+- 无可空字段时可完全移除
+
+#### 字段排序算法
+
+典型排序目标:
+
+- 优先高对齐需求字段
+- 次序兼顾读取热度与 padding 最小化
+- 保持可重复计算(deterministic)
+
+#### 定长 Struct 内联
+
+若嵌套 struct 满足定长条件,可直接内联到 fixed region,减少一次间接寻址。
+
+#### 定宽计算
+
+定宽字段总大小由字段类型宽度与对齐约束共同决定,实际布局由编译器/运行时规划器输出。
+
+### Compact Array Binary Layout
+
+与标准数组类似,但 header 与元素布局可采用更紧凑表示。
+
+#### Compact Array Header
+
+包含:元素数量、null 信息(可选)、元素布局元信息(按实现)。
+
+#### 与标准数组关键差异
+
+- 头部更短
+- 元素存储更贴近自然宽度
+- 在 Java 热路径下更节省内存带宽
+
+## 通用规范
+
+### 类型编码
+
+#### Primitive Types
+
+基础类型按既定宽度和 endian 读写(默认 little-endian)。
+
+#### Temporal Types
+
+- `date`:通常以 epoch day 表示
+- `timestamp`:通常以 epoch 纳秒或秒+纳秒表示
+
+#### String 与 Binary
+
+都属于变长类型,使用 `offset+size` 指向真实 payload。
+
+### Null 处理
+
+#### Row Null 处理
+
+由 row bitmap 标记字段 null 状态,null 字段对应 slot 内容可忽略。
+
+#### Array Null 处理
+
+由数组 bitmap 标记每个元素是否为 null。
+
+#### 变长 null 语义
+
+null 与空值(如空字符串、空数组)必须区分;空值应写长度为 0 的实体。
+
+### 对齐与 Padding
+
+#### Standard 对齐
+
+以 8-byte 为主,保证跨语言一致实现简单。
+
+#### Compact 对齐
+
+允许 2/4/8 灵活对齐,目标是减少浪费。
+
+#### Padding 字节
+
+padding 建议写 0,避免未初始化内存泄露并提高可重复性。
+
+## 大小计算
+
+### Standard Row 大小
+
+```
+row_size = bitmap_size + num_fields * 8 + aligned(variable_region_size)
+```
+
+### Compact Row 大小
+
+```
+row_size = compact_fixed_size + optional_bitmap + aligned(variable_region_size)
+```
+
+### Standard Array 大小
+
+```
+array_size = header_size + aligned(element_data_size)
+```
+
+### Compact Array 大小
+
+```
+array_size = compact_header_size + aligned(compact_element_data_size)
+```
+
+### Map 大小
+
+```
+map_size = map_header + aligned(keys_region) + aligned(values_region)
+```
+
+## 汇总表
+
+### 布局总结
+
+| 结构 | Standard | Compact (Java)
|
+| --------------- | -------------------------------- |
-------------------------------- |
+| Row | bitmap + 8-byte slots + var data | compact fixed +
optional bitmap + var data |
+| Array | count + bitmap + elements | compact header +
elements |
+| Map | count + key/value data regions | 依实现可紧凑化
|
+
+### 类型宽度总结
+
+| 类型族 | 典型宽度 |
+| ---------------------- | --------------------------- |
+| bool/int8 | 1 byte |
+| int16 | 2 bytes |
+| int32/float32 | 4 bytes |
+| int64/float64 | 8 bytes |
+| string/binary/复杂类型 | slot 中 8-byte offset+size |
+
+## 实现说明
+
+### Endianness
+
+统一使用 little-endian,跨语言实现必须一致。
+
+### 内存安全
+
+- 读取前先做边界检查
+- 对 offset/size 做溢出检查
+- 避免使用未初始化 padding
+
+### 性能建议
+
+- 批量顺序写入,减少随机写
+- 热字段优先放 fixed region 前部
+- 通过 profile 决定是否启用 compact
+
+### 何时选择哪种格式
+
+- **Standard**:跨语言互通、调试友好、长期兼容
+- **Compact**:Java 单语言链路、内存敏感、高吞吐场景
diff --git
a/i18n/zh-CN/docusaurus-plugin-content-docs/current/specification/xlang_implementation_guide.md
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/specification/xlang_implementation_guide.md
new file mode 100644
index 0000000000..9e1e2dea33
--- /dev/null
+++
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/specification/xlang_implementation_guide.md
@@ -0,0 +1,251 @@
+---
+title: Xlang 实现指南
+sidebar_position: 10
+id: xlang_implementation_guide
+license: |
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+---
+
+## 实现建议
+
+### 如何减少内存读写开销
+
+- 尽量把多次 byte 写入合并为 int/long 写入,降低内存 IO 与边界检查成本。
+- 读取时可一次读取 int/long,再拆分字节,减少内存访问次数。
+- 尽可能把 flag 与 length 合并到同一个 varint/long,减少字节数与 IO。
+- 在分支数量可控的前提下,分支开销通常小于内存 IO 开销。
+
+### 静态语言(无运行时代码生成)如何做高性能反序列化
+
+在类型演进场景,序列化数据会携带 type meta。反序列化端会比较“数据内 meta”与“本地类 meta”,根据差异执行字段映射。
+
+对 Java/Javascript/Python,可在运行时根据 diff 动态生成并加载反序列化逻辑,从而接近 schema-consistent
模式性能。
+
+对 C++/Rust,通常无法在运行时动态生成 serializer,只能在编译期元编程生成。此时无法提前知道对端 schema,
+因此需要在运行时根据字段元信息逐个判断“赋值或跳过”。
+
+可行优化:将字符串字段匹配尽量提前转换为 `field id`,再在反序列化路径用 `switch` 处理,利用连续 case 的跳转优化。
+
+思路:
+
+- 假设本地类型字段数为 `n`,对端字段数为 `n1`
+- 编译期先为本地排序字段分配连续 `field id`(从 0 开始)
+- 运行时比较对端 type meta:同名字段复用本地 id,不同字段分配从 `n` 开始的新 id,并缓存映射
+- 反序列化遍历对端字段时对 `field_id` 做 `switch`,命中则赋值,未命中则跳过
+
+示例:A 进程持有 `Foo1`,B 进程持有演进后的 `Foo2`:
+
+```c++
+// class Foo with version 1
+class Foo1 {
+ int32_t v1; // id 0
+ std::string v2; // id 1
+};
+// class Foo with version 2
+class Foo2 {
+ // id 0, but will have id 2 in process A
+ bool v0;
+ // id 1, but will have id 0 in process A
+ int32_t v1;
+ // id 2, but will have id 3 in process A
+ int64_t long_value;
+ // id 3, but will have id 1 in process A
+ std::string v2;
+ // id 4, but will have id 4 in process A
+ std::vector<std::string> list;
+};
+```
+
+A 收到 B 发送的 `Foo2` 数据后,可按 `field_id` 快速分发:
+
+```c++
+Foo1 foo1 = ...;
+const std::vector<fory::FieldInfo> &field_infos = type_meta.field_infos;
+for (const auto &field_info : field_infos) {
+ switch (field_info.field_id) {
+ case 0:
+ foo1.v1 = buffer.read_varint32();
+ break;
+ case 1:
+ foo1.v2 = fory.read_string();
+ break;
+ default:
+ fory.skip_data(field_info);
+ }
+}
+```
+
+## 新语言实现检查清单
+
+本节给出在新语言中落地 Fory xlang 序列化的阶段性清单。
+
+### 阶段 1:核心基础设施
+
+1. **Buffer 实现**
+ - [ ] 提供带读写游标的字节缓冲区
+ - [ ] 所有多字节读写统一使用 little-endian
+ - [ ] 实现 `write_int8/int16/int32/int64`
+ - [ ] 实现 `write_float32/write_float64`
+ - [ ] 实现对应 `read_*` 方法
+ - [ ] 实现缓冲区扩容策略(如倍增)
+
+2. **Varint 编码**
+ - [ ] `write_varuint32/read_varuint32`
+ - [ ] `write_varint32/read_varint32`(含 ZigZag)
+ - [ ] `write_varuint64/read_varuint64`
+ - [ ] `write_varint64/read_varint64`(含 ZigZag)
+ - [ ] `write_varuint36_small/read_varuint36_small`(字符串头使用)
+ - [ ] 可选:实现 int64 Hybrid 编码(TAGGED_INT64/TAGGED_UINT64)
+
+3. **头部处理**
+ - [ ] 读写 bitmap flags(null、xlang、oob)
+
+### 阶段 2:基础类型序列化
+
+4. **基础类型**
+ - [ ] bool(1 字节:0/1)
+ - [ ] int8/int16/int32/int64(little-endian)
+ - [ ] float32/float64(IEEE 754,little-endian)
+
+5. **字符串序列化**
+ - [ ] 实现字符串头:`(byte_length << 2) | encoding`
+ - [ ] 支持 UTF-8(xlang 必需)
+ - [ ] 可选支持 LATIN1 与 UTF-16
+
+6. **时间类型**
+ - [ ] Duration(seconds + nanoseconds)
+ - [ ] Timestamp(epoch 以来 seconds + nanoseconds)
+ - [ ] Date(epoch 以来天数)
+
+7. **引用跟踪**
+ - [ ] 写侧对象跟踪(object -> ref_id)
+ - [ ] 读侧对象跟踪(ref_id -> object)
+ - [ ] 支持 4 种引用标记:NULL(-3)、REF(-2)、NOT_NULL(-1)、REF_VALUE(0)
+ - [ ] 支持按类型或全局关闭引用跟踪
+
+### 阶段 3:集合类型
+
+8. **List/Array**
+ - [ ] 长度写为 varuint32
+ - [ ] 写 elements header byte
+ - [ ] 处理同构/异构元素
+ - [ ] 处理 null 元素
+
+9. **Map**
+ - [ ] 总大小写为 varuint32
+ - [ ] 实现分块格式(每块最多 255 对)
+ - [ ] 每块写 KV header
+ - [ ] 处理 key/value 类型变化
+
+10. **Set**
+ - [ ] 与 List 复用同一套实现
+
+### 阶段 4:Meta String 编码
+
+meta string 用于 enum/struct 的字段名、类型名、命名空间编码。
+
+11. **Meta String 压缩**
+ - [ ] LOWER_SPECIAL(5 bits/char)
+ - [ ] LOWER_UPPER_DIGIT_SPECIAL(6 bits/char)
+ - [ ] FIRST_TO_LOWER_SPECIAL
+ - [ ] ALL_TO_LOWER_SPECIAL
+ - [ ] 编码选择算法
+ - [ ] meta string 去重
+
+### 阶段 5:Enum 序列化
+
+12. **Enum**
+ - [ ] ordinal 写为 varuint32
+ - [ ] 支持命名 enum(namespace + typename)
+
+### 阶段 6:Struct 序列化
+
+13. **类型注册**
+ - [ ] 支持按数值 ID 注册
+ - [ ] 支持按 namespace + typename 注册
+ - [ ] 维护 type -> serializer 映射
+ - [ ] 生成 type ID:先写 internal type ID,再写 `user_type_id(varuint32)`
+
+14. **字段排序**
+ - [ ] 实现规范定义的分组与排序(primitive/boxed/builtin、collections/maps、other)
+ - [ ] 组内使用稳定比较器(type ID + name)
+ - [ ] 指纹字段标识使用 tag ID 或 snake_case 字段名
+
+15. **Schema Consistent 模式**
+ - [ ] 开启类版本校验时,按字段标识计算 schema hash
+ - [ ] 在字段前写 4-byte schema hash
+ - [ ] 按 Fory 字段顺序序列化
+
+16. **Compatible/Meta Share 模式**
+ - [ ] 实现共享 TypeDef 流(新 TypeDef 内联,已存在用索引)
+ - [ ] 按字段名或 tag ID 做映射,未知字段跳过
+ - [ ] 按 TypeDef 元信息应用 nullable/ref 规则
+
+### 阶段 7:其他类型
+
+17. **Binary/Array**
+
+- [ ] 基础类型数组支持直接 buffer copy
+- [ ] 多维数组按嵌套 list 表达(不做 tensor 专用编码)
+
+### 测试策略
+
+18. **跨语言兼容测试**
+ - [ ] 新语言写 -> Java/Python 读
+ - [ ] Java/Python 写 -> 新语言读
+ - [ ] 覆盖所有基础类型
+ - [ ] 覆盖不同字符串编码
+ - [ ] 覆盖集合(空、单元素、多元素)
+ - [ ] 覆盖不同 key/value map
+ - [ ] 覆盖嵌套 struct
+ - [ ] 覆盖循环引用(若支持)
+
+## 各语言实现备注
+
+### Java
+
+- 通过运行时代码生成(JIT)获得高性能
+- 支持完整引用跟踪模式
+- 利用 String coder 做编码选择
+- 可通过 `ThreadSafeFory` 提供线程安全封装
+
+### Python
+
+- 提供纯 Python(调试)与 Cython(性能)两种模式
+- 使用 `id(obj)` 做引用跟踪
+- xlang 模式支持 LATIN1/UTF-16/UTF-8
+- 通过代码生成增强 `dataclass` 支持
+
+### C++
+
+- 通过宏(`FORY_STRUCT`)做编译期反射
+- 模板元编程进行类型分发与 serializer 选择
+- 使用 `std::shared_ptr` 支持引用跟踪
+- 编译期字段排序
+- 不依赖运行时代码生成
+
+### Rust
+
+- 使用 derive 宏自动生成序列化代码(`#[derive(ForyObject)]`)
+- 使用 `Rc<T>`/`Arc<T>` 做引用跟踪
+- 通过线程本地上下文缓存优化性能
+- 编译期字段排序
+
+### Go
+
+- 支持反射模式与代码生成模式
+- 通过 struct tag 提供字段元信息
+- 通过接口类型支持多态语义
diff --git
a/i18n/zh-CN/docusaurus-plugin-content-docs/current/specification/xlang_serialization_spec.md
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/specification/xlang_serialization_spec.md
new file mode 100644
index 0000000000..1a1800bbc6
--- /dev/null
+++
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/specification/xlang_serialization_spec.md
@@ -0,0 +1,558 @@
+---
+title: Xlang 序列化格式
+sidebar_position: 4
+id: xlang_serialization_spec
+license: |
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+---
+
+## 跨语言序列化规范
+
+本文定义 Apache Fory xlang 二进制协议的通用线格式,适用于多语言互操作场景。
+
+目标:
+
+- 二进制布局跨语言稳定
+- 支持引用跟踪、类型元信息和 schema 演进
+- 在流式序列化中支持增量写入共享元信息
+
+## 类型系统
+
+### 数据类型
+
+xlang 类型分为:
+
+- 基础类型:bool、整数、浮点、string、binary
+- 容器类型:list、set、map、array
+- 结构类型:enum、struct、union、ext
+- 时间类型:duration、timestamp、date
+
+### Polymorphisms
+
+协议支持多态对象。解码端可依据 type meta 判断运行时真实类型,并选择对应 serializer。
+
+### Type disambiguation
+
+当某语言类型可映射到多个 Fory 类型(如 fixed/varint/tagged 整数)时,必须通过字段元信息或类型注解消歧。
+
+### Type ID
+
+类型由 `internal_type_id` 与(可选)`user_type_id` 共同表达:
+
+- 内建类型通常直接由 internal ID 唯一表示
+- 用户类型通过 internal kind + user ID(或命名类型)表示
+
+#### Internal Type ID Table
+
+核心 internal IDs(示例):
+
+| ID | 类型 |
+| --- | ------------------- |
+| 1 | bool |
+| 2-20| 各类数字类型 |
+| 21 | string |
+| 22 | list |
+| 23 | set |
+| 24 | map |
+| 25 | enum |
+| 27 | struct |
+| 28 | compatible_struct |
+| 31 | ext |
+| 33 | union |
+| 36 | none |
+| 37 | duration |
+| 38 | timestamp |
+| 39 | date |
+| 40+ | decimal/binary/array 等 |
+
+完整映射见 [Xlang 类型映射](xlang_type_mapping.md)。
+
+#### Type ID Encoding for User Types
+
+用户类型采用拆分编码:
+
+- 先写 internal type ID(8-bit kind)
+- 再写 `user_type_id`(varuint32)
+
+不做 bit packing,便于实现与调试。
+
+### Type mapping
+
+跨语言类型映射总表见 [xlang_type_mapping.md](xlang_type_mapping.md)。
+
+## 规范概览
+
+顶层布局:
+
+```
+| fory header | reference meta | type meta | value payload |
+```
+
+协议默认 little-endian。
+
+## Fory 头部
+
+头部是 1-byte bitmap:
+
+```
+| reserved(5) | oob(1) | xlang(1) | null(1) |
+```
+
+- `null=1` 时值为空,不再写值数据
+- `xlang=1` 表示采用 xlang 格式
+- `oob=1` 表示存在 out-of-band 缓冲区引用
+
+## Reference Meta
+
+### Reference Flags
+
+| 标记 | 值 | 含义 |
+| -------------------- | ---- | ----------------------------------------- |
+| NULL_FLAG | -3 | null |
+| REF_FLAG | -2 | 已出现对象,后接 ref id |
+| NOT_NULL_VALUE_FLAG | -1 | 非空但不跟踪引用 |
+| REF_VALUE_FLAG | 0 | 首次出现的可引用对象 |
+
+### Reference Tracking Algorithm
+
+写侧:
+
+1. 先判断 null
+2. 若可引用且已出现,写 `REF_FLAG + ref_id`
+3. 若可引用且首次出现,写 `REF_VALUE_FLAG` 并登记
+4. 若不可引用,写 `NOT_NULL_VALUE_FLAG`
+
+读侧:
+
+1. 读取标记
+2. `REF_FLAG` 时按 ref_id 回表
+3. `REF_VALUE_FLAG` 时先构造对象再登记
+4. `NOT_NULL_VALUE_FLAG` 时直接读值
+
+### Reference ID Assignment
+
+ref id 按对象首次出现顺序递增分配,从 0 开始。
+
+### When Reference Tracking is Disabled
+
+禁用引用跟踪时,仅使用 null / not-null 两类标记,不维护 ref 表。
+
+### Language-Specific Considerations
+
+不同语言应保证:
+
+- 对象身份判定一致(身份而非值相等)
+- 容器元素引用语义一致
+- 循环引用场景先占位后填充
+
+## Type Meta
+
+### Type ID encoding
+
+type id 使用 varuint 编码写入。
+
+### Type meta payload
+
+在以下情况写额外 type meta:
+
+- 命名类型(`NAMED_*`)
+- compatible struct 需要 TypeDef
+- 运行时未声明类型需要动态 type info
+
+### Shared Type Meta (streaming)
+
+共享 type meta 采用“索引 + 可选定义体”流式写法:
+
+```
+index_marker = (index << 1) | is_ref
+```
+
+- `is_ref=1`:引用已有 type
+- `is_ref=0`:新 type,后接定义体
+
+### TypeDef (schema evolution metadata)
+
+TypeDef 用于描述 compatible 模式的字段元信息(字段名/tag、nullable/ref、字段类型)。
+
+#### Global header
+
+TypeDef 头部包含:
+
+- payload size
+- flags(如 compress、has_fields_meta)
+- payload hash
+
+#### TypeDef body
+
+主体包含:
+
+- class 层次信息(父类到子类)
+- 每层字段数量与类型标识
+- 字段级元信息(名称编码/tag、nullable/ref、field type)
+
+## Meta String
+
+meta string 用于 namespace、typename、fieldname 的压缩表示。
+
+### Encoding Type IDs
+
+常见编码族:
+
+- UTF8
+- LOWER_SPECIAL
+- LOWER_UPPER_DIGIT_SPECIAL
+- FIRST_TO_LOWER_SPECIAL
+- ALL_TO_LOWER_SPECIAL
+
+### Character Mapping Tables
+
+#### LOWER_SPECIAL (5 bits per character)
+
+适用于小写字母 + 高频特殊字符集合。
+
+#### LOWER_UPPER_DIGIT_SPECIAL (6 bits per character)
+
+适用于大小写字母、数字与特殊字符混合场景。
+
+### Encoding Algorithms
+
+#### LOWER_SPECIAL Encoding
+
+按 5-bit 映射逐字符编码,无法映射的字符需回退至其他编码。
+
+#### FIRST_TO_LOWER_SPECIAL Encoding
+
+首字符单独处理,其余字符按 LOWER_SPECIAL 编码。
+
+#### ALL_TO_LOWER_SPECIAL Encoding
+
+先归一化,再按 LOWER_SPECIAL 编码。
+
+### Encoding Selection Algorithm
+
+编码选择策略:
+
+1. 尝试最紧凑编码
+2. 若字符集合不满足则降级
+3. 必要时回退 UTF8
+
+### Meta String Header Format
+
+```
+| size_bits | encoding_bits |
+```
+
+当 `size` 超过短头范围时追加 varuint 扩展长度。
+
+### Special Character Sets by Context
+
+不同上下文(包名、类型名、字段名)允许字符集合可不同,编码器需按上下文选择合法表。
+
+### Deduplication
+
+meta string 可按会话去重,减少重复写入。
+
+## Value Format
+
+### Basic types
+
+#### bool
+
+1 字节:`0x00/0x01`。
+
+#### int8
+
+1 字节有符号整型。
+
+#### int16
+
+2 字节 little-endian。
+
+#### unsigned int32
+
+固定 4 字节无符号整型。
+
+#### unsigned varint32
+
+varint32(无符号)编码。
+
+#### signed int32
+
+固定 4 字节有符号整型。
+
+#### signed varint32
+
+ZigZag + varint32。
+
+#### unsigned int64
+
+固定 8 字节无符号整型。
+
+#### unsigned varint64
+
+varint64(无符号)编码。
+
+#### unsigned hybrid int64 (TAGGED_UINT64)
+
+tagged 编码,兼顾小值空间效率与大值表示范围。
+
+#### VarUint36Small
+
+用于字符串头等场景的紧凑长度编码。
+
+#### signed int64
+
+固定 8 字节有符号整型。
+
+#### signed varint64
+
+ZigZag + varint64。
+
+#### signed hybrid int64 (TAGGED_INT64)
+
+tagged int64 编码。
+
+#### float8
+
+预留/实验类型,生产互操作需谨慎。
+
+#### float16
+
+16-bit 浮点。
+
+#### bfloat16
+
+bfloat16 表示。
+
+#### float32
+
+IEEE 754 float32 little-endian。
+
+#### float64
+
+IEEE 754 float64 little-endian。
+
+### string
+
+字符串编码:
+
+```
+| header(varuint36_small) | bytes |
+```
+
+header 中包含 byte length 与 coder 信息。
+
+#### String Header
+
+`(byte_length << 2) | coder`,coder 表示 UTF8/LATIN1/UTF16 等。
+
+#### Encoding Algorithm
+
+按候选编码尝试,优先选择更紧凑且可无损表示的编码。
+
+#### Encoding Selection by Language
+
+各语言实现可按本地字符串内部表示优化,但线上编码结果必须与规范一致。
+
+#### Empty String
+
+空串长度为 0,仍应写合法 header。
+
+### duration
+
+通常写 `seconds + nanos`。
+
+### collection/list
+
+列表布局:
+
+1. 长度
+2. elements header
+3. (可选)元素类型信息
+4. 元素数据
+
+#### Elements Header
+
+header 位用于表达:
+
+- 是否跟踪元素引用
+- 是否含 null
+- 是否同构
+- 是否使用声明类型
+
+#### Type Info After Header
+
+在同构且非声明类型场景,可在 header 后一次性写 element type info。
+
+#### Element Serialization Based on Header
+
+根据 header 走不同元素序列化路径(同构快路径 / 异构慢路径)。
+
+#### elements data
+
+元素数据按顺序编码;null 与 ref 标记按配置插入。
+
+### array
+
+#### primitive array
+
+基础类型数组可直接按内存块拷贝(注意 endian 与对齐)。
+
+#### Multi-dimensional arrays
+
+多维数组按嵌套 array/list 递归表达。
+
+#### object array
+
+对象数组元素逐个编码,支持引用与多态。
+
+### map
+
+map 使用分块编码(chunk-based)。
+
+#### Map Chunk Format
+
+```
+| map_size | chunk_1 | chunk_2 | ... |
+```
+
+#### KV Header Bits
+
+header 位描述 key/value 的:
+
+- 是否跟踪引用
+- 是否含 null
+- 是否使用声明类型
+
+#### Chunk Size
+
+每个 chunk 大小上限通常为 255 entries。
+
+#### Why Chunk-Based Format?
+
+减少每个 entry 重复写 type info 的成本,提升吞吐。
+
+#### Why serialize chunk by chunk?
+
+在 key/value 类型局部一致时可批量走快路径,并简化解码分支。
+
+### enum
+
+enum 可按 ordinal 或名称编码(取决于配置与目标兼容要求)。
+
+### timestamp
+
+通常写 `seconds + nanos` 或统一 epoch 精度表示。
+
+### date
+
+通常写 epoch day。
+
+### decimal
+
+decimal 由 scale + unscaled value 表示(实现可用大整数)。
+
+### struct
+
+struct 编码:字段按稳定顺序写入。
+
+#### Field order
+
+推荐使用规范定义的稳定分组排序,避免语言实现差异导致 hash 不一致。
+
+##### Step 1: Field identifier
+
+字段标识优先使用 tag ID;否则使用标准化字段名(如 snake_case)。
+
+##### Step 2: Group assignment
+
+按字段类别分组(primitive、builtin、collection/map、other)。
+
+##### Step 3: Intra-group ordering
+
+组内使用稳定比较器(type + name/tag)排序。
+
+##### Notes
+
+实现必须保证排序确定性(deterministic)。
+
+#### Schema consistent (meta share disabled)
+
+不共享 meta 时,双方 schema 需一致;通常直接按固定顺序写字段值。
+
+#### Compatible mode (meta share enabled)
+
+共享 TypeDef 后可按字段名/tag 做映射,未知字段跳过。
+
+### Union
+
+#### IDL syntax
+
+```protobuf
+union Animal {
+ Dog dog = 1;
+ Cat cat = 2;
+}
+```
+
+#### Type IDs and type meta
+
+union 本体有独立 type id,case 使用 case id 区分分支。
+
+#### Union value payload
+
+```
+| case_id | case_value |
+```
+
+#### Wire layouts
+
+根据 case 类型是否需要引用/类型元信息决定具体布局。
+
+#### Decoding rules
+
+先读 case_id,再按 case 类型规则读 payload;未知 case 可按兼容策略跳过或报错。
+
+#### When to use each type ID
+
+- 结构稳定、跨语言常驻类型:建议固定数值 type id
+- 动态类型/未注册类型:使用命名类型路径
+
+#### Compatibility notes
+
+新增 union case 应使用新 case id,不应复用旧 id。
+
+### Type
+
+动态 `type` 值应携带足够 type meta,确保接收端可判别并解码。
+
+## Common Pitfalls
+
+常见问题:
+
+1. 字段排序不稳定导致 schema/hash 不一致
+2. varint 与 fixed/tagged 配置不一致
+3. null 与空值语义混淆
+4. 引用跟踪开关两端不一致
+5. 命名类型 namespace/typename 不稳定
+
+## Language Implementation Guidelines
+
+- 统一 little-endian
+- 明确对象身份语义(用于 ref tracking)
+- 对所有 offset/size 做边界与溢出检查
+- 维护跨版本回归用例(含演进、循环引用、复杂容器)
+- 与 Java/Python/C++/Rust/Go 做双向互测
diff --git
a/i18n/zh-CN/docusaurus-plugin-content-docs/current/specification/xlang_type_mapping.md
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/specification/xlang_type_mapping.md
new file mode 100644
index 0000000000..59b1171838
--- /dev/null
+++
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/specification/xlang_type_mapping.md
@@ -0,0 +1,146 @@
+---
+title: Xlang 类型映射
+sidebar_position: 7
+id: xlang_type_mapping
+license: |
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+---
+
+说明:
+
+- 类型定义请参见 [Type Systems in Spec](xlang_serialization_spec.md#type-systems)
+- `int16_t[n]/vector<T>` 表示 `int16_t[n]/vector<int16_t>` 这一类数组/向量形式
+- 跨语言序列化协议仍在演进,生产环境请先做严格兼容验证
+
+## 用户类型 ID
+
+注册用户类型(struct/ext/enum/union)时:
+
+- type 字段先写入 8-bit internal kind
+- 用户类型 ID (`user_type_id`) 单独以 `varuint32` 写入
+- 不做 bit shift 或 packing
+- `user_type_id` 范围可用 `0 ~ 0xFFFFFFFE`
+
+示例:
+
+| User ID | Type | Internal ID | Encoded User ID | Decimal |
+| ------- | ----------------- | ----------- | --------------- | ------- |
+| 0 | STRUCT | 27 | 0 | 0 |
+| 0 | ENUM | 25 | 0 | 0 |
+| 1 | STRUCT | 27 | 1 | 1 |
+| 1 | COMPATIBLE_STRUCT | 28 | 1 | 1 |
+| 2 | NAMED_STRUCT | 29 | 2 | 2 |
+
+读取类型 ID 时:
+
+- 先读取 internal type ID
+- 若属于用户注册类型,再继续读取 `user_type_id(varuint32)`
+
+## 类型映射
+
+| Fory Type | Fory Type ID | Java | Python
| Javascript | C++ | Golang
| Rust |
+| ----------------------- | ------------ | --------------- |
------------------------ | ------------------- | ------------------------------
| ---------------- | ----------------- |
+| bool | 1 | bool/Boolean | bool
| Boolean | bool | bool
| bool |
+| int8 | 2 | byte/Byte | int/pyfory.int8
| Type.int8() | int8_t | int8
| i8 |
+| int16 | 3 | short/Short | int/pyfory.int16
| Type.int16() | int16_t | int16
| i16 |
+| int32 | 4 | int/Integer |
int/pyfory.fixed_int32 | Type.int32() | int32_t
| int32 | i32 |
+| varint32 | 5 | int/Integer | int/pyfory.int32
| Type.varint32() | int32_t | int32
| i32 |
+| int64 | 6 | long/Long |
int/pyfory.fixed_int64 | Type.int64() | int64_t
| int64 | i64 |
+| varint64 | 7 | long/Long | int/pyfory.int64
| Type.varint64() | int64_t | int64
| i64 |
+| tagged_int64 | 8 | long/Long |
int/pyfory.tagged_int64 | Type.tagged_int64() | int64_t
| int64 | i64 |
+| uint8 | 9 | short/Short | int/pyfory.uint8
| Type.uint8() | uint8_t | uint8
| u8 |
+| uint16 | 10 | int/Integer | int/pyfory.uint16
| Type.uint16() | uint16_t | uint16
| u16 |
+| uint32 | 11 | long/Long |
int/pyfory.fixed_uint32 | Type.uint32() | uint32_t
| uint32 | u32 |
+| var_uint32 | 12 | long/Long | int/pyfory.uint32
| Type.varUInt32() | uint32_t | uint32
| u32 |
+| uint64 | 13 | long/Long |
int/pyfory.fixed_uint64 | Type.uint64() | uint64_t
| uint64 | u64 |
+| var_uint64 | 14 | long/Long | int/pyfory.uint64
| Type.varUInt64() | uint64_t | uint64
| u64 |
+| tagged_uint64 | 15 | long/Long |
int/pyfory.tagged_uint64 | Type.taggedUInt64() | uint64_t
| uint64 | u64 |
+| float8 | 16 | / | /
| / | / | /
| / |
+| float16 | 17 | float/Float |
float/pyfory.float16 | Type.float16() | fory::float16_t
| fory.float16 | fory::f16 |
+| bfloat16 | 18 | / | /
| / | / | /
| / |
+| float32 | 19 | float/Float |
float/pyfory.float32 | Type.float32() | float
| float32 | f32 |
+| float64 | 20 | double/Double |
float/pyfory.float64 | Type.float64() | double
| float64 | f64 |
+| string | 21 | String | str
| String | string | string
| String/str |
+| list | 22 | List/Collection | list/tuple
| array | vector | slice
| Vec |
+| set | 23 | Set | set
| / | set | fory.Set
| Set |
+| map | 24 | Map | dict
| Map | unordered_map | map
| HashMap |
+| enum | 25 | Enum subclasses | enum subclasses
| / | enum | /
| enum |
+| named_enum | 26 | Enum subclasses | enum subclasses
| / | enum | /
| enum |
+| struct | 27 | pojo/record | data class
| object | struct/class | struct
| struct |
+| compatible_struct | 28 | pojo/record | data class
| object | struct/class | struct
| struct |
+| named_struct | 29 | pojo/record | data class
| object | struct/class | struct
| struct |
+| named_compatible_struct | 30 | pojo/record | data class
| object | struct/class | struct
| struct |
+| ext | 31 | pojo/record | data class
| object | struct/class | struct
| struct |
+| named_ext | 32 | pojo/record | data class
| object | struct/class | struct
| struct |
+| union | 33 | Union | typing.Union
| / | `std::variant<Ts...>` | /
| tagged union enum |
+| none | 36 | null | None
| null | `std::monostate` | nil
| `()` |
+| duration | 37 | Duration | timedelta
| Number | duration | Duration
| Duration |
+| timestamp | 38 | Instant | datetime
| Number | std::chrono::nanoseconds | Time
| DateTime |
+| date | 39 | Date | datetime
| Number | fory::serialization::Date | Time
| DateTime |
+| decimal | 40 | BigDecimal | Decimal
| bigint | / | /
| / |
+| binary | 41 | byte[] | bytes
| / | `uint8_t[n]/vector<T>` | `[n]uint8/[]T`
| `Vec<uint8_t>` |
+| array | 42 | array | np.ndarray
| / | / | array/slice
| Vec |
+| bool_array | 43 | bool[] |
ndarray(np.bool\_) | / | `bool[n]`
| `[n]bool/[]T` | `Vec<bool>` |
+| int8_array | 44 | byte[] | ndarray(int8)
| / | `int8_t[n]/vector<T>` | `[n]int8/[]T`
| `Vec<i8>` |
+| int16_array | 45 | short[] | ndarray(int16)
| / | `int16_t[n]/vector<T>` | `[n]int16/[]T`
| `Vec<i16>` |
+| int32_array | 46 | int[] | ndarray(int32)
| / | `int32_t[n]/vector<T>` | `[n]int32/[]T`
| `Vec<i32>` |
+| int64_array | 47 | long[] | ndarray(int64)
| / | `int64_t[n]/vector<T>` | `[n]int64/[]T`
| `Vec<i64>` |
+| uint8_array | 48 | short[] | ndarray(uint8)
| / | `uint8_t[n]/vector<T>` | `[n]uint8/[]T`
| `Vec<u8>` |
+| uint16_array | 49 | int[] | ndarray(uint16)
| / | `uint16_t[n]/vector<T>` | `[n]uint16/[]T`
| `Vec<u16>` |
+| uint32_array | 50 | long[] | ndarray(uint32)
| / | `uint32_t[n]/vector<T>` | `[n]uint32/[]T`
| `Vec<u32>` |
+| uint64_array | 51 | long[] | ndarray(uint64)
| / | `uint64_t[n]/vector<T>` | `[n]uint64/[]T`
| `Vec<u64>` |
+| float8_array | 52 | / | /
| / | / | /
| / |
+| float16_array | 53 | float[] | ndarray(float16)
| / | `fory::float16_t[n]/vector<T>` |
`[n]float16/[]T` | `Vec<fory::f16>` |
+| bfloat16_array | 54 | / | /
| / | / | /
| / |
+| float32_array | 55 | float[] | ndarray(float32)
| / | `float[n]/vector<T>` |
`[n]float32/[]T` | `Vec<f32>` |
+| float64_array | 56 | double[] | ndarray(float64)
| / | `double[n]/vector<T>` |
`[n]float64/[]T` | `Vec<f64>` |
+
+## 类型信息(当前尚未完整实现)
+
+由于不同语言类型系统存在差异,部分类型无法一一对应映射。
+
+如果某语言中的一个类型可能对应多个 Fory 类型(例如 Java `long` 可能对应 `int64/varint64/tagged_int64`),
+说明该语言缺少更细粒度区分,此时调用方需要额外提供类型信息。
+
+## 类型注解
+
+当某类型作为其他类的字段时,可以通过字段级或类型级元数据提示具体编码语义。不同语言的配置方式:
+
+- Java:注解
+- C++:宏与模板
+- Go:struct tag
+- Python:type hint
+- Rust:宏
+
+示例:
+
+- Java:
+
+ ```java
+ class Foo {
+ @Int32Type(varint = true)
+ int f1;
+ List<@Int32Type(varint = true) Integer> f2;
+ }
+ ```
+
+- Python:
+
+ ```python
+ class Foo:
+ f1: pyfory.varint32
+ f2: List[pyfory.varint32]
+ ```
diff --git
a/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.15/specification/java_serialization_spec.md
b/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.15/specification/java_serialization_spec.md
new file mode 100644
index 0000000000..959eeb2b6b
--- /dev/null
+++
b/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.15/specification/java_serialization_spec.md
@@ -0,0 +1,381 @@
+---
+title: Java 序列化格式
+sidebar_position: 1
+id: java_serialization_spec
+license: |
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+---
+
+本文定义 Apache Fory Java 原生序列化格式的编码格式细节。
+
+## 规范概览
+
+Fory Java 原生格式面向 Java 对象图,支持:
+
+- 共享引用与循环引用
+- 多态对象
+- 可选 schema 演进
+- 流式写入(共享 type meta 按需内联,不要求预先 meta 区)
+
+Java native 是 xlang 编码格式的扩展,复用相同核心帧与基础编码。
+
+总体布局:
+
+```
+| fory header | object ref meta | object type meta | object value data |
+```
+
+字节序统一为 little-endian。大端平台实现需在数组等路径做字节序转换,确保线上格式一致。
+
+## Fory 头部
+
+Java 原生序列化头部是 1-byte 位图:
+
+```
+| 5 bits | 1 bit | 1 bit | 1 bit |
++--------------+-------+-------+-------+
+| reserved | oob | xlang | null |
+```
+
+含义:
+
+- `null`:对象是否为 null(为 1 时其余位不应置位)
+- `xlang`:1 表示 xlang 格式,0 表示 Java native
+- `oob`:1 表示存在 `BufferCallback`
+
+头部始终 1 字节,不额外写 language ID。
+
+## 引用元信息
+
+引用跟踪标记与 xlang 一致:
+
+| 标记 | 字节值 | 说明
|
+| -------------------- | ------ |
------------------------------------------------------ |
+| NULL FLAG | `-3` | 对象为 null,后续不写对象内容 |
+| REF FLAG | `-2` | 已出现对象,后接 `varuint32` 的 reference ID
|
+| NOT_NULL VALUE FLAG | `-1` | 非空但该类型未启用引用跟踪,后接对象内容 |
+| REF VALUE FLAG | `0` | 可引用对象首次出现,后接对象内容,并分配新 reference ID |
+
+当全局或字段级禁用引用跟踪时,仅使用 `NULL FLAG` 与 `NOT_NULL VALUE FLAG`。
+
+## Type system and type IDs
+
+Java native 使用与 xlang 统一的类型 ID 组合方式:
+
+```
+full_type_id = (user_type_id << 8) | internal_type_id
+```
+
+- `internal_type_id`:低 8 位,表示类型种类
+- `user_type_id`:用户注册数值 ID(适用于用户 enum/struct/ext)
+- named 类型使用 `NAMED_*`,其标识来自元信息(命名空间+类型名)
+
+### Shared internal type IDs (0-63)
+
+Java native 与 xlang 共享 `< 64` 的 internal IDs:
+
+- `0~56` 已定义
+- `57~63` 预留
+
+详见 [Xlang Serialization
Format](xlang_serialization_spec.md#internal-type-id-table)。
+
+### Java native built-in type IDs
+
+Java 专有内建类型从 `Types.BOUND + 5` 开始(`Types.BOUND=64`,预留 5 个)。
+
+| Type ID | Name | Description |
+| ------- | -------------------------- | ------------------------------ |
+| 69 | VOID_ID | java.lang.Void |
+| 70 | CHAR_ID | java.lang.Character |
+| 71 | PRIMITIVE_VOID_ID | void |
+| 72 | PRIMITIVE_BOOL_ID | boolean |
+| 73 | PRIMITIVE_INT8_ID | byte |
+| 74 | PRIMITIVE_CHAR_ID | char |
+| 75 | PRIMITIVE_INT16_ID | short |
+| 76 | PRIMITIVE_INT32_ID | int |
+| 77 | PRIMITIVE_FLOAT32_ID | float |
+| 78 | PRIMITIVE_INT64_ID | long |
+| 79 | PRIMITIVE_FLOAT64_ID | double |
+| 80 | PRIMITIVE_BOOLEAN_ARRAY_ID | boolean[] |
+| 81 | PRIMITIVE_BYTE_ARRAY_ID | byte[] |
+| 82 | PRIMITIVE_CHAR_ARRAY_ID | char[] |
+| 83 | PRIMITIVE_SHORT_ARRAY_ID | short[] |
+| 84 | PRIMITIVE_INT_ARRAY_ID | int[] |
+| 85 | PRIMITIVE_FLOAT_ARRAY_ID | float[] |
+| 86 | PRIMITIVE_LONG_ARRAY_ID | long[] |
+| 87 | PRIMITIVE_DOUBLE_ARRAY_ID | double[] |
+| 88 | STRING_ARRAY_ID | String[] |
+| 89 | OBJECT_ARRAY_ID | Object[] |
+| 90 | ARRAYLIST_ID | java.util.ArrayList |
+| 91 | HASHMAP_ID | java.util.HashMap |
+| 92 | HASHSET_ID | java.util.HashSet |
+| 93 | CLASS_ID | java.lang.Class |
+| 94 | EMPTY_OBJECT_ID | empty object stub |
+| 95 | LAMBDA_STUB_ID | lambda stub |
+| 96 | JDK_PROXY_STUB_ID | JDK proxy stub |
+| 97 | REPLACE_STUB_ID | writeReplace/readResolve stub |
+| 98 | NONEXISTENT_META_SHARED_ID | meta-shared unknown class stub |
+
+### Registration and named types
+
+用户类型可按数值或名称注册:
+
+- 数值注册:`full_type_id = (user_id << 8) | internal_type_id`
+- 名称注册:通过 namespace + typename
+- 未注册类型按 named 类型写出(namespace=包名,typename=类名)
+
+未注册时命名类型选择:
+
+- enum -> `NAMED_ENUM`
+- struct-like -> `NAMED_STRUCT`(兼容模式下 `NAMED_COMPATIBLE_STRUCT`)
+- 其他自定义 serializer -> `NAMED_EXT`
+
+## Type meta encoding
+
+每个值写入流程:
+
+1. 写 `type_id`(varuint32 small7)
+2. 对 `NAMED_*` / `COMPATIBLE_STRUCT` 等类型按规则写额外元信息
+3. 其余类型无需额外 meta
+
+### Shared class meta (streaming)
+
+开启 meta share 时,使用流式共享 class meta:
+
+```
+| varuint32: index_marker | [class def bytes if new] |
+
+index_marker = (index << 1) | flag
+flag = 1 -> reference
+flag = 0 -> new type
+```
+
+- `flag=1`:引用历史 type,后续无 class def bytes
+- `flag=0`:新 type,后续内联 class def
+- index 按首次出现顺序递增
+
+## Schema modes
+
+Java native 支持两种模式:
+
+- **Schema consistent**(compatible 关闭):字段按固定顺序写,不需要 ClassDef
+- **Schema evolution**(compatible 开启):按 ClassDef 元信息支持演进
+
+## ClassDef format (compatible mode)
+
+ClassDef 是 compatible struct 的演进元信息。
+
+### Binary layout
+
+```
+| 8 bytes header | [varuint32 extra size] | class meta bytes |
+```
+
+header 位布局:
+
+```
+| 50-bit hash | 4 bits reserved | 1 bit compress | 1 bit has_fields_meta |
8-bit size |
+```
+
+规则:
+
+- `size` 为低 8 位;若为 `0xFF`,后接扩展长度
+- `compress`:payload 是否压缩
+- `has_fields_meta`:是否含字段元信息
+- `reserved` 必须为 0
+- `hash` 为 payload + flags 的 50-bit 哈希
+
+### Class meta bytes
+
+表示线性化继承层次(父 -> 子)与字段信息:
+
+```
+| num_classes | class_layer_0 | class_layer_1 | ... |
+
+class_layer:
+| num_fields << 1 | registered_flag | [type_id if registered] |
+| namespace | type_name | field_infos |
+```
+
+### Field info
+
+每个字段:
+
+```
+| field_header | [field_name_bytes] | field_type |
+```
+
+`field_header`:
+
+- bit0: trackingRef
+- bit1: nullable
+- bit2-3: 字段名编码
+- bit4-6: name length/tag ID(7 表示扩展)
+- bit7: reserved=0
+
+字段名编码:
+
+- 0: UTF8
+- 1: ALL_TO_LOWER_SPECIAL
+- 2: LOWER_UPPER_DIGIT_SPECIAL
+- 3: TAG_ID(省略字段名,存 tag)
+
+### Field type encoding
+
+字段类型使用 type tag + 可选嵌套类型信息:
+
+| Tag | 字段类型 |
+| --- | ----------------------------------------- |
+| 0 | Object (ObjectFieldType) |
+| 1 | Map (MapFieldType) |
+| 2 | Collection/List/Set (CollectionFieldType) |
+| 3 | Array (ArrayFieldType) |
+| 4 | Enum (EnumFieldType) |
+| 5+ | Registered type (RegisteredFieldType) |
+
+嵌套类型头部低位可携带 `nullable/tracking_ref` 标志。
+
+## Meta string encoding
+
+namespace、type name、field name 复用 xlang 的 meta string 编码。
+
+### Package and type names
+
+头部:
+
+```
+| 6 bits size | 2 bits encoding |
+```
+
+- `size=63` 时追加扩展长度
+- package 支持:UTF8 / ALL_TO_LOWER_SPECIAL / LOWER_UPPER_DIGIT_SPECIAL
+- type name 支持:UTF8 / LOWER_UPPER_DIGIT_SPECIAL / FIRST_TO_LOWER_SPECIAL /
ALL_TO_LOWER_SPECIAL
+
+### Field names
+
+字段名编码与 ClassDef 的 field header 规则一致;若使用 TAG_ID,则不写名字字节。
+
+### Encoding algorithms
+
+具体算法参见 xlang 规范 `#meta-string`。
+
+## Value encodings
+
+以下为 Java native 常见内建 serializer 的值布局。自定义 `EXT` 可定义自身值格式,但必须遵循“引用元信息 +
类型元信息”通道规则。
+
+### Primitives
+
+- boolean: 1 byte(0/1)
+- byte: 1 byte
+- short: 2 bytes little-endian
+- char: 2 bytes little-endian(UTF-16 code unit)
+- int: fixed(4 bytes) 或 varint32(ZigZag)
+- long: fixed(8 bytes) / varint64(ZigZag) / tagged int64
+- float: IEEE754 float32
+- double: IEEE754 float64
+
+### String
+
+```
+| varuint36_small: (num_bytes << 2) | coder | string bytes |
+```
+
+- coder(2 bits):LATIN1 / UTF16 / UTF8
+- UTF16 采用 little-endian code unit
+
+### Enum
+
+- `serializeEnumByName=true`:写 enum 名称(meta string)
+- 否则:写 ordinal(varuint32 small7)
+
+### Binary (byte[])
+
+```
+| varuint32: num_bytes | raw bytes |
+```
+
+### Primitive arrays
+
+默认:
+
+```
+| varuint32: byte_length | raw bytes |
+```
+
+可选压缩:
+
+- `compressIntArray`:`| length | varint32... |`
+- `compressLongArray`:`| length | varint64/tagged... |`
+
+### Object arrays
+
+```
+| varuint32_small7: (length << 1) | mono_flag |
+```
+
+- `mono_flag=1`:单态数组,共享组件 serializer
+- `mono_flag=0`:每元素独立 class info + data
+
+### Collections (List/Set)
+
+```
+| varuint32_small7: length | elements_header | [elem_class_info] | elements...
|
+```
+
+`elements_header`:
+
+- bit0: TRACKING_REF
+- bit1: HAS_NULL
+- bit2: IS_DECL_ELEMENT_TYPE
+- bit3: IS_SAME_TYPE
+
+### Maps
+
+```
+| varuint32_small7: size | chunk_1 | chunk_2 | ... |
+
+chunk:
+| header | chunk_size | [key_class_info] | [value_class_info] | entries... |
+```
+
+Map 采用 chunk 编码,每块最多 255 entries;key/value 的引用跟踪与类型声明按 header 位图控制。
+
+#### Null key/value entries
+
+`null key` 或 `null value` 使用特殊单条 chunk,不写 `chunk_size`,只写对应 payload。
+
+### Objects and structs
+
+对象值通道:
+
+```
+| ref meta | type meta | field data |
+```
+
+标准对象序列化中:
+
+- 字段按稳定顺序(DescriptorGrouper)排序
+- compatible 模式可借助 ClassDef 映射字段并跳过未知字段
+- 字段是否写 ref/type meta 由 nullable/ref/polymorphic 策略决定
+
+### Extensions (EXT)
+
+EXT 类型值由注册 serializer 定义;但其外层仍遵循统一的引用与类型元信息协议。
+
+## Out-of-band buffers
+
+当提供 `BufferCallback` 时,header 的 `oob` 位置 1。此时 serializer
可输出“缓冲区引用”而非内联字节(如大数组)。
+主流中仅保留引用信息,具体 OOB 缓冲区协议由 callback 实现定义。
diff --git
a/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.15/specification/row_format_spec.md
b/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.15/specification/row_format_spec.md
new file mode 100644
index 0000000000..3f7f9866ef
--- /dev/null
+++
b/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.15/specification/row_format_spec.md
@@ -0,0 +1,356 @@
+---
+title: Row 格式
+sidebar_position: 2
+id: row_format_spec
+license: |
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+---
+
+## 概述
+
+Apache Fory Row Format 是面向高性能数据处理的二进制布局,目标是“可随机访问 + 低拷贝 + 跨语言一致”。
+
+相较于必须整对象反序列化的格式,Row Format 支持:
+
+- **随机字段读取**:只读目标字段
+- **零拷贝访问**:在可行场景直接基于内存切片读取
+- **缓存友好布局**:降低 CPU cache miss
+- **跨语言一致性**:Java/C++/Python 可共享标准格式
+
+Fory 提供两种变体:
+
+| 格式 | 支持语言 | 典型用途 |
+| ---------------- | -------------------- | -------------------------------- |
+| Standard Format | Java、C++、Python | 跨语言一致、实现简单 |
+| Compact Format | 仅 Java | 更小体积、更高局部性 |
+
+## 格式对比
+
+| 特性 | Standard Format | Compact Format
|
+| ---------------------- | --------------------------------- |
-------------------------------------- |
+| 字段槽位大小 | 固定 8 字节 | 按自然宽度(1/2/4/8 字节)
|
+| Null Bitmap | 8 字节对齐 | 字节对齐,可借用尾部 padding
|
+| Null Bitmap 位置 | 字段槽位之前 | 字段槽位之后(尾部)
|
+| 固定大小 struct | 放在 variable region(offset+size) | 可内联到 fixed region
|
+| 字段顺序 | 按 schema 定义顺序 | 按对齐规则排序
|
+| 全非空字段 | 仍保留 bitmap | 可完全省略 bitmap
|
+| 对齐策略 | 严格 8 字节 | 放宽(2/4/8 字节)
|
+
+## 标准 Row 格式
+
+标准格式强调跨语言统一与实现稳定:字段槽位统一 8 字节。
+
+### 设计原则
+
+1. **8 字节对齐**:主要结构按 8-byte 对齐
+2. **固定槽位**:每字段固定 8-byte slot,便于常数时间寻址
+3. **位图标记 null**:通过 bitset 跟踪空值
+4. **相对偏移**:变长数据通过相对偏移定位
+
+### Row 二进制布局
+
+```
++----------------+------------------+------------------+-----+------------------+------------------+
+| Null Bitmap | Field 0 Slot | Field 1 Slot | ... | Field N-1 Slot
| Variable Data |
++----------------+------------------+------------------+-----+------------------+------------------+
+| B bytes | 8 bytes | 8 bytes | | 8 bytes
| Variable size |
+```
+
+#### Null Bitmap
+
+- 大小:`((num_fields + 63) / 64) * 8` 字节(向上取整到 8-byte word)
+- 编码:每 bit 对应一个字段
+- bit=1 表示 null,bit=0 表示非 null
+- 第一字节 bit0 对应 field0
+
+#### 字段槽位
+
+- 任意字段都占 8 字节 slot
+- 槽位偏移:`bitmap_size + field_index * 8`
+- 固定区总大小:`bitmap_size + num_fields * 8`
+
+槽位内容:
+
+| 字段类别 | 槽位内容 |
+| ---------------- | ----------------------------------------- |
+| 定长类型 | 值直接写入(不足补零) |
+| 变长类型 | `offset + size` 打包 |
+
+#### 变长字段编码
+
+变长字段(string/array/map/nested struct)在 slot 中写入:
+
+```
++---------------------------+---------------------------+
+| Relative Offset | Size |
+| (32 bits) | (32 bits) |
++---------------------------+---------------------------+
+```
+
+- 高 32 位:相对 row 起始地址偏移
+- 低 32 位:数据长度(字节)
+
+编码:
+
+```
+offset_and_size = (relative_offset << 32) | size
+```
+
+解码:
+
+```
+relative_offset = (offset_and_size >> 32) & 0xFFFFFFFF
+size = offset_and_size & 0xFFFFFFFF
+```
+
+#### Variable Data 区
+
+- 位于 fixed region 之后
+- 变长字段按写入顺序顺排
+- 每个条目按 8-byte 对齐
+- padding 字节清零,保证输出确定性
+
+### Array 二进制布局
+
+```
++------------------+------------------+------------------+
+| Element Count | Null Bitmap | Element Data |
++------------------+------------------+------------------+
+| 8 bytes | B bytes | Variable size |
+```
+
+#### Array Header
+
+| 字段 | 大小 | 说明 |
+| --------------- | ------------------------------- | ----------------------- |
+| Element Count | 8 字节 | 元素数量(uint64) |
+| Null Bitmap | `((count + 63) / 64) * 8` 字节 | 每元素 null 标记 |
+
+#### Array Element Data
+
+- 定长元素按自然宽度连续存储
+- 变长元素存 8-byte `offset+size`
+- 元素偏移:`header_size + element_index * element_size`
+- 数据区总大小按 8-byte 对齐
+
+#### Array 元素大小
+
+| 元素类型 | 元素占用 |
+| ---------------- | -------------------------- |
+| bool/int8 | 1 byte |
+| int16 | 2 bytes |
+| int32/float32 | 4 bytes |
+| int64/float64 | 8 bytes |
+| string/binary | 8 bytes(offset+size) |
+
+### Map 二进制布局
+
+Map 在 Row Format 中可视为键值对数组,并包含类型信息与可空位图。
+
+#### Map 结构
+
+推荐逻辑结构:
+
+1. entry count
+2. key/value null bitmap(按实现可拆分)
+3. key data
+4. value data
+
+#### 嵌套 Struct 布局
+
+嵌套 struct 在标准格式中作为变长字段处理:
+
+- slot 写 `offset+size`
+- value region 中存其完整 row 二进制
+- 可递归嵌套
+
+## Compact Row Format(仅 Java)
+
+Compact 格式针对 Java 本地执行链路做体积与局部性优化,不保证与标准格式完全同布局。
+
+### 设计原则
+
+1. 字段槽按自然宽度缩小
+2. 字段重排以减少 padding
+3. null bitmap 可省略或压缩
+4. 定长嵌套 struct 尽可能内联
+
+### Compact Row Binary Layout
+
+总体仍是“fixed + variable”双区结构,但 fixed region 更紧凑,null bitmap 可能后置。
+
+#### 与标准格式的关键差异
+
+- slot 宽度非固定 8 字节
+- bitmap 可后置
+- 全非空时 bitmap 可省略
+- 可内联定长 nested struct
+
+#### Null Bitmap(Compact)
+
+- 按字节对齐
+- 可能复用尾部 padding
+- 无可空字段时可完全移除
+
+#### 字段排序算法
+
+典型排序目标:
+
+- 优先高对齐需求字段
+- 次序兼顾读取热度与 padding 最小化
+- 保持可重复计算(deterministic)
+
+#### 定长 Struct 内联
+
+若嵌套 struct 满足定长条件,可直接内联到 fixed region,减少一次间接寻址。
+
+#### 定宽计算
+
+定宽字段总大小由字段类型宽度与对齐约束共同决定,实际布局由编译器/运行时规划器输出。
+
+### Compact Array Binary Layout
+
+与标准数组类似,但 header 与元素布局可采用更紧凑表示。
+
+#### Compact Array Header
+
+包含:元素数量、null 信息(可选)、元素布局元信息(按实现)。
+
+#### 与标准数组关键差异
+
+- 头部更短
+- 元素存储更贴近自然宽度
+- 在 Java 热路径下更节省内存带宽
+
+## 通用规范
+
+### 类型编码
+
+#### Primitive Types
+
+基础类型按既定宽度和 endian 读写(默认 little-endian)。
+
+#### Temporal Types
+
+- `date`:通常以 epoch day 表示
+- `timestamp`:通常以 epoch 纳秒或秒+纳秒表示
+
+#### String 与 Binary
+
+都属于变长类型,使用 `offset+size` 指向真实 payload。
+
+### Null 处理
+
+#### Row Null 处理
+
+由 row bitmap 标记字段 null 状态,null 字段对应 slot 内容可忽略。
+
+#### Array Null 处理
+
+由数组 bitmap 标记每个元素是否为 null。
+
+#### 变长 null 语义
+
+null 与空值(如空字符串、空数组)必须区分;空值应写长度为 0 的实体。
+
+### 对齐与 Padding
+
+#### Standard 对齐
+
+以 8-byte 为主,保证跨语言一致实现简单。
+
+#### Compact 对齐
+
+允许 2/4/8 灵活对齐,目标是减少浪费。
+
+#### Padding 字节
+
+padding 建议写 0,避免未初始化内存泄露并提高可重复性。
+
+## 大小计算
+
+### Standard Row 大小
+
+```
+row_size = bitmap_size + num_fields * 8 + aligned(variable_region_size)
+```
+
+### Compact Row 大小
+
+```
+row_size = compact_fixed_size + optional_bitmap + aligned(variable_region_size)
+```
+
+### Standard Array 大小
+
+```
+array_size = header_size + aligned(element_data_size)
+```
+
+### Compact Array 大小
+
+```
+array_size = compact_header_size + aligned(compact_element_data_size)
+```
+
+### Map 大小
+
+```
+map_size = map_header + aligned(keys_region) + aligned(values_region)
+```
+
+## 汇总表
+
+### 布局总结
+
+| 结构 | Standard | Compact (Java)
|
+| --------------- | -------------------------------- |
-------------------------------- |
+| Row | bitmap + 8-byte slots + var data | compact fixed +
optional bitmap + var data |
+| Array | count + bitmap + elements | compact header +
elements |
+| Map | count + key/value data regions | 依实现可紧凑化
|
+
+### 类型宽度总结
+
+| 类型族 | 典型宽度 |
+| ---------------------- | --------------------------- |
+| bool/int8 | 1 byte |
+| int16 | 2 bytes |
+| int32/float32 | 4 bytes |
+| int64/float64 | 8 bytes |
+| string/binary/复杂类型 | slot 中 8-byte offset+size |
+
+## 实现说明
+
+### Endianness
+
+统一使用 little-endian,跨语言实现必须一致。
+
+### 内存安全
+
+- 读取前先做边界检查
+- 对 offset/size 做溢出检查
+- 避免使用未初始化 padding
+
+### 性能建议
+
+- 批量顺序写入,减少随机写
+- 热字段优先放 fixed region 前部
+- 通过 profile 决定是否启用 compact
+
+### 何时选择哪种格式
+
+- **Standard**:跨语言互通、调试友好、长期兼容
+- **Compact**:Java 单语言链路、内存敏感、高吞吐场景
diff --git
a/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.15/specification/xlang_implementation_guide.md
b/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.15/specification/xlang_implementation_guide.md
new file mode 100644
index 0000000000..9e1e2dea33
--- /dev/null
+++
b/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.15/specification/xlang_implementation_guide.md
@@ -0,0 +1,251 @@
+---
+title: Xlang 实现指南
+sidebar_position: 10
+id: xlang_implementation_guide
+license: |
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+---
+
+## 实现建议
+
+### 如何减少内存读写开销
+
+- 尽量把多次 byte 写入合并为 int/long 写入,降低内存 IO 与边界检查成本。
+- 读取时可一次读取 int/long,再拆分字节,减少内存访问次数。
+- 尽可能把 flag 与 length 合并到同一个 varint/long,减少字节数与 IO。
+- 在分支数量可控的前提下,分支开销通常小于内存 IO 开销。
+
+### 静态语言(无运行时代码生成)如何做高性能反序列化
+
+在类型演进场景,序列化数据会携带 type meta。反序列化端会比较“数据内 meta”与“本地类 meta”,根据差异执行字段映射。
+
+对 Java/Javascript/Python,可在运行时根据 diff 动态生成并加载反序列化逻辑,从而接近 schema-consistent
模式性能。
+
+对 C++/Rust,通常无法在运行时动态生成 serializer,只能在编译期元编程生成。此时无法提前知道对端 schema,
+因此需要在运行时根据字段元信息逐个判断“赋值或跳过”。
+
+可行优化:将字符串字段匹配尽量提前转换为 `field id`,再在反序列化路径用 `switch` 处理,利用连续 case 的跳转优化。
+
+思路:
+
+- 假设本地类型字段数为 `n`,对端字段数为 `n1`
+- 编译期先为本地排序字段分配连续 `field id`(从 0 开始)
+- 运行时比较对端 type meta:同名字段复用本地 id,不同字段分配从 `n` 开始的新 id,并缓存映射
+- 反序列化遍历对端字段时对 `field_id` 做 `switch`,命中则赋值,未命中则跳过
+
+示例:A 进程持有 `Foo1`,B 进程持有演进后的 `Foo2`:
+
+```c++
+// class Foo with version 1
+class Foo1 {
+ int32_t v1; // id 0
+ std::string v2; // id 1
+};
+// class Foo with version 2
+class Foo2 {
+ // id 0, but will have id 2 in process A
+ bool v0;
+ // id 1, but will have id 0 in process A
+ int32_t v1;
+ // id 2, but will have id 3 in process A
+ int64_t long_value;
+ // id 3, but will have id 1 in process A
+ std::string v2;
+ // id 4, but will have id 4 in process A
+ std::vector<std::string> list;
+};
+```
+
+A 收到 B 发送的 `Foo2` 数据后,可按 `field_id` 快速分发:
+
+```c++
+Foo1 foo1 = ...;
+const std::vector<fory::FieldInfo> &field_infos = type_meta.field_infos;
+for (const auto &field_info : field_infos) {
+ switch (field_info.field_id) {
+ case 0:
+ foo1.v1 = buffer.read_varint32();
+ break;
+ case 1:
+ foo1.v2 = fory.read_string();
+ break;
+ default:
+ fory.skip_data(field_info);
+ }
+}
+```
+
+## 新语言实现检查清单
+
+本节给出在新语言中落地 Fory xlang 序列化的阶段性清单。
+
+### 阶段 1:核心基础设施
+
+1. **Buffer 实现**
+ - [ ] 提供带读写游标的字节缓冲区
+ - [ ] 所有多字节读写统一使用 little-endian
+ - [ ] 实现 `write_int8/int16/int32/int64`
+ - [ ] 实现 `write_float32/write_float64`
+ - [ ] 实现对应 `read_*` 方法
+ - [ ] 实现缓冲区扩容策略(如倍增)
+
+2. **Varint 编码**
+ - [ ] `write_varuint32/read_varuint32`
+ - [ ] `write_varint32/read_varint32`(含 ZigZag)
+ - [ ] `write_varuint64/read_varuint64`
+ - [ ] `write_varint64/read_varint64`(含 ZigZag)
+ - [ ] `write_varuint36_small/read_varuint36_small`(字符串头使用)
+ - [ ] 可选:实现 int64 Hybrid 编码(TAGGED_INT64/TAGGED_UINT64)
+
+3. **头部处理**
+ - [ ] 读写 bitmap flags(null、xlang、oob)
+
+### 阶段 2:基础类型序列化
+
+4. **基础类型**
+ - [ ] bool(1 字节:0/1)
+ - [ ] int8/int16/int32/int64(little-endian)
+ - [ ] float32/float64(IEEE 754,little-endian)
+
+5. **字符串序列化**
+ - [ ] 实现字符串头:`(byte_length << 2) | encoding`
+ - [ ] 支持 UTF-8(xlang 必需)
+ - [ ] 可选支持 LATIN1 与 UTF-16
+
+6. **时间类型**
+ - [ ] Duration(seconds + nanoseconds)
+ - [ ] Timestamp(epoch 以来 seconds + nanoseconds)
+ - [ ] Date(epoch 以来天数)
+
+7. **引用跟踪**
+ - [ ] 写侧对象跟踪(object -> ref_id)
+ - [ ] 读侧对象跟踪(ref_id -> object)
+ - [ ] 支持 4 种引用标记:NULL(-3)、REF(-2)、NOT_NULL(-1)、REF_VALUE(0)
+ - [ ] 支持按类型或全局关闭引用跟踪
+
+### 阶段 3:集合类型
+
+8. **List/Array**
+ - [ ] 长度写为 varuint32
+ - [ ] 写 elements header byte
+ - [ ] 处理同构/异构元素
+ - [ ] 处理 null 元素
+
+9. **Map**
+ - [ ] 总大小写为 varuint32
+ - [ ] 实现分块格式(每块最多 255 对)
+ - [ ] 每块写 KV header
+ - [ ] 处理 key/value 类型变化
+
+10. **Set**
+ - [ ] 与 List 复用同一套实现
+
+### 阶段 4:Meta String 编码
+
+meta string 用于 enum/struct 的字段名、类型名、命名空间编码。
+
+11. **Meta String 压缩**
+ - [ ] LOWER_SPECIAL(5 bits/char)
+ - [ ] LOWER_UPPER_DIGIT_SPECIAL(6 bits/char)
+ - [ ] FIRST_TO_LOWER_SPECIAL
+ - [ ] ALL_TO_LOWER_SPECIAL
+ - [ ] 编码选择算法
+ - [ ] meta string 去重
+
+### 阶段 5:Enum 序列化
+
+12. **Enum**
+ - [ ] ordinal 写为 varuint32
+ - [ ] 支持命名 enum(namespace + typename)
+
+### 阶段 6:Struct 序列化
+
+13. **类型注册**
+ - [ ] 支持按数值 ID 注册
+ - [ ] 支持按 namespace + typename 注册
+ - [ ] 维护 type -> serializer 映射
+ - [ ] 生成 type ID:先写 internal type ID,再写 `user_type_id(varuint32)`
+
+14. **字段排序**
+ - [ ] 实现规范定义的分组与排序(primitive/boxed/builtin、collections/maps、other)
+ - [ ] 组内使用稳定比较器(type ID + name)
+ - [ ] 指纹字段标识使用 tag ID 或 snake_case 字段名
+
+15. **Schema Consistent 模式**
+ - [ ] 开启类版本校验时,按字段标识计算 schema hash
+ - [ ] 在字段前写 4-byte schema hash
+ - [ ] 按 Fory 字段顺序序列化
+
+16. **Compatible/Meta Share 模式**
+ - [ ] 实现共享 TypeDef 流(新 TypeDef 内联,已存在用索引)
+ - [ ] 按字段名或 tag ID 做映射,未知字段跳过
+ - [ ] 按 TypeDef 元信息应用 nullable/ref 规则
+
+### 阶段 7:其他类型
+
+17. **Binary/Array**
+
+- [ ] 基础类型数组支持直接 buffer copy
+- [ ] 多维数组按嵌套 list 表达(不做 tensor 专用编码)
+
+### 测试策略
+
+18. **跨语言兼容测试**
+ - [ ] 新语言写 -> Java/Python 读
+ - [ ] Java/Python 写 -> 新语言读
+ - [ ] 覆盖所有基础类型
+ - [ ] 覆盖不同字符串编码
+ - [ ] 覆盖集合(空、单元素、多元素)
+ - [ ] 覆盖不同 key/value map
+ - [ ] 覆盖嵌套 struct
+ - [ ] 覆盖循环引用(若支持)
+
+## 各语言实现备注
+
+### Java
+
+- 通过运行时代码生成(JIT)获得高性能
+- 支持完整引用跟踪模式
+- 利用 String coder 做编码选择
+- 可通过 `ThreadSafeFory` 提供线程安全封装
+
+### Python
+
+- 提供纯 Python(调试)与 Cython(性能)两种模式
+- 使用 `id(obj)` 做引用跟踪
+- xlang 模式支持 LATIN1/UTF-16/UTF-8
+- 通过代码生成增强 `dataclass` 支持
+
+### C++
+
+- 通过宏(`FORY_STRUCT`)做编译期反射
+- 模板元编程进行类型分发与 serializer 选择
+- 使用 `std::shared_ptr` 支持引用跟踪
+- 编译期字段排序
+- 不依赖运行时代码生成
+
+### Rust
+
+- 使用 derive 宏自动生成序列化代码(`#[derive(ForyObject)]`)
+- 使用 `Rc<T>`/`Arc<T>` 做引用跟踪
+- 通过线程本地上下文缓存优化性能
+- 编译期字段排序
+
+### Go
+
+- 支持反射模式与代码生成模式
+- 通过 struct tag 提供字段元信息
+- 通过接口类型支持多态语义
diff --git
a/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.15/specification/xlang_serialization_spec.md
b/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.15/specification/xlang_serialization_spec.md
new file mode 100644
index 0000000000..1a1800bbc6
--- /dev/null
+++
b/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.15/specification/xlang_serialization_spec.md
@@ -0,0 +1,558 @@
+---
+title: Xlang 序列化格式
+sidebar_position: 4
+id: xlang_serialization_spec
+license: |
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+---
+
+## 跨语言序列化规范
+
+本文定义 Apache Fory xlang 二进制协议的通用线格式,适用于多语言互操作场景。
+
+目标:
+
+- 二进制布局跨语言稳定
+- 支持引用跟踪、类型元信息和 schema 演进
+- 在流式序列化中支持增量写入共享元信息
+
+## 类型系统
+
+### 数据类型
+
+xlang 类型分为:
+
+- 基础类型:bool、整数、浮点、string、binary
+- 容器类型:list、set、map、array
+- 结构类型:enum、struct、union、ext
+- 时间类型:duration、timestamp、date
+
+### Polymorphisms
+
+协议支持多态对象。解码端可依据 type meta 判断运行时真实类型,并选择对应 serializer。
+
+### Type disambiguation
+
+当某语言类型可映射到多个 Fory 类型(如 fixed/varint/tagged 整数)时,必须通过字段元信息或类型注解消歧。
+
+### Type ID
+
+类型由 `internal_type_id` 与(可选)`user_type_id` 共同表达:
+
+- 内建类型通常直接由 internal ID 唯一表示
+- 用户类型通过 internal kind + user ID(或命名类型)表示
+
+#### Internal Type ID Table
+
+核心 internal IDs(示例):
+
+| ID | 类型 |
+| --- | ------------------- |
+| 1 | bool |
+| 2-20| 各类数字类型 |
+| 21 | string |
+| 22 | list |
+| 23 | set |
+| 24 | map |
+| 25 | enum |
+| 27 | struct |
+| 28 | compatible_struct |
+| 31 | ext |
+| 33 | union |
+| 36 | none |
+| 37 | duration |
+| 38 | timestamp |
+| 39 | date |
+| 40+ | decimal/binary/array 等 |
+
+完整映射见 [Xlang 类型映射](xlang_type_mapping.md)。
+
+#### Type ID Encoding for User Types
+
+用户类型采用拆分编码:
+
+- 先写 internal type ID(8-bit kind)
+- 再写 `user_type_id`(varuint32)
+
+不做 bit packing,便于实现与调试。
+
+### Type mapping
+
+跨语言类型映射总表见 [xlang_type_mapping.md](xlang_type_mapping.md)。
+
+## 规范概览
+
+顶层布局:
+
+```
+| fory header | reference meta | type meta | value payload |
+```
+
+协议默认 little-endian。
+
+## Fory 头部
+
+头部是 1-byte bitmap:
+
+```
+| reserved(5) | oob(1) | xlang(1) | null(1) |
+```
+
+- `null=1` 时值为空,不再写值数据
+- `xlang=1` 表示采用 xlang 格式
+- `oob=1` 表示存在 out-of-band 缓冲区引用
+
+## Reference Meta
+
+### Reference Flags
+
+| 标记 | 值 | 含义 |
+| -------------------- | ---- | ----------------------------------------- |
+| NULL_FLAG | -3 | null |
+| REF_FLAG | -2 | 已出现对象,后接 ref id |
+| NOT_NULL_VALUE_FLAG | -1 | 非空但不跟踪引用 |
+| REF_VALUE_FLAG | 0 | 首次出现的可引用对象 |
+
+### Reference Tracking Algorithm
+
+写侧:
+
+1. 先判断 null
+2. 若可引用且已出现,写 `REF_FLAG + ref_id`
+3. 若可引用且首次出现,写 `REF_VALUE_FLAG` 并登记
+4. 若不可引用,写 `NOT_NULL_VALUE_FLAG`
+
+读侧:
+
+1. 读取标记
+2. `REF_FLAG` 时按 ref_id 回表
+3. `REF_VALUE_FLAG` 时先构造对象再登记
+4. `NOT_NULL_VALUE_FLAG` 时直接读值
+
+### Reference ID Assignment
+
+ref id 按对象首次出现顺序递增分配,从 0 开始。
+
+### When Reference Tracking is Disabled
+
+禁用引用跟踪时,仅使用 null / not-null 两类标记,不维护 ref 表。
+
+### Language-Specific Considerations
+
+不同语言应保证:
+
+- 对象身份判定一致(身份而非值相等)
+- 容器元素引用语义一致
+- 循环引用场景先占位后填充
+
+## Type Meta
+
+### Type ID encoding
+
+type id 使用 varuint 编码写入。
+
+### Type meta payload
+
+在以下情况写额外 type meta:
+
+- 命名类型(`NAMED_*`)
+- compatible struct 需要 TypeDef
+- 运行时未声明类型需要动态 type info
+
+### Shared Type Meta (streaming)
+
+共享 type meta 采用“索引 + 可选定义体”流式写法:
+
+```
+index_marker = (index << 1) | is_ref
+```
+
+- `is_ref=1`:引用已有 type
+- `is_ref=0`:新 type,后接定义体
+
+### TypeDef (schema evolution metadata)
+
+TypeDef 用于描述 compatible 模式的字段元信息(字段名/tag、nullable/ref、字段类型)。
+
+#### Global header
+
+TypeDef 头部包含:
+
+- payload size
+- flags(如 compress、has_fields_meta)
+- payload hash
+
+#### TypeDef body
+
+主体包含:
+
+- class 层次信息(父类到子类)
+- 每层字段数量与类型标识
+- 字段级元信息(名称编码/tag、nullable/ref、field type)
+
+## Meta String
+
+meta string 用于 namespace、typename、fieldname 的压缩表示。
+
+### Encoding Type IDs
+
+常见编码族:
+
+- UTF8
+- LOWER_SPECIAL
+- LOWER_UPPER_DIGIT_SPECIAL
+- FIRST_TO_LOWER_SPECIAL
+- ALL_TO_LOWER_SPECIAL
+
+### Character Mapping Tables
+
+#### LOWER_SPECIAL (5 bits per character)
+
+适用于小写字母 + 高频特殊字符集合。
+
+#### LOWER_UPPER_DIGIT_SPECIAL (6 bits per character)
+
+适用于大小写字母、数字与特殊字符混合场景。
+
+### Encoding Algorithms
+
+#### LOWER_SPECIAL Encoding
+
+按 5-bit 映射逐字符编码,无法映射的字符需回退至其他编码。
+
+#### FIRST_TO_LOWER_SPECIAL Encoding
+
+首字符单独处理,其余字符按 LOWER_SPECIAL 编码。
+
+#### ALL_TO_LOWER_SPECIAL Encoding
+
+先归一化,再按 LOWER_SPECIAL 编码。
+
+### Encoding Selection Algorithm
+
+编码选择策略:
+
+1. 尝试最紧凑编码
+2. 若字符集合不满足则降级
+3. 必要时回退 UTF8
+
+### Meta String Header Format
+
+```
+| size_bits | encoding_bits |
+```
+
+当 `size` 超过短头范围时追加 varuint 扩展长度。
+
+### Special Character Sets by Context
+
+不同上下文(包名、类型名、字段名)允许字符集合可不同,编码器需按上下文选择合法表。
+
+### Deduplication
+
+meta string 可按会话去重,减少重复写入。
+
+## Value Format
+
+### Basic types
+
+#### bool
+
+1 字节:`0x00/0x01`。
+
+#### int8
+
+1 字节有符号整型。
+
+#### int16
+
+2 字节 little-endian。
+
+#### unsigned int32
+
+固定 4 字节无符号整型。
+
+#### unsigned varint32
+
+varint32(无符号)编码。
+
+#### signed int32
+
+固定 4 字节有符号整型。
+
+#### signed varint32
+
+ZigZag + varint32。
+
+#### unsigned int64
+
+固定 8 字节无符号整型。
+
+#### unsigned varint64
+
+varint64(无符号)编码。
+
+#### unsigned hybrid int64 (TAGGED_UINT64)
+
+tagged 编码,兼顾小值空间效率与大值表示范围。
+
+#### VarUint36Small
+
+用于字符串头等场景的紧凑长度编码。
+
+#### signed int64
+
+固定 8 字节有符号整型。
+
+#### signed varint64
+
+ZigZag + varint64。
+
+#### signed hybrid int64 (TAGGED_INT64)
+
+tagged int64 编码。
+
+#### float8
+
+预留/实验类型,生产互操作需谨慎。
+
+#### float16
+
+16-bit 浮点。
+
+#### bfloat16
+
+bfloat16 表示。
+
+#### float32
+
+IEEE 754 float32 little-endian。
+
+#### float64
+
+IEEE 754 float64 little-endian。
+
+### string
+
+字符串编码:
+
+```
+| header(varuint36_small) | bytes |
+```
+
+header 中包含 byte length 与 coder 信息。
+
+#### String Header
+
+`(byte_length << 2) | coder`,coder 表示 UTF8/LATIN1/UTF16 等。
+
+#### Encoding Algorithm
+
+按候选编码尝试,优先选择更紧凑且可无损表示的编码。
+
+#### Encoding Selection by Language
+
+各语言实现可按本地字符串内部表示优化,但线上编码结果必须与规范一致。
+
+#### Empty String
+
+空串长度为 0,仍应写合法 header。
+
+### duration
+
+通常写 `seconds + nanos`。
+
+### collection/list
+
+列表布局:
+
+1. 长度
+2. elements header
+3. (可选)元素类型信息
+4. 元素数据
+
+#### Elements Header
+
+header 位用于表达:
+
+- 是否跟踪元素引用
+- 是否含 null
+- 是否同构
+- 是否使用声明类型
+
+#### Type Info After Header
+
+在同构且非声明类型场景,可在 header 后一次性写 element type info。
+
+#### Element Serialization Based on Header
+
+根据 header 走不同元素序列化路径(同构快路径 / 异构慢路径)。
+
+#### elements data
+
+元素数据按顺序编码;null 与 ref 标记按配置插入。
+
+### array
+
+#### primitive array
+
+基础类型数组可直接按内存块拷贝(注意 endian 与对齐)。
+
+#### Multi-dimensional arrays
+
+多维数组按嵌套 array/list 递归表达。
+
+#### object array
+
+对象数组元素逐个编码,支持引用与多态。
+
+### map
+
+map 使用分块编码(chunk-based)。
+
+#### Map Chunk Format
+
+```
+| map_size | chunk_1 | chunk_2 | ... |
+```
+
+#### KV Header Bits
+
+header 位描述 key/value 的:
+
+- 是否跟踪引用
+- 是否含 null
+- 是否使用声明类型
+
+#### Chunk Size
+
+每个 chunk 大小上限通常为 255 entries。
+
+#### Why Chunk-Based Format?
+
+减少每个 entry 重复写 type info 的成本,提升吞吐。
+
+#### Why serialize chunk by chunk?
+
+在 key/value 类型局部一致时可批量走快路径,并简化解码分支。
+
+### enum
+
+enum 可按 ordinal 或名称编码(取决于配置与目标兼容要求)。
+
+### timestamp
+
+通常写 `seconds + nanos` 或统一 epoch 精度表示。
+
+### date
+
+通常写 epoch day。
+
+### decimal
+
+decimal 由 scale + unscaled value 表示(实现可用大整数)。
+
+### struct
+
+struct 编码:字段按稳定顺序写入。
+
+#### Field order
+
+推荐使用规范定义的稳定分组排序,避免语言实现差异导致 hash 不一致。
+
+##### Step 1: Field identifier
+
+字段标识优先使用 tag ID;否则使用标准化字段名(如 snake_case)。
+
+##### Step 2: Group assignment
+
+按字段类别分组(primitive、builtin、collection/map、other)。
+
+##### Step 3: Intra-group ordering
+
+组内使用稳定比较器(type + name/tag)排序。
+
+##### Notes
+
+实现必须保证排序确定性(deterministic)。
+
+#### Schema consistent (meta share disabled)
+
+不共享 meta 时,双方 schema 需一致;通常直接按固定顺序写字段值。
+
+#### Compatible mode (meta share enabled)
+
+共享 TypeDef 后可按字段名/tag 做映射,未知字段跳过。
+
+### Union
+
+#### IDL syntax
+
+```protobuf
+union Animal {
+ Dog dog = 1;
+ Cat cat = 2;
+}
+```
+
+#### Type IDs and type meta
+
+union 本体有独立 type id,case 使用 case id 区分分支。
+
+#### Union value payload
+
+```
+| case_id | case_value |
+```
+
+#### Wire layouts
+
+根据 case 类型是否需要引用/类型元信息决定具体布局。
+
+#### Decoding rules
+
+先读 case_id,再按 case 类型规则读 payload;未知 case 可按兼容策略跳过或报错。
+
+#### When to use each type ID
+
+- 结构稳定、跨语言常驻类型:建议固定数值 type id
+- 动态类型/未注册类型:使用命名类型路径
+
+#### Compatibility notes
+
+新增 union case 应使用新 case id,不应复用旧 id。
+
+### Type
+
+动态 `type` 值应携带足够 type meta,确保接收端可判别并解码。
+
+## Common Pitfalls
+
+常见问题:
+
+1. 字段排序不稳定导致 schema/hash 不一致
+2. varint 与 fixed/tagged 配置不一致
+3. null 与空值语义混淆
+4. 引用跟踪开关两端不一致
+5. 命名类型 namespace/typename 不稳定
+
+## Language Implementation Guidelines
+
+- 统一 little-endian
+- 明确对象身份语义(用于 ref tracking)
+- 对所有 offset/size 做边界与溢出检查
+- 维护跨版本回归用例(含演进、循环引用、复杂容器)
+- 与 Java/Python/C++/Rust/Go 做双向互测
diff --git
a/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.15/specification/xlang_type_mapping.md
b/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.15/specification/xlang_type_mapping.md
new file mode 100644
index 0000000000..59b1171838
--- /dev/null
+++
b/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.15/specification/xlang_type_mapping.md
@@ -0,0 +1,146 @@
+---
+title: Xlang 类型映射
+sidebar_position: 7
+id: xlang_type_mapping
+license: |
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+---
+
+说明:
+
+- 类型定义请参见 [Type Systems in Spec](xlang_serialization_spec.md#type-systems)
+- `int16_t[n]/vector<T>` 表示 `int16_t[n]/vector<int16_t>` 这一类数组/向量形式
+- 跨语言序列化协议仍在演进,生产环境请先做严格兼容验证
+
+## 用户类型 ID
+
+注册用户类型(struct/ext/enum/union)时:
+
+- type 字段先写入 8-bit internal kind
+- 用户类型 ID (`user_type_id`) 单独以 `varuint32` 写入
+- 不做 bit shift 或 packing
+- `user_type_id` 范围可用 `0 ~ 0xFFFFFFFE`
+
+示例:
+
+| User ID | Type | Internal ID | Encoded User ID | Decimal |
+| ------- | ----------------- | ----------- | --------------- | ------- |
+| 0 | STRUCT | 27 | 0 | 0 |
+| 0 | ENUM | 25 | 0 | 0 |
+| 1 | STRUCT | 27 | 1 | 1 |
+| 1 | COMPATIBLE_STRUCT | 28 | 1 | 1 |
+| 2 | NAMED_STRUCT | 29 | 2 | 2 |
+
+读取类型 ID 时:
+
+- 先读取 internal type ID
+- 若属于用户注册类型,再继续读取 `user_type_id(varuint32)`
+
+## 类型映射
+
+| Fory Type | Fory Type ID | Java | Python
| Javascript | C++ | Golang
| Rust |
+| ----------------------- | ------------ | --------------- |
------------------------ | ------------------- | ------------------------------
| ---------------- | ----------------- |
+| bool | 1 | bool/Boolean | bool
| Boolean | bool | bool
| bool |
+| int8 | 2 | byte/Byte | int/pyfory.int8
| Type.int8() | int8_t | int8
| i8 |
+| int16 | 3 | short/Short | int/pyfory.int16
| Type.int16() | int16_t | int16
| i16 |
+| int32 | 4 | int/Integer |
int/pyfory.fixed_int32 | Type.int32() | int32_t
| int32 | i32 |
+| varint32 | 5 | int/Integer | int/pyfory.int32
| Type.varint32() | int32_t | int32
| i32 |
+| int64 | 6 | long/Long |
int/pyfory.fixed_int64 | Type.int64() | int64_t
| int64 | i64 |
+| varint64 | 7 | long/Long | int/pyfory.int64
| Type.varint64() | int64_t | int64
| i64 |
+| tagged_int64 | 8 | long/Long |
int/pyfory.tagged_int64 | Type.tagged_int64() | int64_t
| int64 | i64 |
+| uint8 | 9 | short/Short | int/pyfory.uint8
| Type.uint8() | uint8_t | uint8
| u8 |
+| uint16 | 10 | int/Integer | int/pyfory.uint16
| Type.uint16() | uint16_t | uint16
| u16 |
+| uint32 | 11 | long/Long |
int/pyfory.fixed_uint32 | Type.uint32() | uint32_t
| uint32 | u32 |
+| var_uint32 | 12 | long/Long | int/pyfory.uint32
| Type.varUInt32() | uint32_t | uint32
| u32 |
+| uint64 | 13 | long/Long |
int/pyfory.fixed_uint64 | Type.uint64() | uint64_t
| uint64 | u64 |
+| var_uint64 | 14 | long/Long | int/pyfory.uint64
| Type.varUInt64() | uint64_t | uint64
| u64 |
+| tagged_uint64 | 15 | long/Long |
int/pyfory.tagged_uint64 | Type.taggedUInt64() | uint64_t
| uint64 | u64 |
+| float8 | 16 | / | /
| / | / | /
| / |
+| float16 | 17 | float/Float |
float/pyfory.float16 | Type.float16() | fory::float16_t
| fory.float16 | fory::f16 |
+| bfloat16 | 18 | / | /
| / | / | /
| / |
+| float32 | 19 | float/Float |
float/pyfory.float32 | Type.float32() | float
| float32 | f32 |
+| float64 | 20 | double/Double |
float/pyfory.float64 | Type.float64() | double
| float64 | f64 |
+| string | 21 | String | str
| String | string | string
| String/str |
+| list | 22 | List/Collection | list/tuple
| array | vector | slice
| Vec |
+| set | 23 | Set | set
| / | set | fory.Set
| Set |
+| map | 24 | Map | dict
| Map | unordered_map | map
| HashMap |
+| enum | 25 | Enum subclasses | enum subclasses
| / | enum | /
| enum |
+| named_enum | 26 | Enum subclasses | enum subclasses
| / | enum | /
| enum |
+| struct | 27 | pojo/record | data class
| object | struct/class | struct
| struct |
+| compatible_struct | 28 | pojo/record | data class
| object | struct/class | struct
| struct |
+| named_struct | 29 | pojo/record | data class
| object | struct/class | struct
| struct |
+| named_compatible_struct | 30 | pojo/record | data class
| object | struct/class | struct
| struct |
+| ext | 31 | pojo/record | data class
| object | struct/class | struct
| struct |
+| named_ext | 32 | pojo/record | data class
| object | struct/class | struct
| struct |
+| union | 33 | Union | typing.Union
| / | `std::variant<Ts...>` | /
| tagged union enum |
+| none | 36 | null | None
| null | `std::monostate` | nil
| `()` |
+| duration | 37 | Duration | timedelta
| Number | duration | Duration
| Duration |
+| timestamp | 38 | Instant | datetime
| Number | std::chrono::nanoseconds | Time
| DateTime |
+| date | 39 | Date | datetime
| Number | fory::serialization::Date | Time
| DateTime |
+| decimal | 40 | BigDecimal | Decimal
| bigint | / | /
| / |
+| binary | 41 | byte[] | bytes
| / | `uint8_t[n]/vector<T>` | `[n]uint8/[]T`
| `Vec<uint8_t>` |
+| array | 42 | array | np.ndarray
| / | / | array/slice
| Vec |
+| bool_array | 43 | bool[] |
ndarray(np.bool\_) | / | `bool[n]`
| `[n]bool/[]T` | `Vec<bool>` |
+| int8_array | 44 | byte[] | ndarray(int8)
| / | `int8_t[n]/vector<T>` | `[n]int8/[]T`
| `Vec<i8>` |
+| int16_array | 45 | short[] | ndarray(int16)
| / | `int16_t[n]/vector<T>` | `[n]int16/[]T`
| `Vec<i16>` |
+| int32_array | 46 | int[] | ndarray(int32)
| / | `int32_t[n]/vector<T>` | `[n]int32/[]T`
| `Vec<i32>` |
+| int64_array | 47 | long[] | ndarray(int64)
| / | `int64_t[n]/vector<T>` | `[n]int64/[]T`
| `Vec<i64>` |
+| uint8_array | 48 | short[] | ndarray(uint8)
| / | `uint8_t[n]/vector<T>` | `[n]uint8/[]T`
| `Vec<u8>` |
+| uint16_array | 49 | int[] | ndarray(uint16)
| / | `uint16_t[n]/vector<T>` | `[n]uint16/[]T`
| `Vec<u16>` |
+| uint32_array | 50 | long[] | ndarray(uint32)
| / | `uint32_t[n]/vector<T>` | `[n]uint32/[]T`
| `Vec<u32>` |
+| uint64_array | 51 | long[] | ndarray(uint64)
| / | `uint64_t[n]/vector<T>` | `[n]uint64/[]T`
| `Vec<u64>` |
+| float8_array | 52 | / | /
| / | / | /
| / |
+| float16_array | 53 | float[] | ndarray(float16)
| / | `fory::float16_t[n]/vector<T>` |
`[n]float16/[]T` | `Vec<fory::f16>` |
+| bfloat16_array | 54 | / | /
| / | / | /
| / |
+| float32_array | 55 | float[] | ndarray(float32)
| / | `float[n]/vector<T>` |
`[n]float32/[]T` | `Vec<f32>` |
+| float64_array | 56 | double[] | ndarray(float64)
| / | `double[n]/vector<T>` |
`[n]float64/[]T` | `Vec<f64>` |
+
+## 类型信息(当前尚未完整实现)
+
+由于不同语言类型系统存在差异,部分类型无法一一对应映射。
+
+如果某语言中的一个类型可能对应多个 Fory 类型(例如 Java `long` 可能对应 `int64/varint64/tagged_int64`),
+说明该语言缺少更细粒度区分,此时调用方需要额外提供类型信息。
+
+## 类型注解
+
+当某类型作为其他类的字段时,可以通过字段级或类型级元数据提示具体编码语义。不同语言的配置方式:
+
+- Java:注解
+- C++:宏与模板
+- Go:struct tag
+- Python:type hint
+- Rust:宏
+
+示例:
+
+- Java:
+
+ ```java
+ class Foo {
+ @Int32Type(varint = true)
+ int f1;
+ List<@Int32Type(varint = true) Integer> f2;
+ }
+ ```
+
+- Python:
+
+ ```python
+ class Foo:
+ f1: pyfory.varint32
+ f2: List[pyfory.varint32]
+ ```
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]