2010-05-23 17 views
5

Así que quiero pasar un LinkedHashMap a un intento.serialize/deserialize un LinkedHashMap (android) java

//SEND THE MAP 
Intent singlechannel = new Intent(getBaseContext(),singlechannel.class); 
singlechannel.putExtra("db",shows1);//perase to 
startActivity(singlechannel); 

//GET THE MAP 
LinkedHashMap<String,String> db = new LinkedHashMap<String,String>(); 
db=(LinkedHashMap<String,String>) getIntent().getSerializableExtra("db"); 

This one Worked Like a charm with HashMap. Pero con LinkedHashMap tengo un problema tengo un error de ejecución aquí

db=(LinkedHashMap<String,String>) getIntent().getSerializableExtra("db"); 

consigo ningún error con HashMap.

También recibí una advertencia "Tipo de seguridad: descarte sin marcar de Serializable a LinkedHashMap" Pero también tuve esta advertencia con HashMap. Cualquier idea. Cualquier ayuda es muy apreciada

También acabo de ver esto. https://issues.apache.org/jira/browse/HARMONY-6498

+0

pls ver mi respuesta a su pregunta original de una alternativa a LinkedListHashMap – mdma

+0

yo sepa ... que la respuesta no es relevante para esta pregunta que es realmente acerca de los tipos genéricos. –

+0

¿Qué error de tiempo de ejecución está obteniendo? Por favor incluye la stacktrace. –

Respuesta

4

La raíz del problema aquí es que está tratando de escribir cast a un tipo genérico. Esto no puede hacerse sin un tipo de yeso inseguro/sin marcar.

Los tipos de tiempo de ejecución de los tipos genéricos son tipos crudos; es decir, tipos en los que no se conocen los tipos reales de los parámetros de tipo. En este caso, el tipo de tiempo de ejecución será LinkedHashMap<?, ?>. No se puede convertir de forma segura en LinkedMashMap<String, String> porque el sistema de tiempo de ejecución no tiene forma de saber que todas las claves y valores son en realidad instancias String.

Usted tiene dos opciones:

  • Se podría añadir una anotación para indicar al compilador que "se calle" sobre el reparto sin marcar. Esto es un poco arriesgado Si por alguna razón una de las claves o valores no es realmente una Cadena, su aplicación puede obtener más tarde un ClassCastException en un lugar totalmente inesperado; p.ej. al iterar las teclas o al asignar el resultado de get.

  • Se puede copiar manualmente el Map<?, ?> deserialised en una nueva LinkedMashMap<String, String>, fundición explícitamente cada clave y el valor de String.

ACTUALIZACIÓN

Al parecer la causa real de la excepción de tiempo de ejecución (a diferencia del error de compilación "encasillado inseguro") es que Android está pasando el serializedExtra entre las intenciones como regular HashMap en lugar de utilizar la clase Map que proporcionó. Esto se describe aquí:

Como dice Q & A, no hay una solución simple. Si desea pasar un mapa preservando el orden de las teclas, tendrá que convertir el mapa a una matriz de pares y pasarlo. En el otro extremo, necesitarás reconstruir el mapa de la matriz pasada.

+0

bien sobre la anotación le dice a la compilación que se calle pero no resuelve el problema. Recibo una advertencia, no un error. El error get es en tiempo de ejecución y no puede entender por qué. Es una excepción de clase en utils.LinkedHashMap.java La segunda respuesta no resuelve el problema de nuevo. El problema es que LinkedHashMap no se puede serializar por algún motivo Pero estoy muy agradecido por su respuesta y el tiempo que tardó en escribirlo – weakwire

+1

Su pregunta es acerca de una advertencia del compilador y mi respuesta le indica 2 maneras de lidiar con esa advertencia del compilador . Si TAMBIÉN está obteniendo errores de tiempo de ejecución, debería haberlo dicho en la pregunta ... y también debe proporcionar el seguimiento de la pila. A diferencia de Jon Skeet, no puedo leer tu mente. –

+0

Lo siento mucho. Tienes razón, estoy buscando esto por mucho tiempo. Lo siento otra vez Acabo de editar mi primera publicación – weakwire

2

LinkedHashMap hace implementar la interfaz del mapa, aquí es la definición del código fuente:

public class LinkedHashMap<K,V> 
    extends HashMap<K,V> 
    implements Map<K,V> 

La siguiente prueba está funcionando muy bien, así que creo que el problema que tiene no está relacionado LinkedHashMap.

Map<String, String> map = new LinkedHashMap<String, String>(); 
     map.put("1", "one"); 
     FileOutputStream fos = new FileOutputStream("c://map.ser"); 
     ObjectOutputStream out = new ObjectOutputStream(fos); 
     out.writeObject(map); 
     out.close(); 


     FileInputStream fin = new FileInputStream("c://map.ser"); 
     ObjectInputStream in = new ObjectInputStream(fin); 
     Map<String, String> map2 = (Map<String, String>) in.readObject(); 
     System.out.println(map2); 
+0

aparentemente no lo hace en algunas versiones de Harmony. (Eso es un error, por supuesto) –

Cuestiones relacionadas