2010-05-27 9 views
12

Estoy buscando consejos para acelerar el rendimiento de serialización, específicamente cuando se usa Google Android. Para un proyecto en el que estoy trabajando, estoy tratando de transmitir un par de cientos de objetos desde un servidor a la aplicación de Android, y estoy pasando por varias etapas para obtener el rendimiento que necesito.Serialization Performance y Google Android

Primero probé un terrible analizador XML que pirateé utilizando Scanner específicamente para este proyecto, y que causó un rendimiento increíblemente lento al cargar los objetos (~ 5 minutos para un archivo de 300 KB). Luego me alejé de eso e hice que mis clases implementaran Serializable y escribí ArrayList de los objetos que tenía en un archivo. Al leer ese archivo en los objetos, el Android, con el archivo ya descargado, te tomará ~ 15-30 segundos para el archivo serializado de ~ 100KB. Todavía encuentro esto completamente inaceptable para una aplicación de Android, ya que mi aplicación requiere cargar los datos al iniciar la aplicación.

He leído brevemente acerca de Externalizable y cómo puede aumentar el rendimiento, pero no estoy seguro de cómo se implementa con las clases anidadas. En este momento, estoy tratando de almacenar una ArrayList de la siguiente clase, con las clases anidadas debajo de ella.

public class MealMenu implements Serializable{ 
private String commonsName; 
private long startMillis, endMillis, modMillis; 
private ArrayList<Venue> venues; 
private String mealName; 
} 

Y la clase Lugar:

public class Venue implements Serializable{ 
private String name; 
private ArrayList<FoodItem> foodItems; 
} 

Y la clase FoodItem:

public class FoodItem implements Serializable{ 
private String name; 
private boolean vegan; 
private boolean vegetarian; 
} 

SI Externalizable es el camino a seguir para aumentar el rendimiento, ¿hay alguna información en cuanto a la forma en java llama a los métodos en los objetos cuando intentas escribirlos? No estoy seguro de si necesito implementarlo en la clase padre, ni cómo voy a serializar los objetos anidados dentro de cada objeto.

Respuesta

10

Nunca use Serializable across architectures. No tiene forma de saber si la VM Dalvik tendrá serialización compatible con la versión de Java de su servidor. Incluso si funciona hoy, podría no con actualizaciones en ninguno de los extremos. Elija siempre algo diseñado específicamente para trabajar en arquitecturas.

Las opciones incluyen:

  • Protocol Buffers
  • Apache Thrift (el embalaje de carga útil, no necesariamente las cosas RPC)
  • XML (que no mencionó lo que utilizó analizador - si se ha utilizado DOM , tratar SAX)
  • JSON (se dice que el analizador JSON Jackson es más rápido que el analizador org.json integrado en Android)

Además, cargar 300K de datos en el inicio de la aplicación es una receta para problemas. Considere aprovechar SQLite para permitirle trabajar con solo los bits de datos que necesita a la vez.

+0

No estoy seguro Entiendo ese comentario: con 'Serializable' no tiene que depender del mecanismo predeterminado. Siempre puede definir el suyo con 'readFields()' et al. –

+1

Y supone que esos campos están codificados de manera consistente en todas las arquitecturas. La serialización está diseñada para el almacenamiento de una máquina individual, no en máquinas, ni mucho menos en los conjuntos de chips y los autores de máquinas virtuales. – CommonsWare

+0

Cambié a una base de datos SQLite como sugirió, y los tiempos de carga para la aplicación son drásticamente mejores. Sin embargo, poblar la base de datos aún requiere una gran cantidad de tiempo. Con el diseño de la base de datos actual, agregamos ~ 3000 filas cuando llenamos la base de datos, así como cuando agregamos contenido nuevo.~ 2500 a una mesa, ~ 500 a otra y ~ 150 a una tercera. ¿Hay algo que podríamos estar haciendo mal en este sentido? Tardaría probablemente al menos un minuto en agregar las filas a la base de datos. Lo único que me viene a la mente es rediseñar el uso de nuestra base de datos, así que no necesitamos tantos –