Подтвердить что ты не робот

SerializationException: тип, не включенный в сериализуемый набор типов

В моем проекте Google Web Toolkit появилась следующая ошибка:

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

Каковы возможные причины этой ошибки?

4b9b3361

Ответ 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/...