跳到主要内容

多语言序列化的类型映射

注意:

  • 有关类型定义,请参阅 Spec 中的类型系统
  • int16_t[n]/vector<T> 表示 int16_t[n]/vector<int16_t>.
  • 跨语言序列化并不稳定,请勿在生产环境中使用。

Type Mapping

Fury 类型Fury 类型 IDJavaPythonJavascriptC++GolangRust
bool1bool/BooleanboolBooleanboolboolbool
int82byte/Byteint/pyfury.Int8Type.int8()int8_tint8i8
int163short/Shortint/pyfury.Int16Type.int16()int16_tint16i6
int324int/Integerint/pyfury.Int32Type.int32()int32_tint32i32
var_int325int/Integerint/pyfury.VarInt32Type.varint32()fury::varint32_tfury.varint32fury::varint32
int646long/Longint/pyfury.Int64Type.int64()int64_tint64i64
var_int647long/Longint/pyfury.VarInt64Type.varint64()fury::varint64_tfury.varint64fury::varint64
sli_int648long/Longint/pyfury.SliInt64Type.sliint64()fury::sliint64_tfury.sliint64fury::sliint64
float169float/Floatfloat/pyfury.Float16Type.float16()fury::float16_tfury.float16fury::f16
float3210float/Floatfloat/pyfury.Float32Type.float32()floatfloat32f32
float6411double/Doublefloat/pyfury.Float64Type.float64()doublefloat64f64
string12StringstrStringstringstringString/str
enum13Enum subclassesenum subclasses/enum/enum
list14List/Collectionlist/tuplearrayvectorsliceVec
set15Setset/setfury.SetSet
map16MapdictMapunordered_mapmapHashMap
duration17DurationtimedeltaNumberdurationDurationDuration
timestamp18InstantdatetimeNumberstd::chrono::nanosecondsTimeDateTime
decimal19BigDecimalDecimalbigint///
binary20byte[]bytes/uint8_t[n]/vector<T>[n]uint8/[]TVec<uint8_t>
array21arraynp.ndarray//array/sliceVec
bool_array22bool[]ndarray(np.bool_)/bool[n][n]bool/[]TVec<bool>
int8_array23byte[]ndarray(int8)/int8_t[n]/vector<T>[n]int8/[]TVec<i18>
int16_array24short[]ndarray(int16)/int16_t[n]/vector<T>[n]int16/[]TVec<i16>
int32_array25int[]ndarray(int32)/int32_t[n]/vector<T>[n]int32/[]TVec<i32>
int64_array26long[]ndarray(int64)/int64_t[n]/vector<T>[n]int64/[]TVec<i64>
float16_array27float[]ndarray(float16)/fury::float16_t[n]/vector<T>[n]float16/[]TVec<fury::f16>
float32_array28float[]ndarray(float32)/float[n]/vector<T>[n]float32/[]TVec<f32>
float64_array29double[]ndarray(float64)/double[n]/vector<T>[n]float64/[]TVec<f64>
tensor30//////
sparse tensor31//////
arrow record batch32//////
arrow table33//////

类型信息(目前尚未实现)

由于语言类型系统之间的差异,这些类型无法在语言之间一对一地映射。

如果用户看到一种语言中的一种类型对应 Apache Fury 类型系统中的多种类型。

例如:java 中的 long 类型对应 int64/varint64/sliint64 类型。类型为 int64/varint64/sliint64 这意味着该语言缺少某些类型,用户在使用 Fury 时必须提供额外的类型信息。

类型注解

如果类型是另一个类的字段,用户可以为类型的字段或整个类型提供 meta hints。 这些信息也可以用其他语言提供:

  • java:使用注解;
  • cpp:使用宏和模板;
  • golang:使用 struct tag;
  • python: 使用 typehint;
  • rust:使用宏。

下面是一个例子:

  • Java:

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

    class Foo:
    f1: Int32Type(varint=True)
    f2: List[Int32Type(varint=True)]

类型包装器

如果类型不是类的字段,用户必须用 Fury 类型来包装该类型,以传递额外的类型信息。

例如:假设 Apache Fury Java 提供了 VarInt64 类型,当用户调用 fury.serialize(long_value) 时,需要像下面这样调用 调用 fury.serialize(new VarInt64(long_value))