我在使用 jsonpickle 时遇到问题。相反,我相信它可以正常工作,但它没有产生我想要的输出。
我有一个名为“节点”的课程。在“节点”中有四个整数(x、y、宽度、高度)和一个名为“NodeText”的 StringVar。
序列化 StringVar 的问题是那里有很多信息,对我来说这不是必需的。我在程序运行时使用它,但不需要保存和加载它。
所以我使用了一种方法来更改 jsonpickle 保存的内容,使用__getstate__
我的 Node.js 的方法。这样我可以做到这一点:
def __getstate__(self):
state = self.__dict__.copy()
del state['NodeText']
return state
到目前为止效果很好,并且没有保存 NodeText。问题来了。我将文件正常加载到对象中(在本例中为节点列表)。
加载的问题是:从 json 加载的项目不是我班级中定义的节点。它们几乎相同(它们有 x、y、宽度和高度),但是因为 NodeText 没有保存在 json 文件中,所以这些类似 Node 的对象没有该属性。当我在这些节点的屏幕上创建可视实例时,这会导致错误,因为 StringVar 用于 tkinter Entry 文本变量。
我想知道是否有办法将这个“几乎节点”加载到我的实际节点中。我可以一次将每个属性复制到一个新实例中,但这似乎是一种不好的方法。
我还可以在保存之前将 NodeText StringVar 设为空(从而节省文件中的空间),然后在加载时重新初始化它。这意味着我将拥有完整的对象,但不知何故,这似乎是一个尴尬的解决方法。
如果您想知道 StringVar 还有多少信息,我的测试 json 文件只有两个节点。只需保存基本属性(x,y,width,height),文件为1k。每个都有一个 StringVar,这就变成了 8k。在小幅增加的情况下,我不会太在意,但这非常大。
我可以强制负载到这个 Node 类型,而不仅仅是 Python 创建的一些新类型吗?
编辑:如果您想知道 json 的样子,请看这里:
{
"1": {
"py/object": "Node.Node",
"py/state": {
"ImageLocation": "",
"TextBackup": "",
"height": 200,
"uID": 1,
"width": 200,
"xPos": 150,
"yPos": 150
}
},
"2": {
"py/object": "Node.Node",
"py/state": {
"ImageLocation": "",
"TextBackup": "",
"height": 200,
"uID": 2,
"width": 100,
"xPos": 50,
"yPos": 450
}
}
}
由于类名在那里,我认为这将是类的实例化。但是,当您使用 jsonpickle 加载文件时,您会获得字典并可以检查加载的数据并检查每个节点。两个节点都不包含属性“NodeText”。也就是说,它不是以“无”为值的东西——简单的属性不存在。