estoy serializar un HashMap en mi aplicación de PC usando el siguiente código:HashMap Problemas Deserialización en Android
private void serialize(HashMap<Integer, Integer> map2write, String name_ser)
{// serializes fphlist into .ser file called name_ser
FileOutputStream fileOut = null;
try {
fileOut = new FileOutputStream(project_dir + "/" + name_ser + ".ser");
} catch (FileNotFoundException ex) {
Logger.getLogger(AdminConsoleUI.class.getName()).log(Level.SEVERE, null, ex);
}
ObjectOutputStream out;
try {
out = new ObjectOutputStream(fileOut);
out.writeObject(map2write);
out.reset();
out.flush();
out.close();
fileOut.close();
} catch (IOException ex) {
Logger.getLogger(AdminConsoleUI.class.getName()).log(Level.SEVERE, null, ex);
}
}
Entonces estoy de-serializar en mi aplicación para Android con este código:
private HashMap<Integer,Integer> deserialize_Map(String fn)
{// deserializes fn into HashMap
HashMap<Integer,Integer> hm = new HashMap<Integer,Integer>();
try
{
FileInputStream fileIn = new FileInputStream(project_dir + "/" + fn + ".ser");
ObjectInputStream in = new ObjectInputStream(fileIn);
hm = (HashMap<Integer,Integer>) in.readObject();
in.close();
fileIn.close();
}catch(IOException i)
{
Log.e("MYAPP", "exception", i);
return null;
}catch(ClassNotFoundException c)
{
Log.e("MYAPP", "exception", c);
return null;
}catch(ClassCastException ex)
{
Log.e("MYAPP", "exception", ex);
return null;
}
return hm;
}
Al final, estoy enfrentando dos problemas.
1) La deserialización lleva mucho tiempo. Contiene alrededor de miles de claves, ¿es normal? ¿Hay un método de serialización más eficiente para abordar eso?
2) Después de la deserialización, obtengo un hashmap que ocupa casi el doble del tamaño que originalmente ocupaba en VM y cuando lo controlo en el depurador, tiene muchas entradas nulas entre los valores clave que originalmente debería contener. Sin embargo, no son claves nulas sino simplemente nulas y no puedo ver lo que hay dentro de ellas. Yo depuro en Eclipse. ¿Por qué sucedería?
Gracias, esto realmente ayuda. Nunca supe que podía jugar con los parámetros de HashMap. Especificar un factor de carga y capacidad durante la inicialización ayudará con esto. – Erol
Me preguntaba si puedo crear un HashMap antes de la deserialización y si tengo el método readObject, use ese HashMap específico para escribir. ¿Tiene alguna idea? – Erol
intente cargar un hashMap grande para que haya reservado el espacio antes de HashMap myMap = new HashMap (numberOfElements * 2) ;. Si eso no funciona, puedes intentar hacerlo con LinkedHashMap. Si recuerdo bien, también tuve algunos problemas y LinkedHashMap deserial fue más rápido en Android (no tiene ningún sentido, pero mis tiempos eran sólidos). También puedes probar eso –
weakwire