自定义序列化器
对于不能或不适合使用 @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:扩展 / 自定义种类