Сериализация Gson Spring beans

#json #spring #serialization #gson #cglib

#json #spring #сериализация #gson #cglib

Вопрос:

Я использую Gson 1.6 и Spring Framework 3.0 для веб-приложения Java на WebSphere 6.1. У меня есть несколько Spring beans, для которых фактическим экземпляром является прокси-сервер CGLIB. Когда я пытаюсь сериализовать эти компоненты через Gson, непримитивные свойства класса не сериализуются. Вместо этого я получаю что-то вроде:

 {
   "CGLIB$BOUND":true,
   "CGLIB$CONSTRUCTED":true,
   "booleanProperty":true,
   "anotherBooleanProperty":true,
}
  

где я ожидал чего-то большего, чем

 {
   "stringProperty":"stringValue"
   "integerObjectProperty":17,
   "booleanProperty":true,
   "anotherBooleanProperty":true,
}
  

Когда я сериализую не проксируемый POJO, результат получается именно таким, как я ожидал. Как я могу заставить Gson генерировать ожидаемый результат?

Ответ №1:

Я бы сказал, что ваша проблема является результатом плохой практики.

Spring Beans обычно определяются поведением, а не состоянием. И вы должны сериализовать только те классы, у которых есть состояние, а не поведение.

Реорганизуйте свой код, передайте состояние из Beans в объекты Value и сериализуйте их.

Комментарии:

1. Я согласен с вами на 100%, что это не лучшая практика. 99% того, что мы сериализуем, на самом деле являются VOS / DTO … к сожалению, будучи частью более крупной команды, где не все следуют одинаковым стандартам и над которыми у меня нет контроля, подобные вещи случаются. Я надеюсь, по крайней мере, смягчить ущерб.

Ответ №2:

Я бы подумал о том, чтобы попробовать другой процессор JSON, Jackson (http://jackson.codehaus.org ), поскольку он имеет некоторую поддержку для работы с проксируемыми объектами cglib. Spring поддерживает Jackson, поэтому вам нужно написать меньше кода по сравнению с версией на основе gson.