Есть ли способ найти циркулярные ссылки? - PullRequest
1 голос
/ 16 июня 2019

Я должен сериализовать очень сложные классы как JSON.Сериализация завершается с ошибкой переполнения стека.Это известная проблема - сериализация завершается ошибкой, если есть циклические ссылки.Простейший случай: объект A сохраняет ссылку на объект B, а объект B сохраняет ссылку на A.

К сожалению, сериализуемые объекты слишком сложны (более 100 полей каждый), и практически невозможнонайти такие зависимости путем проверки кода.Gson регистрирует только исключение переполнения стека без дополнительной информации.

Есть ли способ обнаружить циклы?

Ответы [ 2 ]

0 голосов
/ 16 июня 2019

Простой алгоритм DFS справился бы с задачей

  • Создайте 2 хэш-набора: visiting и visited.
  • Обращение через Джсон
    • Если текущий узел находится в visiting
      • печать "круговая ссылка найдена"
    • Иначе, если текущий узел находится в visited
      • печать "кроссовер найден"
    • Else
      • добавить текущий узел к visiting
      • обращение через дочерние узлы
      • удалить текущий узел из visiting и добавить его к visited
0 голосов
/ 16 июня 2019

Это зависит от ситуации. Если циклические ссылки вызваны ошибкой или встречаются только в узком диапазоне случаев, я бы попытался рассмотреть конкретный случай.

Если ситуация является общей в том, что графы объектов с циклами могут возникать в обычном режиме, и это вопрос их обнаружения, возможно, стоит попытаться реализовать собственное решение, основанное на отражении (чтобы получить все поля классов в графе объектов, а также их значение) и сохранение значений ссылочных типов в IdentityHashMap для обнаружения вновь посещенных объектов.

См. в этом посте для дополнительного обсуждения использования карт хеш-идентификации для обнаружения циклических ссылок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...