Задать вопрос
@Derfirm
Noname Developer.

Как найти зацикленные ссылки при сериализации и сделать возможным дессериализацию объектов обратно?

Здравствуйте!
Столкнулся с вроде простой, но пока непонятной для меня головоломкой. Нужно запаковывать различные объекты в жсон и распаковывать их обратно на другой стороне при дессериализации. Обычно пересылаются простые объекты или классы и это вообще не проблема, но начали появляться объекты с зацикленными ссылками друг на друга, например
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(**все ключи из жсона, кроме айди объекта)`
  • Вопрос задан
  • 92 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 1
solotony
@solotony
покоряю пик Балмера
при экспорте заменяешь ссылки на идентификаторы
экспортируешь все плоским списком
при импорте после создания объектов восстанавливаешь ссылки из идентификаторов
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@javedimka
Хочу сока
pickle + base64

Полученное значение засовывать в какое-либо json поле.

Ну вы и выдумщики на проблемы, конечно, энкодеры-декодеры какие-то пишите, жуть.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы