2012-05-16 9 views
5

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?

Respuesta

3

1) ¿Cuál es el tamaño del HashMap "normal" en el tamaño de la VM? No creo que sea otra solución (si hay alguien que nos muestre) para ese problema. Puede intentar compartir una sqlite o algo así. Si te gusta colaborar qué estás tratando de resolver podemos proponer técnicas que hacen el trabajo más rápido

actualización

Usted puede intentar inicializar el mapa en el inicio a, como usted sugiere, con una gran capacidad si se conoce el tamaño HashMap<Integer,Integer> hm = new HashMap<Integer,Integer>(SIZE*2);

para el 2. de here

Una instancia de HashMap tiene dos parámetros que afectan a su rendimiento: capacidad inicial y fac carga colina. La capacidad es el número de segmentos en la tabla hash, y la capacidad inicial es simplemente la capacidad en el momento en que se crea la tabla hash. El factor de carga es una medida de cuán completa está permitida la tabla hash antes de que su capacidad aumente automáticamente. Cuando el número de entradas en la tabla hash es superior al producto del factor de carga y la capacidad actual, la capacidad se duplicó aproximadamente llamando al método refrito

+0

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

+0

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

+0

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

4

¿Ha intentado serializar el HashMap a un objeto JSON? Android tiene un soporte bastante bueno para deserializar JSON de un archivo.

+0

Gracias. Parece una buena alternativa a la serialización estándar. Lo consideraré si no tendré éxito con la solución de weakwire. – Erol