Cross-Language Serialization
Fory Swift can exchange payloads with other Fory runtimes using the xlang protocol.
Recommended Cross-language Configuration
let fory = Fory(xlang: true, ref: false, compatible: true)
Register Types with Shared Identity
ID-based registration
@ForyStruct
struct Order {
var id: Int64 = 0
var amount: Double = 0
}
let fory = Fory(xlang: true, compatible: true)
fory.register(Order.self, id: 100)
Name-based registration
try fory.register(Order.self, namespace: "com.example", name: "Order")
Cross-language Rules
- Keep type registration mapping consistent across languages
- Use compatible mode when independently evolving schemas
- Register all user-defined concrete types used by dynamic fields (
Any,any Serializer)
Lists and Dense Arrays
Swift Array<T> fields map to Fory list<T> unless field metadata explicitly
requests dense array<T>. Use array<T> only for one-dimensional bool or
numeric data.
| Fory schema | Swift field metadata sketch |
|---|---|
list<int32> | @ListField(element: .int32()) var ids: [Int32] |
array<bool> | @ArrayField(element: .bool()) var flags: [Bool] |
array<int8> | @ArrayField(element: .int8()) var values: [Int8] |
array<int16> | @ArrayField(element: .int16()) var values: [Int16] |
array<int32> | @ArrayField(element: .int32()) var values: [Int32] |
array<int64> | @ArrayField(element: .int64()) var values: [Int64] |
array<uint8> | @ArrayField(element: .uint8()) var values: [UInt8] |
array<uint16> | @ArrayField(element: .uint16()) var values: [UInt16] |
array<uint32> | @ArrayField(element: .uint32()) var values: [UInt32] |
array<uint64> | @ArrayField(element: .uint64()) var values: [UInt64] |
array<float16> | @ArrayField(element: .float16()) var values: [Float16] |
array<bfloat16> | @ArrayField(element: .bfloat16()) var values: [BFloat16] |
array<float32> | @ArrayField(element: .float32()) var values: [Float] |
array<float64> | @ArrayField(element: .float64()) var values: [Double] |
Swift IDL Workflow
Generate Swift models directly from Fory IDL/Proto/FBS inputs:
foryc schema.fdl --swift_out ./Sources/Generated
Generated Swift code includes:
@ForyStruct,@ForyEnum,@ForyUnion, and field/case metadata- Tagged union enums (associated-value enum cases)
ForyRegistration.register(_:)helpers with transitive import registrationtoBytes/fromByteshelpers on generated types
Use generated registration before cross-language serialization:
let fory = Fory(xlang: true, ref: true, compatible: true)
try Addressbook.ForyRegistration.register(fory)
let payload = try fory.serialize(book)
let decoded: Addressbook.AddressBook = try fory.deserialize(payload)
Run Swift IDL Integration Tests
cd integration_tests/idl_tests
./run_swift_tests.sh
This runs Swift roundtrip matrix tests and Java peer roundtrip checks (IDL_PEER_LANG=swift).
Debugging Cross-language Tests
Enable debug output when running xlang tests:
ENABLE_FORY_DEBUG_OUTPUT=1 FORY_SWIFT_JAVA_CI=1 mvn -T16 test -Dtest=org.apache.fory.xlang.SwiftXlangTest