Я успішно почав використовувати GSON для серіалізації та десеріалізації ієрархії об’єктів у моїй програмі Android.
У деяких об’єктах, що серіалізуються, є члени, яких я повинен позначити як transient
(або іншим чином використовувати альтернативні анотації GSON дозапобігати їх серіалізації), оскільки це посилання на об'єкти, які я не хочу серіалізувати як частину вихідного рядка JSON. Ці посилання стосуються об'єктів, які повинні бути побудовані окремо за допомогою інших засобів.
Після того, як структура буде десеріалізована назад в об'єкти Java, в якийсь момент мені потрібно заповнити ці посилання. Я міг би легко зробити це, можливо, використовуючи серію setXXX()
типи методів, але поки цього не буде зроблено, ці об'єкти перебувають у неповному стані. Тому мені цікаво, чи існує до цього більш стійкий підхід.
Досі я думав про те, як:
Нехай предмети кидають a
RuntimeException
(або щось більш підходяще), якщо вони "перебувають у неповному стані; тобто, якщо їх" попросять виконати якусь роботу, коли якийсь метод ініціалізації не був викликаний.Розділіть біти, що піддаються серіалізації, на aокремий об'єкт моделі даних. Іншими словами, вийміть матеріали, які не можуть бути серіалізованими. Після десеріалізації GSON побудуйте мої „реальні” об’єкти, використовуючи ці об’єкти даних у їх складі. Це, здається, дещо перешкоджає зручності використання GSON.
Напишіть спеціальний десериалізатор для GSON для спеціального створення цих об’єктів.
Відповіді:
6 за відповідь № 1Я, швидше за все, піду на другий підхід, тому щооскільки я, як правило, розробляю свої програми, все, що потрібно серіалізувати / десеріалізувати, насправді є просто старими даними або POJO, якщо хочете. Якщо мені здається, що мені потрібно налаштувати / налаштувати API серіалізації, щоб робити те, що я хочу, я схильний спрощувати те, що серіалізується, тому API серіалізації не потребує додаткових конфігурацій.
Отже, якщо у мене є більш складна модель даних,частини яких не слід серіалізувати / десеріалізувати, тоді я витягую з нього простіший набір POJO, як концептуально відокремлену модель даних для участі в серіалізації / десеріалізації. Це справді вимагає додаткового кроку для відображення між двома моделі даних, але це теж досить просто.
Якщо третій підхід є кращим, тоді також зверніть увагу функція Instance Creator, оскільки це може забезпечити ще одну корисну гачку для налаштування процесу десериалізації.
9 для відповіді № 2
Перевірити https://github.com/julman99/gson-fire
Це створена мною бібліотека, яка розширює Gson для обробки таких випадків, як постсеріалізація та постдесеріалізація
Крім того, він має безліч інших цікавих функцій, які мені потрібні були з часом у Gson.