跳到主要内容
版本:0.16

跨语言序列化

Fory Swift 可以通过 xlang 协议与其他 Fory 运行时交换载荷。

推荐的跨语言配置

let fory = Fory(xlang: true, trackRef: false, compatible: true)

注册具有共享身份的类型

基于 ID 的注册

@ForyObject
struct Order {
var id: Int64 = 0
var amount: Double = 0
}

let fory = Fory(xlang: true, compatible: true)
fory.register(Order.self, id: 100)

基于名称的注册

try fory.register(Order.self, namespace: "com.example", name: "Order")

跨语言规则

  • 在不同语言之间保持类型注册映射一致
  • 独立演进 schema 时使用兼容模式
  • 注册动态字段(Anyany Serializer)中会用到的所有用户定义具体类型

Swift IDL 工作流

可直接从 Fory IDL / Proto / FBS 输入生成 Swift 模型:

foryc schema.fdl --swift_out ./Sources/Generated

生成的 Swift 代码包括:

  • @ForyObject 模型以及 @ForyField(id: ...) 元信息
  • Tagged union 枚举(带关联值的 enum case)
  • 负责递归导入注册的 ForyRegistration.register(_:) 辅助方法
  • 生成类型上的 toBytes / fromBytes 辅助方法

在执行跨语言序列化前,先使用生成的注册方法:

let fory = Fory(xlang: true, trackRef: true, compatible: true)
try Addressbook.ForyRegistration.register(fory)

let payload = try fory.serialize(book)
let decoded: Addressbook.AddressBook = try fory.deserialize(payload)

运行 Swift IDL 集成测试

cd integration_tests/idl_tests
./run_swift_tests.sh

这会执行 Swift 往返矩阵测试以及 Java 对端往返校验(IDL_PEER_LANG=swift)。

调试跨语言测试

运行 xlang 测试时可以打开调试输出:

ENABLE_FORY_DEBUG_OUTPUT=1 FORY_SWIFT_JAVA_CI=1 mvn -T16 test -Dtest=org.apache.fory.xlang.SwiftXlangTest