Intereting Posts
Как импортировать проект библиотеки eclipse из проекта github в android studio? Имеет ли yieldIfContendedSafely () личную выгоду от транзакции? Пользовательская плотность экрана на эмуляторе Android Запуск камеры при нажатии кнопки в android По умолчанию FirebaseApp не инициализирован Ошибка TelephonyManager.getLine1Number ()? RelativeLayout не отображает все кнопки Время обработки OpenCV Mat Каков прецедент для ContextCompat.checkSelfPermission? Как создать круговой индикатор выполнения (круговая диаграмма), как индикатор – Android Android: Как программно подключить Bluetooth-устройства? Являются ли приложения разработаны с использованием сторонних инструментов разработки мобильных приложений, приемлемых для их соответствующих рынков? Как запретить прокрутку списка списка вверху после использования setAdapter Отслеживание использования нескольких виджетов приложений отдельно Исключение, возникающее при рендеринге: View android.support.v7.widget.Toolbar не создан с правильным контекстом

GWT и Android. Ошибка сериализации Enum

У меня отлично работает приложение GWT. Теперь я пытаюсь использовать gwt-syncproxy для создания Android-клиента, который может просто повторно использовать код на стороне сервера.

До сих пор все работало отлично. Единственная проблема, которую я могу найти, – это когда я запускаю RPC для метода, ожидающего перечисление в качестве параметра.

Перечисление выглядит примерно так:

 import java.io.Serializable; import com.google.gwt.user.client.rpc.IsSerializable; public enum ReferenceTable implements IsSerializable, Serializable { basetable, othertable; ReferenceTable(){} } 

Сообщение об ошибке, которое я получаю:

 com.google.gwt.user.client.rcp.IncompatibleRemoteServiceException: Invalid type signature for package.ReferenceTable 

Что предполагает, что это проблема, связанная с сериализацией.

Я попытался использовать различные комбинации IsSerializable и Serializable и всегда очищал проект перед развертыванием. Как приложение GWT, так и приложение для Android используют один и тот же код для типов данных, используемых для связи.

Кто-нибудь есть идея, как это решить? Если ничего не работает, я мог бы воздержаться от использования перечислений, но я бы предпочел использовать их. Тем более, что все работает на сам сервер-клиент GWT.


BTW: Ошибка на стороне сервера:

 Caused by: com.google.gwt.user.client.rpc.SerializationException: Invalid type signature for some.package.ReferenceTable at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamReader.validateTypeVersions(ServerSerializationStreamReader.java:1116) at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamReader.deserialize(ServerSerializationStreamReader.java:610) at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamReader.readObject(ServerSerializationStreamReader.java:567) at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamReader$ValueReader$8.readValue(ServerSerializationStreamReader.java:140) at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamReader.deserializeValue(ServerSerializationStreamReader.java:425) at com.google.gwt.user.server.rpc.RPC.decodeRequest(RPC.java:312) ... 24 more 

EDIT :

Я создал примерное приложение GWT и пример приложения для Android, поэтому люди действительно могут попробовать код:

  • Часть GWT
  • Часть Android

Чтобы развернуть приложение, просто измените файл build.properties а затем запустите build.xml как скрипт ant. В приложении MainActivity приложения Android измените URL-адрес, чтобы указать на приложение GWT.

Я не могу проверить вашу проблему, как описано (используя предоставленный src, он работает в моей среде dev с использованием JB-эмулятора), хотя я видел вашу указанную ошибку во время разработки библиотеки Android. Я обнаружил, что многие из проблем «Сериализации» в GWT обычно являются чем-то маленьким, например, несериализуемыми типами членов, отсутствующими интерфейсами, конструкторами по умолчанию и т. Д. Поскольку, похоже, вы уже обращались к этим возможностям, пожалуйста, проверьте следующее:

Версия GWT используется в веб-приложении на вашем компьютере. Версия ОС Android тестируется (эмулятор или устройство) и какое устройство при необходимости.

Хотя я не ожидаю, что это будет проблемой, библиотека Android скомпилирована с помощью GWT 2.5.0 src, поэтому возможно (еще непроверенная теория), что если сервер работает с GWT, отличным от 2.5.0, сериализация RPC не работает благодаря этому.

Это также объясняет, почему работает настольный клиент, а в андроидной библиотеке нет. Библиотека syncproxy для настольных клиентов компилируется против GWT, а не с GWT, поэтому вы связываете свою версию GWT во время компиляции. Библиотека Android была скомпилирована непосредственно с кодом GWT src для версии 2.5.0 с несколькими пользовательскими переопределениями, чтобы уменьшить размер библиотеки, которая будет использоваться и управляема в среде Dalvik.

Тем не менее, если это возможно для вашего проекта, попробуйте использовать GWT 2.5.0, очистите / перекомпилируйте и дайте этот снимок. Если нет, то в моем списке задач, чтобы получить библиотеку до 2.5.1, но у меня еще не было времени.

Отказ от ответственности: я создал соответствующую библиотеку Android в качестве вкладчика проекта gwt-syncproxy. Я не могу утверждать, что понимаю все входы и выходы GWT или внутренних компонентов syncproxy, но, по крайней мере, достаточно, чтобы рабочая модель библиотеки была функциональной. Я открыт для предложений об улучшении библиотеки или каких-либо идей о том, где во внутренних деталях мы должны смотреть, чтобы разрешить это, если какой-нибудь gwt-гуру там …

Удалите декларацию интерфейса IsSerializable, начиная с:

 public enum ReferenceTable implements IsSerializable, Serializable 

Для того, чтобы:

 public enum ReferenceTable implements Serializable 

Просто, если ваше приложение является чисто GWT, вы должны использовать интерфейс IsSerializable, но в этом случае вы хотите использовать тот же код с Android-приложением, вы должны использовать только интерфейс Serializable.