跳到主要内容
版本:0.17

自定义序列化器

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