Подтвердить что ты не робот

Завершение строительства объекта после десериализации GSON

Я успешно начал использовать GSON для сериализации и десериализации иерархии объектов в моем приложении Android.

У некоторых из сериализуемых объектов есть члены, которые я должен пометить как transient (или иначе использовать альтернативные аннотации GSON, чтобы предотвратить их сериализацию), потому что они являются ссылками на объекты, которые я не хочу сериализовать как часть выходной строки JSON. Эти ссылки относятся к объектам, которые должны быть сконструированы отдельно другими способами.

Как только структура десериализуется обратно в объекты Java, в какой-то момент мне нужно заполнить эти ссылки. Я мог бы легко сделать это, возможно, используя серию методов типа setXXX(), но пока это не сделано, эти объекты находятся в неполном состоянии. Поэтому меня интересует, есть ли более надежный подход к этому.

Пути, о которых я думал до сих пор:

  1. Пусть объекты RuntimeException (или что-то более подходящее), если они находятся в неполном состоянии; то есть, если их попросили выполнить некоторую работу, когда не был вызван какой-либо метод инициализации.

  2. Выделите сериализуемые биты в отдельный объект модели данных. Другими словами, выньте вещи, которые не могут быть сериализованы. После десериализации GSON создайте мои "реальные" объекты, используя эти объекты данных в их составе. Похоже, это несколько снижает удобство использования GSON.

  3. Напишите специальный десериализатор для GSON, чтобы обрабатывать специальные объекты этих объектов.

4b9b3361

Ответ 1

Я бы предпочел второй подход, потому что, как я обычно разрабатываю свои приложения, все, что нужно сериализовать/десериализовать, - это просто простые старые данные или POJO, если вы предпочитаете. Если мне нужно настроить/настроить API сериализации, чтобы делать то, что я хочу, я стараюсь упростить сериализацию, поэтому для API сериализации не нужны дополнительные конфигурации.

Итак, если у меня есть более сложная модель данных, часть которой не должна быть сериализована/десериализована, то я извлекаю из нее более простой набор POJO в качестве концептуально отдельной модели данных для участия в сериализации/десериализации, Это действительно требует дополнительного шага для сопоставления между двумя моделями данных, но это также довольно просто.

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

Ответ 2

Отъезд https://github.com/julman99/gson-fire

Это библиотека, которую я создал, которая расширяет Gson для обработки таких случаев, как пост-сериализация и пост-десериализация

Также у него есть много других интересных функций, которые мне нужно с течением времени с Gson.