跳到主要内容
版本:0.16

支持类型

Fory Go 支持广泛的 Go 类型序列化。本指南介绍支持的类型以及它们的跨语言映射关系。

基础类型

Go 类型Fory TypeId编码方式说明
boolBOOL (1)1 字节
int8INT8 (2)1 字节,有符号
int16INT16 (3)2 字节,有符号小端序
int32INT32 (4)Varint变长编码
int64INT64 (6)Varint变长编码
intINT32/INT64Varint依赖平台位宽(32/64 位)
uint8 / byteUINT8 (9)1 字节,无符号
uint16UINT16 (10)2 字节,无符号小端序
uint32UINT32 (11)Varuint变长编码
uint64UINT64 (13)Varuint变长编码
float32FLOAT32 (17)4 字节IEEE 754
float64FLOAT64 (18)8 字节IEEE 754
stringSTRING (19)UTF-8 长度前缀

整数编码

Fory 使用变长整数编码(varint)来提升压缩效果:

  • 数值越小,占用字节越少
  • 负数使用 ZigZag 编码
  • 平台的 int 在 32 位系统上映射为 int32,在 64 位系统上映射为 int64
f := fory.New()

// 支持所有常见整数类型
var i8 int8 = 127
var i16 int16 = 32767
var i32 int32 = 2147483647
var i64 int64 = 9223372036854775807

data, _ := f.Serialize(i64) // 使用 varint 编码

集合类型

Slice

Go 类型Fory TypeId说明
[]boolBOOL_ARRAY优化编码
[]int8INT8_ARRAY优化编码
[]int16INT16_ARRAY优化编码
[]int32INT32_ARRAY优化编码
[]int64INT64_ARRAY优化编码
[]float32FLOAT32_ARRAY优化编码
[]float64FLOAT64_ARRAY优化编码
[]stringLIST通用列表编码
[]T(任意类型)LIST (20)任意可序列化类型
[]I(接口元素)LIST任意接口类型
f := fory.New()

// 基础类型 slice(优化编码)
ints := []int32{1, 2, 3, 4, 5}
data, _ := f.Serialize(ints)

// 字符串 slice
strs := []string{"a", "b", "c"}
data, _ = f.Serialize(strs)

// 结构体 slice
users := []User{{ID: 1}, {ID: 2}}
data, _ = f.Serialize(users)

// 动态 slice
dynamic := []any{1, "hello", true}
data, _ = f.Serialize(dynamic)

Map

Go 类型Fory TypeId说明
map[string]stringMAP (22)优化编码
map[string]int64MAP优化编码
map[string]int32MAP优化编码
map[string]intMAP优化编码
map[string]float64MAP优化编码
map[string]boolMAP优化编码
map[int32]int32MAP优化编码
map[int64]int64MAP优化编码
map[int]intMAP优化编码
map[string]anyMAP动态值
map[any]anyMAP动态键和值
f := fory.New()

// 字符串键 map
m1 := map[string]string{"key": "value"}
m2 := map[string]int64{"count": 42}

// 整数键 map
m3 := map[int32]int32{1: 100, 2: 200}

// 动态 map
m4 := map[string]any{
"name": "Alice",
"age": int64(30),
}

Set

Fory 提供了泛型 Set[T] 类型,底层使用 map[T]struct{},不会为 value 带来额外内存开销:

// 创建字符串集合
s := fory.NewSet[string]()
s.Add("a", "b", "c")

// 检查成员
if s.Contains("a") {
fmt.Println("found")
}

// 序列化
data, _ := f.Serialize(s)

时间类型

Go 类型Fory TypeId说明
time.TimeTIMESTAMP (34)纳秒精度
time.DurationDURATION (33)纳秒精度
import "time"

f := fory.New()

// 时间戳
t := time.Now()
data, _ := f.Serialize(t)

// Duration
d := 5 * time.Second
data, _ = f.Serialize(d)

结构体类型

类别Fory TypeId说明
StructSTRUCT (25)按 ID 注册,不支持演进
Compatible StructCOMPATIBLE_STRUCT (26)支持 Schema 演进
Named StructNAMED_STRUCT (27)按名称注册,不支持演进
Named Compatible StructNAMED_COMPATIBLE_STRUCT (28)按名称注册,支持 Schema 演进

结构体要求

  1. 仅导出字段:只有首字母大写的字段会被序列化。
  2. 字段类型受支持:字段类型必须包含在本文档列出的支持范围内。
  3. 建议注册:跨语言场景下,结构体应先完成注册。
type User struct {
ID int64 // 会被序列化
Name string // 会被序列化
Age int32 // 会被序列化
password string // 不会被序列化(未导出)
}

f := fory.New()
f.RegisterStruct(User{}, 1)

user := &User{ID: 1, Name: "Alice", Age: 30, password: "secret"}
data, _ := f.Serialize(user)

嵌套结构体

type Address struct {
Street string
City string
Country string
}

type Company struct {
Name string
Address Address
Founded int32
}

f := fory.New()
f.RegisterStruct(Address{}, 1)
f.RegisterStruct(Company{}, 2)

指针类型

Go 类型行为
*T可为 nil,启用时可参与引用跟踪
**T支持多级指针
f := fory.New(fory.WithTrackRef(true))

type Node struct {
Value int32
Left *Node
Right *Node
}

f.RegisterStruct(Node{}, 1)

root := &Node{
Value: 1,
Left: &Node{Value: 2},
Right: &Node{Value: 3},
}

data, _ := f.Serialize(root)

nil 处理

var ptr *User = nil
data, _ := f.Serialize(ptr)

var result *User
f.Deserialize(data, &result)
// result == nil

接口类型

Go 类型Fory TypeId说明
anyUNION (31)多态值
f := fory.New()

// 序列化 any
var value any = "hello"
data, _ := f.Serialize(value)

var result any
f.Deserialize(data, &result)
// result == "hello"(string)

如果接口中会承载结构体实现,请注册所有可能的具体类型:

type Shape interface {
Area() float64
}

type Circle struct {
Radius float64
}

func (c Circle) Area() float64 {
return 3.14159 * c.Radius * c.Radius
}

f := fory.New()
f.RegisterStruct(Circle{}, 1)

var shape Shape = Circle{Radius: 5.0}
data, _ := f.Serialize(shape)

二进制数据

Go 类型Fory TypeId说明
[]byteBINARY (37)变长字节串
f := fory.New()

data := []byte{0x01, 0x02, 0x03, 0x04}
serialized, _ := f.Serialize(data)

var result []byte
f.Deserialize(serialized, &result)

枚举类型

Go 中通常使用整数类型来表示枚举:

type Status int32

const (
StatusPending Status = 0
StatusActive Status = 1
StatusComplete Status = 2
)

f := fory.New()
f.RegisterEnum(Status(0), 1)

status := StatusActive
data, _ := f.Serialize(status)

跨语言类型映射

Go 类型JavaPythonC++Rust
boolbooleanboolboolbool
int8byteintint8_ti8
int16shortintint16_ti16
int32intintint32_ti32
int64longintint64_ti64
float32floatfloatfloatf32
float64doublefloatdoublef64
stringStringstrstd::stringString
[]TList<T>liststd::vector<T>Vec<T>
map[K]VMap<K,V>dictstd::unordered_mapHashMap<K,V>
time.TimeInstantdatetime--
time.DurationDurationtimedelta--

详细映射可参考 Cross-Language Serialization

不支持的类型

以下 Go 类型不受支持

  • 通道(chan T
  • 函数(func()
  • 复数(complex64complex128
  • 不安全指针(unsafe.Pointer

尝试序列化这些类型会返回错误。

相关主题