У меня есть класс общих пакетов GWT следующим образом:
public class MyCustomClass extends TreeSet<MyCustomType> implements Serializable, IsSerializable {
// ... a whole bunch of methods
}
Я пытаюсь отправить экземпляр класса как объект, инкапсулированный в другой класс, через RPC.
Проблема заключается в TreeSet
, поскольку GWT отказывается сериализовать его, независимо от того, что я делаю. Во время выполнения я получаю сообщение об ошибке:
SEVERE: my-service: при обработке этого вызова было вызвано исключение IncompatibleRemoteServiceException. com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException: java.lang.ClassNotFoundException: http: at com.google.gwt.user.server.rpc.RPC.decodeRequest(RPC.java:323)
Итак, у меня есть все предварительные требования к сериализации (конструктор по умолчанию, никакие конечные поля, геттеры и сеттеры, все мои переменные экземпляра сериализуемы, реализуют интерфейсы и т.д.), Но это продолжается.
Дело в том, что, когда я переключаюсь с TreeSet
на использование ArrayList
, все работает нормально. По-моему, это связано с тем, что я уже использую ArrayList
в ряде сервисов, поэтому GWT знает, чтобы их белый список в политике сериализации.
Это понимание возникло из-за этой темы. И я попробовал предложенное решение из принятого ответа (создаю "фиктивный" сервис и разместил TreeSet
там, я даже создал фиктивный класс в своем клиентском пакете и поместил TreeSet
в качестве поля), но не повезло.
Я на всякий случай проверил свой.gwt.xml, TreeSet
не добавлен как исключение сериализации.
Таким образом, я в значительной степени застрял в этой точке, моим обходным путем является использование ArrayList и переупаковка в переходный набор, но мне не очень нравится этот подход.
Любая помощь будет высоко оценен.
(с использованием GWT 2.6)
Обновление: MyCustomType
реализует интерфейс Comparable<MyCustomType>
, и в TreeSet
нет настраиваемого компаратора.
Может быть, MyCustomType
не реализует java.lang.Comparable
Он отлично работает для ArrayList<MyCustomType>
но не для TreeSet<MyCustomType>
--РЕДАКТИРОВАТЬ--
HashSet<MyCustomType>
или LinkedHashSet<MyCustomType>
работают нормально.
После получения данных на стороне клиента просто используйте
new TreeSet<MyCustomType>(<retured HashSet<MyCustomType>)
Нет необходимости повторять его, потому что он упорядочен <Comparable<MyCustomType>
.