跳到主要内容
版本:1.5.0

故障排查

本页介绍 Swift 中常见的问题及调试方法。

常见运行时错误

Type not registered: ...

原因:当前 Fory 实例没有注册所选的用户序列化器。

修复方式:

try fory.register(MyType.self, id: 100)

对于外部目标类型,请注册其序列化器:

try fory.register(UserSerializer.self, id: 100)

Type mismatch: expected ..., got ...

原因:对端之间的注册映射或字段类型信息不一致。

修复方式:

  • 确保两端使用相同的 type ID 或名称映射
  • 检查字段类型是否兼容

Invalid data: xlang bitmap mismatch

原因:输入由未写入 Swift 所期望的 xlang 编码格式的对端生成。

修复方式:将对端序列化器配置为写入 xlang 格式。Swift 始终使用 xlang 格式,不提供原生模式开关。

Invalid data: class version hash mismatch

原因:在 compatible: false 时发生了 Schema 变更。

修复方式:

  • 对于持续演进的 Schema,保持启用兼容模式
  • 或者,仅当每个读端和写端都使用相同 Schema 时才使用 compatible: false

常见宏阶段错误

@ForyStruct requires explicit types for stored properties

为所有存储属性补充显式类型声明。

Fory enum associated values cannot have default values

移除枚举关联值上的默认值。

所选序列化器的目标与字段类型不匹配

通过 with 选择的序列化器,其目标必须与该字段节点完全匹配。对于可选字段或集合字段,请选择 与之匹配的容器序列化器:

@ForyField(with: OptionalSerializer<UserSerializer>.self)
var user: ThirdParty.User?

外部目标类型构造错误

外部结构体需要提供可读且匹配的属性,以及可访问的匹配初始化器。外部类需要提供可访问的无参数 初始化器,以及可写且匹配的属性。

如果目标类型未提供上述构造接口,请使用自定义序列化器

联合类型 case 包含多个关联值

Swift 使用 xlang 联合类型格式,其中已知 case 只能包含零个或一个值。如果一个备选项包含多个逻辑 字段,请将这些字段放入显式的 @ForyStruct 载荷中。

调试命令

运行 Swift 测试:

cd swift
ENABLE_FORY_DEBUG_OUTPUT=1 swift test

运行由 Java 驱动的 Swift xlang 测试:

cd java/fory-core
ENABLE_FORY_DEBUG_OUTPUT=1 FORY_SWIFT_JAVA_CI=1 mvn -T16 test -Dtest=org.apache.fory.xlang.SwiftXlangTest