跳到主要内容
版本:dev

跨语言序列化

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 枚举
  • 支持传递式导入注册的 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 端 roundtrip 矩阵测试,以及与 Java 对端的 roundtrip 校验,使用 IDL_PEER_LANG=swift

调试跨语言测试

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

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