<p>我是手术室。我在这里张贴是为了澄清我在我的案件中使用了什么。在</p>
<p>我把@Sina Rezaei在这个帖子中的帖子标记为可接受的解决方案,因为这(他帖子的最后一部分)和@snakechamerb的评论启发我理解了需要什么。在</p>
<p>我的解决方案概要如下:</p>
<pre><code>class ModelScene(QGraphicsScene):
# Serialize whole scene to JSON into stream
def json_serialize(self, stream) -> None:
# Get `json.dump()` to call `ModelScene.json_serialize_dump_obj()` on every object to be serialized
json.dump(self, stream, indent=4, default=ModelScene.json_serialize_dump_obj)
# Static method to be called from `json.dump(default=ModelScene.json_serialize_dump_obj)`
# This method is called on every object to be dumped/serialized
@staticmethod
def json_serialize_dump_obj(obj):
# if object has a `json_dump_obj()` method call that...
if hasattr(obj, "json_dump_obj"):
return obj.json_dump_obj()
# ...else just allow the default JSON serialization
return obj
# Return dict object suitable for serialization via JSON.dump()
# This one is in `ModelScene(QGraphicsScene)` class
def json_dump_obj(self) -> dict:
return {
"_classname_": self.__class__.__name__,
"node_data": self.node_data
}
class CanvasModelData(QAbstractListModel):
# Return dict object suitable for serialization via JSON.dump()
# This one is class CanvasModelData(QAbstractListModel)
def json_dump_obj(self) -> dict:
_data = {}
for key, value in self._data.items():
_data[key] = value
return {
"_classname_": self.__class__.__name__,
"data_type": self.data_type,
"_data": _data
}
</code></pre>
<ul>
<li>每个“complex”类都定义一个<code>def json_dump_obj(self) -> dict:</code>方法。在</li>
<li>该方法只返回序列化中需要的属性/子对象。在</li>
<li>顶层<code>json.dump(self, stream, default=ModelScene.json_serialize_dump_obj)</code>通过静态方法<code>ModelScene.json_serialize_dump_obj</code>将访问的每个节点增量序列化为流。如果可用,则调用my<code>obj.json_dump_obj()</code>,否则将调用基本对象类型的默认JSON序列化。在</li>
</ul>
<p>有趣的是,我遇到了一个和我有同样担心的人。从<strong>来看,两者有什么区别json.dump文件()和json.dumps文件()在python中?</strong>,解决方案<a href="https://stackoverflow.com/a/57087055/489865">https://stackoverflow.com/a/57087055/489865</a>:</p>
<blockquote>
<p>In memory usage and speed.</p>
<p>When you call <code>jsonstr = json.dumps(mydata)</code> it first creates a full
copy of your data in memory and only then you <code>file.write(jsonstr)</code> it
to disk. So this is a faster method but can be a problem if you have a
big piece of data to save.</p>
<p>When you call <code>json.dump(mydata, file)</code> without <code>'s'</code>, new memory is
not used, as the data is dumped by chunks. But the whole process is
about 2 times slower.</p>
<p>Source: I checked the source code of <code>json.dump()</code> and <code>json.dumps()</code> and
also tested both the variants measuring the time with <code>time.time()</code> and
watching the memory usage in htop.</p>
</blockquote>