故障排查
本页涵盖了使用跨语言序列化时的常见问题和解决方案。
类型注册错误
"类型未注册"错误
症状:
Error: Type 'example.Person' is not registered
原因: 在反序列化之前未注册类型,或类型名称不匹配。
解决方案:
-
确保类型在双方使用相同的名称注册:
// Java
fory.register(Person.class, "example.Person");# Python
fory.register_type(Person, typename="example.Person") -
检查类型名称中的拼写错误或大小写差异
-
在任何序列化/反序列化调用之前注册类型
"类型 ID 不匹配"错误
症状:
Error: Expected type ID 100, got 101
原因: 跨语言使用了不同的类型 ID。
解决方案: 使用一致的类型 ID:
// Java
fory.register(Person.class, 100);
fory.register(Address.class, 101);
# Python
fory.register_type(Person, type_id=100)
fory.register_type(Address, type_id=101)
类型映射问题
整数溢出
症状: 值被截断或意外包装。
原因: 跨语言使用了不同的整数大小。
解决方案:
-
在 Python 中,使用显式类型注解:
@dataclass
class Data:
value: pyfory.Int32Type # 而不仅仅是 'int' -
确保整数范围兼容:
int8:-128 到 127int16:-32,768 到 32,767int32:-2,147,483,648 到 2,147,483,647
浮点精度损失
症状: 浮点值的精度出乎意料。
原因: 混合使用 float32 和 float64 类型。
解决方案:
-
使用一致的浮点类型:
@dataclass
class Data:
value: pyfory.Float32Type # 显式 32 位浮点数 -
请注意,Python 的
float默认映射到float64
字符串编码错误
症状:
Error: Invalid UTF-8 sequence
原因: 非 UTF-8 编码的字符串。
解决方案:
-
确保所有字符串都是有效的 UTF-8
-
在 Python 中,在序列化之前解码字节:
text = raw_bytes.decode('utf-8')
字段顺序问题
"字段不匹配"错误
症状: 反序列化的对象具有错误的字 段值。
原因: 语言之间的字段顺序不同。
解决方案: Fory 按字段的 snake_cased 名称对字段进行排序。确保字段名称一致:
// Java - 字段将按以下顺序排序:age、email、name
public class Person {
public String name;
public int age;
public String email;
}
# Python - 相同的字段顺序
@dataclass
class Person:
name: str
age: pyfory.Int32Type
email: str
引用跟踪问题
循环引用导致栈溢出
症状:
StackOverflowError 或 RecursionError
原因: 引用跟踪被禁用,但数据具有循环引用。
解决方案: 启用引用跟踪:
// Java
Fory fory = Fory.builder()
.withLanguage(Language.XLANG)
.withRefTracking(true)
.build();
# Python
fory = pyfory.Fory(ref_tracking=True)