GWT y Android. Problema de serialización de Enum

Tengo una aplicación GWT que funciona perfectamente. Ahora estoy tratando de usar gwt-syncproxy para crear un cliente de Android que puede simplemente reutilizar el código del lado del servidor.

Hasta ahora todo funcionaba perfectamente. El único problema que puedo encontrar es cuando comienzo RPC a un método que espera un enum como parámetro.

El enum se parece a esto:

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

El mensaje de error que recibo es:

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

Lo que sugiere que es un problema relacionado con la serialización.

Intenté usar diferentes combinaciones de IsSerializable y Serializable y siempre IsSerializable el proyecto antes de desplegar. Tanto la aplicación GWT como la aplicación Android utilizan el mismo código para los tipos de datos utilizados para la comunicación.

¿Alguien tiene una idea de cómo resolver esto? Si nada más funciona, podría abstenerse de usar enums, pero prefiero usarlos. Especialmente, puesto que todo funciona para la propia comunicación cliente-servidor GWT.


BTW: El error en el lado del servidor es:

 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 :

Creé una aplicación GWT de ejemplo y una aplicación de Android de ejemplo, para que la gente pueda probar el código:

  • Parte GWT
  • Parte de Android

Para implementar la aplicación, modifique el archivo build.properties y ejecute build.xml como un script de hormigas. En MainActivity de la aplicación de Android, modifique la URL para que apunte a la aplicación de GWT.

2 Solutions collect form web for “GWT y Android. Problema de serialización de Enum”

No puedo verificar el problema como se describe (usando su src proporcionado, que funciona en mi entorno dev con un emulador JB), aunque he visto el error especificado durante el desarrollo de la biblioteca de Android. He descubierto que muchos de los problemas de "serialización" en GWT suelen ser algo pequeño, como tipos de miembros unserializable, interfaces que faltan, constructores predeterminados, etc. Puesto que parece que ya ha abordado esas posibilidades, compruebe lo siguiente:

Versión de GWT que se utiliza en la aplicación web en su máquina. Android OS versión que se está probando en (emulador o dispositivo) y qué dispositivo, si procede.

Aunque no espero que sea un problema, la librería de Android se compila con GWT 2.5.0 src, por lo que es posible (una teoría aún no probado) que si el servidor está ejecutando GWT que no sea 2.5.0, la serialización RPC está fallando debido a eso.

Esto también explicaría por qué el cliente de escritorio funciona y la biblioteca de Android no. La biblioteca de sincronización de cliente de escritorio se compila contra GWT, no con GWT, por lo que enlaza su versión de GWT en tiempo de compilación. La librería de Android se compiló directamente con código GWT src para 2.5.0 con algunas exclusiones personalizadas con el fin de reducir el tamaño de la biblioteca para ser utilizable y manejable en el entorno de Dalvik.

Dicho esto, si es posible para su proyecto, trate de usar GWT 2.5.0, limpiar / recompilar y darle una oportunidad. Si no, está en mi lista de tareas para obtener la biblioteca hasta 2.5.1, pero no he tenido tiempo todavía.

Descargo de responsabilidad: he creado la librería de Android en cuestión como contribuyente al proyecto gwt-syncproxy. No puedo afirmar que entiendo todos los entresijos de GWT o los internos de syncproxy, pero por lo menos lo suficiente para obtener el modelo de trabajo de la biblioteca funcional. Estoy abierto a sugerencias sobre la mejora de la biblioteca o cualquier idea de dónde en los internos debemos buscar para resolver esto si cualquier gwt-guru está ahí fuera …

Elimine la declaración de interfaz IsSerializable, de:

 public enum ReferenceTable implements IsSerializable, Serializable 

A:

 public enum ReferenceTable implements Serializable 

Sólo si su aplicación es puramente GWT debe utilizar la interfaz IsSerializable, pero, en este caso, desea utilizar el mismo código con una aplicación de Android, sólo tiene que utilizar la interfaz Serializable.

  • Filtro ListActvity para ArrayAdapter personalizado
  • android error: No se pudo leer los descriptores del archivo de canal de entrada desde el paquete
  • ¿Puede el SDK de Android trabajar con JDK 1.7?
  • System.getProperty ("line.separator") Vs "\ n" para Android
  • java.lang.VerifyError: com / crashlytics / android / core / CrashlyticsCore
  • Biblioteca de soporte de Android: getDrawable independiente si vector o no
  • Responder a llamadas de teléfono Android de PC por bluetooth
  • ¿Cómo iniciar la aplicación de Android desde la URL en android?
  • Prueba de punto dentro del polígono en Android
  • ¿Cómo obtener un notificador de aplicación PERMANENTE en la barra de estado?
  • Repoblando valores en Android Fragment onResume
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.