跳到主要内容
版本:0.16

自定义序列化器

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