Enfoque para serializar la clase de modelo de punto final de nube en el sistema de archivos Android

He creado con éxito un modelo de punto final de nube que permite una fácil recuperación de información de App Engine. Para reducir los ida y vuelta y proporcionar una experiencia de usuario más rápida, he identificado una instancia que deseo almacenar en el almacenamiento local.

En el resto de mi aplicación, estoy usando ObjectInputStream para leer y escribir los objetos como:

FileInputStream fis = context.openFileInput("PRIVFILE"); ObjectInputStream ois = new ObjectInputStream(fis); AppModelState s = (AppModelState) ois.readObject(); 

Obviamente, esto requiere que todos los miembros de datos implementen la interfaz Serializable. La clase Model extiende GenericJSON y no es "Serializable", como

  public final class ModelClass extends GenericJson {} 

Podría crear manualmente un objeto serializable que mapea al modelo; Sin embargo, eso parece muy aficionado debido al número de atributos.

La otra alternativa que consideré fue la creación de un envoltorio Serializable objeto que simplemente tiene la cadena JSON como un miembro y proporciona un setter / getter aceptar la ModelClass como parámetros, tales como:

 class AppModelState implements Serializable { private String modelClassJSON; public ModelClass getModelClass() { // generate a new ModelClass from the JSON } public void setModelClass(ModelClass c) { // extract the JSON for storage } ..... } 

Siento que debe haber una mejor manera y esto debería haber sido resuelto una docena de veces, pero no estoy encontrando ningún recurso. Proporcione sus comentarios.

Creo que hacer serialización estándar de Java de las clases que se utilizarán con Endpoints no funciona muy bien. El problema es que la serialización es binaria, y HTTP comm es cadena.

Si usted estuviera haciendo el comm del HTTP usted mismo, más bien que usando extremos, pienso que usted tendría el mismo problema. Para enviar el objeto serializarlo (convirtiendo los miembros de una cadena en binario) y luego tendrías que convertir el binario de nuevo en cadena.

Por lo tanto, si la cantidad de datos que está utilizando no es demasiado, probablemente sería más fácil para almacenar sus objetos como JSON.

Estoy haciendo exactamente lo mismo que usted dice en su pregunta.

Dado que los objetos Cloud Endpoints ya están serializados para ser transmitidos a través del cable, también son serializables para ser almacenados localmente. Como un bono adicional, con Android 3.0 o posterior, ni siquiera necesita importar cualquier biblioteca – ya está allí! Por ejemplo:

 import com.google.api.client.extensions.android.json.AndroidJsonFactory; import com.google.api.client.json.GenericJson; import com.google.api.client.json.JsonFactory; private static final JsonFactory JSON_FACTORY = new AndroidJsonFactory(); public void putObject(String key, Object value) throws Exception { byte[] outputbytes = null; if (value instanceof GenericJson) { outputbytes = JSON_FACTORY.toByteArray(value); } else { ByteArrayOutputStream output = new ByteArrayOutputStream(); ObjectOutputStream objectstream = new ObjectOutputStream(output); objectstream.writeObject(value); objectstream.close(); outputbytes = output.toByteArray(); } // persist "outputbytes" ... } public <T> T getObject(String key, Class<T> outclass) throws Exception { // retrieve saved bytes... byte[] valuebytes = ... if (valuebytes[0] == '{' && valuebytes[1] == '"' && valuebytes[valuebytes.length-1] == '}') { // Looks like JSON... return JSON_FACTORY.fromString(new String(valuebytes, "UTF-8"), outclass); } else { ByteArrayInputStream input = new ByteArrayInputStream(valuebytes); ObjectInputStream objectstream = new ObjectInputStream(input); Object value = objectstream.readObject(); objectstream.close(); return outclass.cast(value); } } 

Tenga en cuenta que el AndroidJsonFactory predeterminado (como de Android v4.3, de todos modos) es bastante lento al serializar cadenas largas. Cree un nuevo JacksonFactory en su lugar si tiene problemas de rendimiento. Todo lo demás se queda igual.

Actualización: Si desea serializar una lista de objetos GenericJson, sólo tiene que crear un objeto GenericJson que incluya una lista de esos objetos. Por ejemplo:

 import com.google.api.client.json.GenericJson; import com.google.api.client.util.Key; public static class PersistantJson extends GenericJson { @Key public int one; @Key public String two; } public static class PersistantJsonList extends GenericJson { @Key public List<PersistantJson> list = new ArrayList<PersistantJson>(); } 

Ahora puede agregar todos los objetos PersistantJson (es decir, alguna clase creada por "generate cloud client") al elemento .list de una variable PersistantJsonList y luego pasar esa variable a putObject() . Tenga en cuenta que esto requiere que todos los objetos de la lista sean de la misma clase para que la deserialización sepa cuál es el tipo (porque la serialización JSON no registra el tipo). Si utiliza List<Object> entonces lo que se lee de nuevo es List<Map<String, Object>> y tendrá que extraer los campos manualmente.

Esto parece ser una cuestión abierta.

La palabra clave final nos impide extender la clase y hacerla Serializable para que podamos intercambiar los objetos devueltos por los EndPoints de Cloud entre actividades. Por lo tanto, la solución de subclase sugerida no puede funcionar en este caso.

¿Alguien sabe otra solución por favor?

  • Problemas de serialización de RealmList (Realm / Gson / Intent)
  • Parcelable encontrado IOException writing serializable object getactivity ()
  • Serializar / deserializar un LinkedHashMap (android) java
  • ¿Cómo puedo hacer una petición Volley JSONObject con un objeto personalizado como parámetro?
  • ¿Cómo puedo serializar un RealmObject a JSON en Realm for Java?
  • Leer / escribir un objeto en un archivo
  • ¿Cuál es la mejor manera de guardar el contenido de una ArrayList?
  • Serialización de Java - deserialización de Android
  • ¿Cuál es la mejor manera de serializar una imagen (compatible con Swing) de Java a Android?
  • Serialización de objetos para una nueva actividad
  • Proguard mantener a los miembros de la clase
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.