跨语言序列化
Fory Go 支持与 Java、Python、C++、Rust、JavaScript 无缝交换数据。本指南介绍跨语言兼容与类型映射要点。
启用跨语言模式
需要显式开启跨语言(xlang)模式:
f := fory.New(fory.WithXlang(true))
跨语言类型注册
在所有语言中使用一致的类型 ID:
Go
type User struct {
ID int64
Name string
}
f := fory.New(fory.WithXlang(true))
f.RegisterStruct(User{}, 1)
data, _ := f.Serialize(&User{ID: 1, Name: "Alice"})
Java
public class User {
public long id;
public String name;
}
Fory fory = Fory.builder().withXlang(true).build();
fory.register(User.class, 1);
User user = fory.deserialize(data, User.class);
Python
from dataclasses import dataclass
import pyfory
@dataclass
class User:
id: pyfory.Int64Type
name: str
fory = pyfory.Fory()
fory.register(User, type_id=1)
user = fory.deserialize(data)
类型映射
不同语言间完整类型映射请参考 类型映射规范。
字段顺序
跨语言序列化要求字段顺序一致。Fory 会将字段名转为 snake_case 后按字母序排序。
Go 字段名会先转 snake_case:
type Example struct {
UserID int64 // -> user_id
FirstName string // -> first_name
Age int32 // -> age
}
// Sorted order: age, first_name, user_id
请确保其他语言使用能产生相同 snake_case 顺序的字段名;或通过字段 ID 显式控制:
type Example struct {
UserID int64 `fory:"id=0"`
FirstName string `fory:"id=1"`
Age int32 `fory:"id=2"`
}
示例
Go 到 Java
Go(序列化端):
type Order struct {
ID int64
Customer string
Total float64
Items []string
}
f := fory.New(fory.WithXlang(true))
f.RegisterStruct(Order{}, 1)
order := &Order{
ID: 12345,
Customer: "Alice",
Total: 99.99,
Items: []string{"Widget", "Gadget"},
}
data, _ := f.Serialize(order)
// Send 'data' to Java service
Java(反序列化端):
public class Order {
public long id;
public String customer;
public double total;
public List<String> items;
}
Fory fory = Fory.builder().withXlang(true).build();
fory.register(Order.class, 1);
Order order = fory.deserialize(data, Order.class);
Python 到 Go
Python(序列化端):
from dataclasses import dataclass
import pyfory
@dataclass
class Message:
id: pyfory.Int64Type
content: str
timestamp: pyfory.Int64Type
fory = pyfory.Fory()
fory.register(Message, type_id=1)
msg = Message(id=1, content="Hello from Python", timestamp=1234567890)
data = fory.serialize(msg)
Go(反序列化端):
type Message struct {
ID int64
Content string
Timestamp int64
}
f := fory.New(fory.WithXlang(true))
f.RegisterStruct(Message{}, 1)
var msg Message
f.Deserialize(data, &msg)
fmt.Println(msg.Content) // "Hello from Python"