SerializationException: тип не включен в сериализуемый набор типов - PullRequest
28 голосов
/ 06 марта 2011

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

com. В целях безопасности этот тип не будет сериализован.

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

Ответы [ 6 ]

65 голосов
/ 06 марта 2011

GWT отслеживает набор типов, которые могут быть сериализованы и отправлены клиенту. your.class.Type очевидно не было в этом списке. Подобные списки хранятся в .gwt.rpc файлах. Эти списки генерируются, поэтому редактирование этих списков, вероятно, бесполезно. Как генерируются эти списки, немного неясно, но вы можете попробовать следующее:

  • Убедитесь, что your.class.Type реализует java.io.Serializable
  • Убедитесь, что your.class.Type имеет открытый конструктор без аргументов
  • Убедитесь, что члены your.class.Type делают то же самое

  • Проверьте, не содержит ли ваша программа коллекции несериализуемого типа, например, ArrayList<Object>. Если такая коллекция содержит your.class.Type и сериализована, эта ошибка произойдет.

  • Сделать your.class.Type орудие IsSerializable. Этот интерфейс маркера был специально предназначен для классов, которые должны быть отправлены клиенту. Это не сработало для меня, но мой класс также реализовал Serializable, поэтому, возможно, оба интерфейса не работают вместе.

  • Другой вариант - создать фиктивный класс с your.class.Type в качестве члена и добавить метод в интерфейс RPC, который получает и возвращает фиктив. Это заставит компилятор GWT добавить фиктивный класс и его членов в белый список сериализации.

4 голосов
/ 02 ноября 2012

Я также добавлю, что если вы хотите использовать вложенный класс, используйте статический класс-член. То есть.,

public class Pojo {
    public static class Insider {
    }
}

Нестатические классы-члены получают исключение SerializationException в GWT 2.4

3 голосов
/ 21 ноября 2012

У меня была такая же проблема в RemoteService, как эта

public List<X> getX(...);

где X - интерфейс. Единственная реализация соответствовала правилам, то есть реализует Serializable или IsSerializable, имеет конструктор по умолчанию, и все его (не временные и не финальные) поля также следуют этим правилам.

Но я продолжал получать это SerializationException, пока я не изменил тип результата с List на X [], поэтому

public X[] getX(...);

работал. Интересно, что единственным аргументом, являющимся List, а Y - интерфейс, не было никаких проблем ...

2 голосов
/ 20 марта 2013

Я столкнулся с этой проблемой, и если вы случайно используете JPA или Hibernate, это может быть результатом попытки вернуть объект запроса, а не создания нового объекта и копирования ваших соответствующих полей в этот новый объект.Проверьте следующее, которое я видел в группе 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; 
    } 

это очень помогло мне, надеюсь, это направит других в правильном направлении.

1 голос
/ 10 августа 2011

Похоже, этот вопрос очень похож на что такое IsSerializable или нет в GWT? , больше ссылок см. В соответствующей документации.

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

Когда в вашем классе есть аннотации JDO, это исправило это для меня (в дополнение к пунктам в ответе bspoel): https://stackoverflow.com/a/4826778/1099376

...