Здравствуйте!
Столкнулся с вроде простой, но пока непонятной для меня головоломкой. Нужно запаковывать различные объекты в жсон и распаковывать их обратно на другой стороне при дессериализации. Обычно пересылаются простые объекты или классы и это вообще не проблема, но начали появляться объекты с зацикленными ссылками друг на друга, например
class Foo:
def __init__(self):
self.arg = None
class Bar:
def __init__(self):
self.baz = None
foo = Foo()
bar = Bar()
foo.arg = bar
bar.baz = foo
И если запаковать в json вполне возможно, к примеру
import json
class CircRefEncoder(json.JSONEncoder):
def __init__(self, *args, **argv):
super().__init__(*args, **argv)
self.proc_ids_map = {}
def default(self, obj):
if isinstance(obj, (Foo, Bar)):
object_id = id(obj)
if object_id in self.proc_ids_map:
return {"pyref": object_id} # short circle the object dumping
self.proc_ids_map[object_id] = obj
return {"$object_id": object_id, **obj.__dict__}
return obj
print(json.dumps(foo, cls=CircRefEncoder, check_circular=False))
то ума не приложу, какие шаги обязаны быть на той стороне и как вообще понять очередность для дессериализации?
(Давайте представим что тот кто пакует и тот кто распаковывает это разные процессы и второй просто создает объекты по простому принципу `types.SimpleNamespace(**все ключи из жсона, кроме айди объекта)`