SerializationException: тип, не включенный в сериализуемый набор типов
В моем проекте Google Web Toolkit появилась следующая ошибка:
com.google.gwt.user.client.rpc.SerializationException: Тип 'your.class.Type не был включен в набор типов, которые могут быть сериализованы этим SerializationPolicy или его объектом класса не могут быть загружены. В целях безопасности этот тип не будет сериализован.
Каковы возможные причины этой ошибки?
Ответы
Ответ 1
GWT отслеживает набор типов, которые могут быть сериализованы и отправлены клиенту. your.class.Type
, по-видимому, не было в этом списке. Такие списки хранятся в файлах .gwt.rpc
. Эти списки генерируются, поэтому редактирование этих списков, вероятно, бесполезно. Как генерируются эти списки, это немного неясно, но вы можете попробовать следующее:
- Убедитесь, что
your.class.Type
реализует java.io.Serializable
- Убедитесь, что
your.class.Type
имеет открытый конструктор no-args
-
Убедитесь, что члены your.class.Type
выполняют те же
-
Убедитесь, что ваша программа не содержит коллекции несериализуемого типа, например. ArrayList<Object>
. Если такая коллекция содержит your.class.Type
и сериализована, эта ошибка произойдет.
-
Сделайте your.class.Type
реализацию IsSerializable
. Этот интерфейс-маркер был специально предназначен для классов, которые должны быть отправлены клиенту. Это не сработало для меня, но мой класс также реализовал Serializable
, поэтому, возможно, оба интерфейса плохо работают вместе.
-
Другой вариант - создать фиктивный класс с your.class.Type
в качестве члена и добавить метод к вашему интерфейсу RPC, который получает и возвращает фиктивный файл. Это заставляет компилятор GWT добавлять фиктивный класс и его членов в белый список сериализации.
Ответ 2
Я также добавлю, что если вы хотите использовать вложенный класс, используйте статический класс-член.
То есть.
public class Pojo {
public static class Insider {
}
}
Нестатические классы-члены получают исключение SerializationException в GWT 2.4
Ответ 3
У меня была такая же проблема в RemoteService, как это
public List<X> getX(...);
где X - интерфейс. Единственная реализация соответствовала правилам, то есть реализует Serializable или IsSerializable, имеет конструктор по умолчанию, и все его (непереходные и не финальные) поля также следуют этим правилам.
Но я продолжал получать это SerializationException, пока не изменил тип результата из списка в X [], поэтому
public X[] getX(...);
работал. Интересно, что единственным аргументом, заключающимся в том, что List, Y является интерфейсом, не было проблемой вообще...
Ответ 4
Я столкнулся с этой проблемой, и если вы случайно используете JPA или Hibernate, это может быть результатом попытки вернуть объект запроса, а не создания нового объекта и копирования ваших relavant-полей в этот новый объект. Проверьте следующее, которое я видел в группе google.
@SuppressWarnings("unchecked")
public static List<Article> getForUser(User user)
{
List<Article> articles = null;
PersistenceManager pm = PMF.get().getPersistenceManager();
try
{
Query query = pm.newQuery(Article.class);
query.setFilter("email == emailParam");
query.setOrdering("timeStamp desc");
query.declareParameters("String emailParam");
List<Article> results = (List<Article>) query.execute(user.getEmail
());
articles = new ArrayList<Article>();
for (Article a : results)
{
a.getEmail();
articles.add(a);
}
}
finally
{
pm.close();
}
return articles;
}
это очень помогло мне, надеюсь, это указывает другим в правильном направлении.
Ответ 5
Похоже, этот вопрос очень похож на что IsSerializable или нет в GWT?, см. больше ссылок на соответствующую документацию там.
Ответ 6
Когда у вашего класса есть аннотации JDO, тогда это исправлено для меня (в дополнение к точкам в ответе bspoel): fooobar.com/info/191741/...