Intereting Posts
Цикл всех «виджетов» / элементов в действии Как нарисовать рисунок на холсте при перетаскивании пальцев Мобильные приложения для мобильных телефонов и контроль версий и обновления Android – LocationManager vs FusedLocation android.database.CursorIndexOutOfBoundsException Можно ли запустить службу с помощью ярлыка? Кроутон + РаздвижныеМеню перекрываются Расширение приложения голосовой записи Android Издевательствование введенного поля в модульных тестах Libgdx – IllegalStateException в неизвестном месте Как получить «нижнюю» гравитацию, работающую над возможностью рисования в xml «Префикс« xliff »для элемента« xliff: g »не связан» Последнее обновление по включению и отключению мобильных данных программно Повторное использование объекта просмотра Android – предотвращение появления старого размера, когда View reappears Android EditText maxLength позволяет пользователю вводить больше

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.