#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.