Ошибка SerializationPolicy при выполнении RPC из приложения GWT
Я получаю следующее исключение:
com.google.gwt.user.client.rpc.SerializationException: Тип 'java.lang.Long' не был включен в набор типов, которые могут быть сериализованы этим SerializationPolicy или его объектом класса не могут быть загружены. В целях безопасности этот тип не будет сериализован
с использованием GWT 2.1 и встроенного сервера Jetty. Согласно документам, этот тип определенно сериализуем... Как включить его в SerializationPolicy?
Ответы
Ответ 1
Нужно включить избыточный метод в службу RPC, который "белит" для нескольких объектов. Это возникает из-за использования дженериков, GWT не может обязательно определить, какой объект я могу сериализовать для включения в какой-то общий.
Я включил все типы, которые могут быть (un) сериализованы как члены объекта (SerializableWhitelist
). Я добавил метод к объекту сервлета RPC, например:
public SerializableWhitelist junk(SerializableWhitelist l) { return null; }
Стоит отметить, что вам нужно включать типы данных в белый список как аргумент и как возвращаемый тип, так как GWT, по-видимому, поддерживает две отдельные политики сериализации.
Ответ 2
Здесь ссылка, которая должна решить проблему:
http://developerlife.com/tutorials/?p=131
Пользовательский класс сериализуется, если:
- класс присваивается IsSerializable или java.io.Serializable либо потому, что он реализует один из этих интерфейсов, либо потому, что он получен из суперкласса, который реализует один из этих интерфейсов.
- все нечетные, непереходные поля экземпляров классов являются сериализуемыми
- класс имеет конструктор с открытым значением по умолчанию (нулевой аргумент)
Ответ 3
Попробуйте удалить файлы *.gwt.rpc в каталоге war/app, очистите и перестройте.
Одно замечание: вы должны избегать долгого или долгого, если это возможно, потому что они -
эмулируется на GWT (потому что нет собственного Javascript long) и очень
медленный. Вместо этого используйте int, где бы вы ни были.
Ответ 4
FYI Я поднял это как ошибку GWT: http://code.google.com/p/google-web-toolkit/issues/detail?id=5811
Мы увидим, что они говорят.
Ответ 5
FWIW, у меня была эта проблема, но мой тип "Объект" был скрыт за генерализованными классами. Само сообщение об ошибке было неправильным.
Итак, если один из ваших методов rpc включает класс:
class Xxx<T> implements IsSerializable {...
Он должен измениться на:
class Xxx<T extends IsSerializable> implements IsSerializable {...
Ответ 6
Проблема также может быть вызвана тем, что код на вашей локальной машине, на которой выполняется хост-режим, не совпадает с кодом на внешнем сервере, с которым вы подключаетесь через RPC. Так что в моем случае я отсутствовал git нажимал на свою локальную машину, чтобы соответствовать тому, что было развернуто на внешнем сервере. Изменения были минимальными, просто новое свойство в одном из классов, которые были включены в gwt.rpc, но это было уже достаточно, чтобы имена файлов gwt.rpc md5 были разными и, следовательно, возникла вышеупомянутая ошибка.
Ответ 7
Вдохновленный http://groups.google.com/group/google-web-toolkit/browse_thread/thread/7dd5123d359ddfa8
Использование eclipse и maven и gwt 2.1.1
Скомпилируйте и разверните gwt war.
Попробуйте использовать OOPHM, запущенный из Eclipse.
Это не удастся для меня.
Это будет генерировать в журналах сервера:
ОШИБКА: файл политики сериализации 'blah.gwt.rpc' не найден; вы забыли включить его в это развертывание?
ПРЕДУПРЕЖДЕНИЕ: Не удалось получить SerializationPolicy '94DEC228B2828D3A5897FEE3D6845A40' для модуля 'http://blah: 8080/BlahUI/BlahUI/'; будет использоваться политическая политика сериализации, совместимая с 1.3.3. В результате вы можете получить SerializationExceptions.
И тогда
Исключение при отправке входящего вызова RPC
com.google.gwt.user.client.rpc.SerializationException: Введите '[LpathToClass;' не был назначен для "com.google.gwt.user.client.rpc.IsSerializable" и не имел настраиваемого поляризатора поля. Для целей безопасности этот тип не будет сериализован.: instance = [LpathToClass; @9d524af на com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:614)
Теперь, когда были созданы дополнительные файлы gwt.rpc(либо с помощью плагина eclipse/maven, который знает?)
Перекомпилировать (даже чистый компилятор будет работать, потому что файлы gwt.rpc не находятся в целевой папке, мои файлы gwt.rpc OOPHM находятся в той же папке, что и hpoint), и передислоцируются. Этот новый файл войны будет содержать сгенерированные файлы gwt.rpc.
Перезапустите OOPHM из Eclipse.
Работает для меня.
Ответ 8
Другой FWIW: Я считаю, что я выяснил аналогичную проблему в классе enum, изменив
модификатор доступа одиночного, одного конструктора аргументов по умолчанию (без модификатора)
до 'private'. В любом случае, это не нарушило его, потому что теперь он работает именно так.
Ответ 9
Я столкнулся с этой ошибкой и полностью застрял на 1 день. Затем я пришел к следующему быстрому решению:
Убедитесь, что ваши классы DTO или Entities следуют правилам сериализуемого интерфейса.
Это единственное, что вам нужно сделать, потому что остальная часть проблем будет связана с созданием сборки.
Поэтому, если вы используете maven, убедитесь, что очистить сборку и очистить весь кеш браузера.
Я разрешил свои проблемы с этим. Надеюсь, это поможет. Благодарю!
Ответ 10
Убедитесь, что класс находится в общей папке.
Это то, чего я не хватало.