跨语言序列化
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 使用兼容模式
- 对动态字段
Any和any 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