2012-02-09 2 views
2

Мне нелегко пытаться сериализовать мой класс (буквально 3-4 часа, чтобы найти solutio). Добавить подкласс существующего сериализуемой и функционирования класса, и чем получить следующее сообщение об ошибке:GWT + сериализация

[ERROR] com.google.gwt.user.client.ui.DelegatingChangeListenerCollection is not default instantiable (it must have a zero-argument constructor or no constructors at all) and has no custom serializer. (reached via com.client.rpc.ItemRecRpc) 
       [ERROR] com.google.gwt.user.client.ui.DelegatingClickListenerCollection is not default instantiable (it must have a zero-argument constructor or no constructors at all) and has no custom serializer. (reached via com.client.rpc.ItemRecRpc) 
       [ERROR] com.google.gwt.user.client.ui.DelegatingFocusListenerCollection is not default instantiable (it must have a zero-argument constructor or no constructors at all) and has no custom serializer. (reached via com.client.rpc.ItemRecRpc) 
       [ERROR] com.google.gwt.user.client.ui.DelegatingKeyboardListenerCollection is not default instantiable (it must have a zero-argument constructor or no constructors at all) and has no custom serializer. (reached via com.client.rpc.ItemRecRpc) 
       [ERROR] com.google.gwt.view.client.ListDataProvider<T>.ListWrapper<> is not default instantiable (it must have a zero-argument constructor or no constructors at all) and has no custom serializer. (reached via com.client.rpc.ItemRecRpc) 
       [ERROR] com.client.rpc.ItemRecRpc.LogCollection is not default instantiable (it must have a zero-argument constructor or no constructors at all) and has no custom serializer. (reached via com.client.rpc.ItemRecRpc) 
       [ERROR] com.client.rpc.ItemRecRpc.LogCollection has no available instantiable subtypes. (reached via com.client.rpc.ItemRecRpc) 
       [ERROR] subtype com.client.rpc.ItemRecRpc.LogCollection is not default instantiable (it must have a zero-argument constructor or no constructors at all) and has no custom serializer. (reached via com.client.rpc.ItemRecRpc) 
       [ERROR] java.util.AbstractList.SubList<E> is not default instantiable (it must have a zero-argument constructor or no constructors at all) and has no custom serializer. (reached via com.client.rpc.ItemRecRpc) 
       [ERROR] java.util.Collections.UnmodifiableList<T> is not default instantiable (it must have a zero-argument constructor or no constructors at all) and has no custom serializer. (reached via com.client.rpc.ItemRecRpc) 
       [ERROR] java.util.Collections.UnmodifiableRandomAccessList<T> is not default instantiable (it must have a zero-argument 

Мой класс выглядит следующим образом:

public class ItemRecRpc implements Serializable { 

    private static final long serialVersionUID = -5828108890651522661L; 
     . 
     . 

     private String rId; 
    private LogCollection logColl;//if i comment this, no error message... 

    public class LogCollection{ 

     public LogCollection(){ 

     } 
     //public long creationTime = System.currentTimeMillis(); 
     //public LongVector times = new LongVector(); 
     //public ArrayList<Object> messages = new ArrayList<Object>(); 
     //public int nSkipped = 0; 
     //public int nExceptions = 0; 
     //public Exception firstException = null; 
     //public long endGcTime=0; 
     public long endTime; 
    } 
. 
. 
. 
} 

Когда я строка комментария «частный LogCollection logColl» его это нормально, но когда я раскомментирую, я снова получаю сообщение об ошибке. Я попытался с помощью статического ключевого слова, как вы видите я комментировать каждые переменные подклассы, но не могу помочь ... Во всяком случае, если я создать новый класс:

public class LogCollectionRpc implements Serializable { 

    public LogCollectionRpc() { 
     // 
    } 
    public long creationTime = System.currentTimeMillis(); 
    public LongVector times = new LongVector(); 
    public ArrayList<Object> messages = new ArrayList<Object>(); 
    public int nSkipped = 0; // due to reaching the limit 
    public int nExceptions = 0; // due to MyAppender-s 
    public Exception firstException = null; // due to MyAppender-s 
    public long endGcTime = 0; 
    public long endTime; 

} 

И чем пытаться использовать это в качестве моего класса функционирования, то хорошо ... Но эта штука действительно подшучивает ...

Любая идея? Gwt не поддерживает сериализацию подкласса? Или мне что-то не хватает. Измените любой ответ.

С наилучшими пожеланиями, Питер

+1

Это то, что @jusio говорит: внутренним не статическим классам нужен закрытый экземпляр, поэтому их конструктор получает дополнительный аргумент (при компиляции). Вот почему он жалуется на отсутствие конструктора с нулевым аргументом. В этом случае наиболее подходящим я считаю объявление LogCollection как «public static class», чтобы сделать его не связанным с типом окружения. Или напрямую переместите его в новый файл. Причина, по которой удаляется поле 'private LogCollection ... ', заключается в том, что GWT понимает, что он не нуждается в подтипе и игнорирует его. – helios

+0

правда, но, как кажется, он также подходит, но если я напишу «реализует Serializable», GWT больше не жалуется, поэтому статичный и реализует также существенно, чтобы не жаловаться. Странно, не так ли? – czupe

ответ

7

Эта ошибка:

subtype com.client.rpc.ItemRecRpc.LogCollection is not default instantiable

говорит, что она не может создавать и экземпляр LogCollection по умолчанию. И это правда. Поскольку для создания экземпляра LogCollection вам сначала нужно иметь экземпляр ItemRecRpc. Объявление LogCollection в качестве статического класса должно было помочь.

В принципе, если вы хотите отправить какой-либо объект по gwt-rpc, все классы, используемые в качестве полей в таком объекте, по умолчанию должны быть экземплярами. (например, никаких специальных трюков для его создания, просто новый и пустой конструктор). Также вы можете определить настраиваемый сериализатор полей для любого класса, который может быть создан по умолчанию.

+0

Отличный ответ, спасибо за это. Решена моя проблема. (я пробовал со статикой, но было так много проекта, а не строил правильный:/facepalm :(но теперь, как вы сказали мне, я концентрирую и перестраиваю соответствующие проекты, и это хорошо!) – czupe

+0

ok test, it и last комментарий был неудачным :(все еще есть одно и то же сообщение, действительно странно, может быть, это seriulsy проблема GWT ... и вы не можете сделать подкласс в любом классе реализует seriazable ... Я пытаюсь перебраться с этой ошибкой ... «общественный класс LogCollection статического» – czupe

+0

Ok Может быть, это решение:. «общественный статический класс LogCollection реализует Serializable» не только должны быть статичными, но нужно реализуют Seriazable Aswell ... действительно странно, что в это, поскольку я знаю, что подкласс класса Serializable реализует также Serializable (без добавления явного), но не в GWT, как я вижу ... Действительно странно ... Но в этом было, со статическими и реализующими ключевые слова, нет сообщения об ошибке ... – czupe

Смежные вопросы