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.
No estoy seguro Entiendo ese comentario: con 'Serializable' no tiene que depender del mecanismo predeterminado. Siempre puede definir el suyo con 'readFields()' et al. –
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
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 –