自定义序列化器
对于不适合使用 @ForyObject 的类型,或需要特殊编码逻辑的场景,可以手动实现 Serializer。
适用场景
- 外部类型需要严格的编码兼容性
- 需要更紧凑或特殊的编码布局
- 旧载荷迁移路径
- 性能敏感的热点路径
实现 Serializer
import Foundation
import Fory
struct UUIDBox: Serializer, Equatable {
var value: UUID = UUID(uuidString: "00000000-0000-0000-0000-000000000000")!
static func foryDefault() -> UUIDBox {
UUIDBox()
}
static var staticTypeId: ForyTypeId {
.ext
}
func foryWriteData(_ context: WriteContext, hasGenerics: Bool) throws {
_ = hasGenerics
try value.uuidString.foryWriteData(context, hasGenerics: false)
}
static func foryReadData(_ context: ReadContext) throws -> UUIDBox {
let raw = try String.foryReadData(context)
guard let uuid = UUID(uuidString: raw) else {
throw ForyError.invalidData("invalid UUID string: \\(raw)")
}
return UUIDBox(value: uuid)
}
}
注册并使用
let fory = Fory()
fory.register(UUIDBox.self, id: 300)
let input = UUIDBox(value: UUID())
let data = try fory.serialize(input)
let output: UUIDBox = try fory.deserialize(data)
assert(input == output)
如何选择 staticTypeId
手动实现的自定义类型,需要让 staticTypeId 与实际编码形态匹配。
常见选择:
.structType:常规结构化对象.enumType/.typedUnion:枚举或联合类型.ext:扩展或自定义类型