跳到主要内容
版本:dev

Go 对象序列化

Apache Fory Go 是面向 Go 的高性能序列化库。它支持用于跨语言载荷的跨语言模式和用于 Go 专属载荷的原生模式,并提供快速对象图序列化、循环引用、多态和 Schema 感知的结构体处理。

为什么选择 Fory Go?

  • 高性能:快速序列化和优化的二进制协议
  • 跨语言:与 Java、Python、C++、Rust、JavaScript/TypeScript、C#、Swift、Dart、Scala 和 Kotlin 无缝交换数据
  • 自动序列化:使用快速序列化器序列化 Go 结构体
  • 引用跟踪:内置支持循环引用和共享对象
  • 类型安全:使用 Schema 感知的序列化器提供强类型能力
  • Schema 演进:兼容模式支持向前和向后兼容
  • 线程安全选项:基于池的线程安全包装器支持并发使用

快速入门

安装

要求:Go 1.24 或更高版本

go get github.com/apache/fory/go/fory

基本用法

package main

import (
"fmt"
"github.com/apache/fory/go/fory"
)

type User struct {
ID int64
Name string
Age int32
}

func main() {
// Create an xlang Fory instance.
f := fory.New(fory.WithXlang(true))

// Register struct with a type ID
if err := f.RegisterStruct(User{}, 1); err != nil {
panic(err)
}

// Serialize
user := &User{ID: 1, Name: "Alice", Age: 30}
data, err := f.Serialize(user)
if err != nil {
panic(err)
}

// Deserialize
var result User
if err := f.Deserialize(data, &result); err != nil {
panic(err)
}

fmt.Printf("Deserialized: %+v\n", result)
// Output: Deserialized: {ID:1 Name:Alice Age:30}
}

跨语言模式与原生模式

跨语言载荷以及与其他 Fory 实现共享的 Schema 应使用跨语言模式。跨语言模式是 Go 的默认编码模式;使用该模式的 Go 示例会显式设置 fory.WithXlang(true),以清楚展示模式选择。

仅限 Go 的通信应使用原生模式。通过 fory.WithXlang(false) 选择原生模式,它会让 Go 对象序列化保持 Go 原生形式。该模式针对不需要可移植跨语言映射的 Go 结构体、指针、接口和 Go 专属类型行为进行了优化。兼容模式默认启用。只有每个读取端和写入端都使用相同的 Go 结构体 Schema,并且希望获得更快序列化和更小体积时,才设置 fory.WithCompatible(false)

Go 跨语言注册和互操作规则参见跨语言序列化,仅限 Go 的载荷参见原生序列化

配置

Fory Go 使用函数式选项模式进行配置:

f := fory.New(
fory.WithXlang(true),
fory.WithTrackRef(true), // Enable reference tracking
fory.WithMaxDepth(20), // Set max nesting depth
)

所有可用选项参见配置

支持的类型

Fory Go 支持多种类型:

  • 原始类型boolint8-int64uint8-uint64float32float64string
  • 集合:切片、映射、集合
  • 时间time.Timetime.Duration
  • 指针:自动处理 nil 的指针类型
  • 结构体:任何包含导出字段的结构体

完整类型映射参见支持的类型

跨语言序列化

Fory Go 与其他 Fory 实现完全兼容。在 Go 中序列化的数据可以在 Java、Python、C++、Rust、JavaScript/TypeScript、C#、Swift、Dart、Scala 或 Kotlin 中反序列化:

// Go serialization
f := fory.New(fory.WithXlang(true))
f.RegisterStruct(User{}, 1)
data, _ := f.Serialize(&User{ID: 1, Name: "Alice"})
// 'data' can be deserialized by Java, Python, etc.

类型映射和兼容性详情参见跨语言序列化

文档

主题说明
基本序列化核心 API 和使用模式
原生序列化仅限 Go 的序列化
配置选项和设置
Schema 元数据字段级配置
类型注册注册用于序列化的类型
支持的类型完整类型支持参考
引用循环引用和共享对象
Schema 演进向前和向后兼容
自定义序列化器扩展序列化行为
线程安全并发使用模式
gRPC 支持通过 grpc-go 传输 Fory 载荷
故障排查常见问题和解决方案

相关资源

解码来自应用信任边界之外的字节之前,请阅读 Go 安全