2015-04-23 4 views
1

Как инструмент сериализации (т. Е. Hessian) десериализует класс разной версии с тем же serialVersionUID? В большинстве случаев он может пропустить те неизвестные (не найденные в загрузчике классов) поля и поддерживать совместимость. Но в прошлый раз я попытался добавить новое поле Map<String, Object>, поместить на карту какой-то неизвестный объект, затем он выбросил ClassNotFoundException.Как инструмент сериализации пропускает неизвестные поля во время десериализации?

  • Почему нельзя пропустить карту, как и другие?
  • Это проблема, связанная с реализацией или механизмом сериализации инструмента?
+0

Я попробую еще раз, обнаружим, что hessian преобразует неизвестный тип в 'Hashmap', не бросая исключений. Но для 'Class ' instance, 'Class' является широко известным типом, поэтому он начинает преобразовывать и выдает' ClassNotFoundException', так как 'T' неизвестно. – Anderson

ответ

1

Это будет зависеть от самого инструмента. serialVersionUID предназначен для использования встроенным сериализатором Java (ObjectOutputStream), который, насколько я могу судить по чтению источника Гессиана, не используется Hessian.

Для Гесса конкретно, лучший источник я могу найти который упоминает эти виды изменений this email:

По крайней мере, для Гесса, то лучше думать о версионности как набор типов изменений, которые могут обрабатываться.

В частности, Hessian может управлять следующими видами изменений: 1) , если вы добавите или опустите поле, сторона, которая не понимает поле , будет игнорировать его. 2) возможны некоторые изменения типа поля, если Hessian может преобразовать (например, int to long) 3) существует некоторая гибкость на карте (bean), в зависимости от того, сколько информации Hessian имеет (что является основанием для предпочтения конкретных типов .)

Таким образом, если отправитель отправляет нетипизированную карту {"field1", 10}, а цель известна как MyValue {int field1; }, то Гессиан может отобразить поля .

Но он не может управлять такими вещами, как: 1) изменение имени поля (данные будут удалены). 2) изменение имени класса, где цель недоопределена, например поле объекта1. Если вы отправите MyValue2 в качестве нового поля 1, когда предыдущая версия была MyValue1, Hessian не может сделать , что автоматический переход. (Но, как и в случае с № 3 выше, поле «MyValue2 field1» предоставит достаточно информации для Hessian.) 3) класс разделяет, например. создавая подкласс и вставляя в него некоторые поля.
4) карту в список или список для изменения карты.

В принципе, я не думаю, что Гессиан намерен поддерживать неизвестные типы на картах.

+0

Спасибо большое! Но в ответе не упоминается, почему он не может пропустить поле «Карта», так как он соответствует случаю 1)? – Anderson

+0

Элемент на карте не является полем на Java. В первом случае речь идет о случаях «типа». «Тип» в Hessian - это класс на Java. Поэтому случай 1 применим только к неизвестным полям. HashMap в Java - это «нетипизированная карта» в терминологии Гессен. – Pace