跨语言序列化
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 枚举(带关联值的 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