为什么jsonpickle连续执行encode、decode后isinstance检查返回False
问题原因分析
- 核心直接原因:
isinstance校验的参数书写错误
你代码中isinstance(testInstanceObject, Person.__class__)的第二个参数使用错误:Person本身就是自定义类对象,所有类对象的类型都是type,即Person.__class__等价于type。你实际是在校验反序列化得到的实例是不是type的实例,显然不成立,所以返回False。
修正后的校验代码如下:
常规场景下修正后即可返回True。print(isinstance(testInstanceObject, Person)) - 潜在的jsonpickle类匹配问题
如果修正参数后仍返回False,是jsonpickle的反序列化类匹配逻辑导致的:
jsonpickle序列化时会存储目标类的全限定路径(当前脚本下就是__main__.Person),反序列化时会根据这个路径导入对应的类生成实例。出现以下情况时,反序列化用到的类和当前作用域的Person类是内存中完全独立的两个对象,isinstance会返回False:Person是定义在函数/其他类内部的局部类,没有暴露在模块顶层- 运行环境中
Person类被重复定义过(比如交互式shell、Jupyter中多次执行类定义代码) - 反序列化时的模块导入路径和序列化时不一致
这类问题可以通过在decode时指定强制使用的类解决:
testInstanceObject = jsonpickle.decode(testInstanceJSON, classes=[Person])
内容的提问来源于stack exchange,提问作者Manifest Man
相关产品推荐
相关产品推荐

