Ошибка SerializationPolicy при выполнении RPC из приложения GWT - PullRequest
22 голосов
/ 17 ноября 2010

Я получаю следующее исключение:

com.google.gwt.user.client.rpc.SerializationException: Тип 'java.lang.Long' не был включен в набор типовкоторый может быть сериализован этим SerializationPolicy или его объект Class не может быть загружен.В целях безопасности этот тип не будет сериализован

с использованием GWT 2.1 и встроенного сервера Jetty.Согласно документации, этот тип определенно сериализуем ... Как я могу включить его в SerializationPolicy?

Ответы [ 10 ]

28 голосов
/ 11 сентября 2011

Вот ссылка, которая должна решить проблему: http://developerlife.com/tutorials/?p=131

Пользовательский класс является сериализуемым, если:

  1. класс можно назначить для IsSerializable или java.io.Serializable, либо потому, что он реализует один из этих интерфейсов, либо потому, что он является производным от суперкласса, который реализует один из этих интерфейсов.
  2. все неокончательные, непереходные поля экземпляра класса являются сериализуемыми
  3. класс имеет открытый конструктор по умолчанию (нулевой аргумент)
20 голосов
/ 21 ноября 2010

Требуется включить в службу RPC лишний метод, который "помещает в белый список" ряд объектов.Это возникает из-за использования обобщений, GWT не может обязательно определить, какой объект я могу сериализовать, чтобы включить в какой-либо обобщенный.объекта (SerializableWhitelist).Я добавил метод к объекту сервлета RPC, например:

public SerializableWhitelist junk(SerializableWhitelist l) { return null; }

Стоит отметить, что вам нужно , чтобы включить типы данных белого списка в качестве аргумента и кактип возврата, так как GWT, очевидно, поддерживает две отдельные политики сериализации.

8 голосов
/ 17 ноября 2010

Попробуйте удалить файлы * .gwt.rpc в каталоге war / app, очистить и перестроить.

Заметьте одно: по возможности следует избегать long или Long, поскольку они эмулируются на
GWT (потому что нет длинного нативного Javascript) и очень медленный
.Вместо этого используйте int везде, где сможете.

4 голосов
/ 23 декабря 2010

К вашему сведению Я поднял это как ошибку GWT: http://code.google.com/p/google-web-toolkit/issues/detail?id=5811

Посмотрим, что они скажут.

3 голосов
/ 22 мая 2013

FWIW, у меня возникла эта проблема, но мой тип объекта был скрыт за обобщенными классами Само сообщение об ошибке было неверным.

Итак, если один из ваших методов rpc включает класс:

class Xxx<T> implements IsSerializable {...

Необходимо изменить на:

class Xxx<T extends IsSerializable> implements IsSerializable {...
1 голос
/ 24 января 2012

Проблема также может заключаться в том, что код на локальном компьютере, на котором вы работаете в режиме хостинга, не совпадает с кодом на внешнем сервере, к которому вы подключаетесь через RPC. Так что в моем случае мне не хватало git pull на моей локальной машине, чтобы соответствовать тому, что было развернуто на внешнем сервере. Изменения были минимальными, просто новое свойство в одном из классов, включенных в gwt.rpc, но этого уже было достаточно, чтобы имена файлов gwt.rpc md5 были другими и, таким образом, произошла вышеупомянутая ошибка.

0 голосов
/ 06 июля 2017

Убедитесь, что класс находится в общей папке. Это то, чего мне не хватало.

0 голосов
/ 27 марта 2017

Я столкнулся с этой ошибкой и застрял на 1 день полностью.Затем я наткнулся на следующее быстрое решение:

Убедитесь, что ваши классы DTO или Entities соответствуют правилам сериализуемого интерфейса.Это единственное, что вам нужно сделать, потому что остальные проблемы будут связаны с созданием вашей сборки.Так что, если вы используете maven, убедитесь, что сделали чистую сборку и очистили весь кеш браузера.Я решил мои проблемы с этим.Надеюсь, это поможет.Спасибо!

0 голосов
/ 11 июня 2013

Другой FWIW: я думаю, что я решил аналогичную проблему в классе enum, изменив модификатор доступа к конструктору с одним аргументом по умолчанию (без модификатора) на «частный». В любом случае, это не сломало его, потому что теперь оно работает так.

0 голосов
/ 26 октября 2011

Вдохновлен 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 политика сериализации.В результате могут возникать исключения SerializationException.

А затем

Исключение при отправке входящего 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 не находятся в целевой папке, мои файлы OOPHM gwt.rpc находятся в той же папке, что и точка входа html), и повторно развернуть.Этот новый файл войны будет содержать сгенерированные файлы gwt.rpc.

Перезапустить OOPHM из Eclipse.

У меня работает.

...