GWT + Сериализация - PullRequest
       10

GWT + Сериализация

2 голосов
/ 09 февраля 2012

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

 [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;
    }
.
.
.
}

Когда я комментирую строку "private 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 Ответ

7 голосов
/ 09 февраля 2012

Эта ошибка:

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

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

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

...