跳到主要内容
版本:0.15

Xlang 类型映射

说明:

  • 类型定义请参见 Type Systems in Spec
  • 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 IDTypeInternal IDEncoded User IDDecimal
0STRUCT2700
0ENUM2500
1STRUCT2711
1COMPATIBLE_STRUCT2811
2NAMED_STRUCT2922

读取类型 ID 时:

  • 先读取 internal type ID
  • 若属于用户注册类型,再继续读取 user_type_id(varuint32)

类型映射

Fory TypeFory Type IDJavaPythonJavascriptC++GolangRust
bool1bool/BooleanboolBooleanboolboolbool
int82byte/Byteint/pyfory.int8Type.int8()int8_tint8i8
int163short/Shortint/pyfory.int16Type.int16()int16_tint16i16
int324int/Integerint/pyfory.fixed_int32Type.int32()int32_tint32i32
varint325int/Integerint/pyfory.int32Type.varint32()int32_tint32i32
int646long/Longint/pyfory.fixed_int64Type.int64()int64_tint64i64
varint647long/Longint/pyfory.int64Type.varint64()int64_tint64i64
tagged_int648long/Longint/pyfory.tagged_int64Type.tagged_int64()int64_tint64i64
uint89short/Shortint/pyfory.uint8Type.uint8()uint8_tuint8u8
uint1610int/Integerint/pyfory.uint16Type.uint16()uint16_tuint16u16
uint3211long/Longint/pyfory.fixed_uint32Type.uint32()uint32_tuint32u32
var_uint3212long/Longint/pyfory.uint32Type.varUInt32()uint32_tuint32u32
uint6413long/Longint/pyfory.fixed_uint64Type.uint64()uint64_tuint64u64
var_uint6414long/Longint/pyfory.uint64Type.varUInt64()uint64_tuint64u64
tagged_uint6415long/Longint/pyfory.tagged_uint64Type.taggedUInt64()uint64_tuint64u64
float816//////
float1617float/Floatfloat/pyfory.float16Type.float16()fory::float16_tfory.float16fory::f16
bfloat1618//////
float3219float/Floatfloat/pyfory.float32Type.float32()floatfloat32f32
float6420double/Doublefloat/pyfory.float64Type.float64()doublefloat64f64
string21StringstrStringstringstringString/str
list22List/Collectionlist/tuplearrayvectorsliceVec
set23Setset/setfory.SetSet
map24MapdictMapunordered_mapmapHashMap
enum25Enum subclassesenum subclasses/enum/enum
named_enum26Enum subclassesenum subclasses/enum/enum
struct27pojo/recorddata classobjectstruct/classstructstruct
compatible_struct28pojo/recorddata classobjectstruct/classstructstruct
named_struct29pojo/recorddata classobjectstruct/classstructstruct
named_compatible_struct30pojo/recorddata classobjectstruct/classstructstruct
ext31pojo/recorddata classobjectstruct/classstructstruct
named_ext32pojo/recorddata classobjectstruct/classstructstruct
union33Uniontyping.Union/std::variant<Ts...>/tagged union enum
none36nullNonenullstd::monostatenil()
duration37DurationtimedeltaNumberdurationDurationDuration
timestamp38InstantdatetimeNumberstd::chrono::nanosecondsTimeDateTime
date39DatedatetimeNumberfory::serialization::DateTimeDateTime
decimal40BigDecimalDecimalbigint///
binary41byte[]bytes/uint8_t[n]/vector<T>[n]uint8/[]TVec<uint8_t>
array42arraynp.ndarray//array/sliceVec
bool_array43bool[]ndarray(np.bool_)/bool[n][n]bool/[]TVec<bool>
int8_array44byte[]ndarray(int8)/int8_t[n]/vector<T>[n]int8/[]TVec<i8>
int16_array45short[]ndarray(int16)/int16_t[n]/vector<T>[n]int16/[]TVec<i16>
int32_array46int[]ndarray(int32)/int32_t[n]/vector<T>[n]int32/[]TVec<i32>
int64_array47long[]ndarray(int64)/int64_t[n]/vector<T>[n]int64/[]TVec<i64>
uint8_array48short[]ndarray(uint8)/uint8_t[n]/vector<T>[n]uint8/[]TVec<u8>
uint16_array49int[]ndarray(uint16)/uint16_t[n]/vector<T>[n]uint16/[]TVec<u16>
uint32_array50long[]ndarray(uint32)/uint32_t[n]/vector<T>[n]uint32/[]TVec<u32>
uint64_array51long[]ndarray(uint64)/uint64_t[n]/vector<T>[n]uint64/[]TVec<u64>
float8_array52//////
float16_array53float[]ndarray(float16)/fory::float16_t[n]/vector<T>[n]float16/[]TVec<fory::f16>
bfloat16_array54//////
float32_array55float[]ndarray(float32)/float[n]/vector<T>[n]float32/[]TVec<f32>
float64_array56double[]ndarray(float64)/double[n]/vector<T>[n]float64/[]TVec<f64>

类型信息(当前尚未完整实现)

由于不同语言类型系统存在差异,部分类型无法一一对应映射。

如果某语言中的一个类型可能对应多个 Fory 类型(例如 Java long 可能对应 int64/varint64/tagged_int64), 说明该语言缺少更细粒度区分,此时调用方需要额外提供类型信息。

类型注解

当某类型作为其他类的字段时,可以通过字段级或类型级元数据提示具体编码语义。不同语言的配置方式:

  • Java:注解
  • C++:宏与模板
  • Go:struct tag
  • Python:type hint
  • Rust:宏

示例:

  • Java:

    class Foo {
    @Int32Type(varint = true)
    int f1;
    List<@Int32Type(varint = true) Integer> f2;
    }
  • Python:

    class Foo:
    f1: pyfory.varint32
    f2: List[pyfory.varint32]