#java #json #fasterxml
Вопрос:
Я столкнулся со следующей проблемой: у меня есть класс «Участок», в котором хранится список его контрактов на покупку (класс «Контракт на покупку»). С другой стороны, в классе PurchaseContract хранится участок, на который он ссылается. Мне нужно, чтобы оба объекта указывали друг на друга, чтобы другие классы также могли получить к ним доступ (например, владелец, который хранит свои любимые сюжеты и подписанные контракты). Для сериализации и десериализации я использую fasterxml для Java.
Допустим, есть участок «Примерный график», в котором хранится контракт на покупку «Примерный контракт 1». Теперь, когда дело доходит до хранения этих объектов в файле .json, все работает так, как задумано. Но при загрузке их обратно в программу либо возникнет ошибка, так как один объект всегда будет неизвестен, либо вместо 1 будет создано 2 объекта.
Я попытался присвоить каждому объекту идентификатор, затем загрузить все объекты и, наконец, выполнить метод «loadDependencies» (который загружает все зависимости на основе сохраненного идентификатора) для каждого объекта, реализующего интерфейс «PostDeserializationDependencies». Но почему-то это не кажется правильным или элегантным способом, и, что еще хуже, это портит каждый класс, который полагается на такие зависимости, так как для каждого объекта, который необходимо загрузить после сериализации, необходимо поле для хранения идентификатора указанного объекта.
Эта проблема беспокоит меня в нескольких проектах уже довольно давно. Я был бы признателен, если бы у кого-то был более элегантный способ решения этой проблемы, возможно, даже с использованием функций, которые может предложить библиотека fasterxml.
Комментарии:
1. Хранение идентификатора и ссылки по этому идентификатору на самом деле являются единственным способом обработки циклических ссылок. Например, это то, что сериализация Java делает внутренне.
2. если бы я должен был хранить контракт как в классе участка, так и в классе владельца, у меня получилось бы 2 отдельных объекта, где должен быть только один объект. Таким образом, я не мог добавить их обратно в список, в котором хранятся все когда-либо созданные контракты, потому что я бы добавил 2 объекта, означающих одно и то же. Кроме того, я не мог сравнить их с помощью .equals().
3. Вам нужно точно изучить, как сериализация Java обрабатывает идентификаторы объектов; у вас та же проблема.