2010-05-23 13 views
5

Quindi voglio passare una LinkedHashMap a un intent.serialize/deserialize a 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"); 

Questo ha funzionato come un fascino con HashMap. Ma con LinkedHashMap Ho un problema ho ottenuto un errore di runtime qui

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

ottengo alcun errore con HashMap.

Ho anche ricevuto un avviso "Tipo sicurezza: cast non selezionato da serializzabile a LinkedHashMap" Ma ho ricevuto anche questo avviso con HashMap. Tutte le idee.Qualsiasi aiuto è molto apprezzato

Inoltre ho appena visto questo. https://issues.apache.org/jira/browse/HARMONY-6498

+0

pls vedono la mia risposta alla tua domanda iniziale di un'alternativa al LinkedListHashMap – mdma

+0

AFAIK ... che risposta non è pertinente a questa domanda che è in realtà sui tipi generici. –

+0

Quale errore di runtime ottieni? Per favore includi lo stacktrace. –

risposta

4

La radice del problema qui è che si sta provando a digitare il cast in un tipo generico. Questo non può essere fatto senza cast di tipo non sicuro/non controllato.

I tipi di runtime di tipi generici sono tipi non elaborati; cioè tipi in cui i tipi effettivi dei parametri del tipo non sono noti. In questo caso il tipo di runtime sarà LinkedHashMap<?, ?>. Questo non può essere tranquillamente convertito in typgate in LinkedMashMap<String, String> perché il sistema di runtime non ha modo di sapere che tutte le chiavi e i valori sono in realtà delle istanze String.

Sono disponibili due opzioni:

  • Si potrebbe aggiungere un'annotazione per dire al compilatore di "shut up" sul cast incontrollato. Questo è un po 'rischioso. Se per qualche motivo una delle chiavi o dei valori non è in realtà una stringa, l'applicazione potrebbe in un secondo momento ottenere uno ClassCastException in un posto totalmente inatteso; per esempio. mentre itera i tasti o assegna il risultato di un get.

  • Si potrebbe copiare manualmente il deserialised Map<?, ?> in una nuova LinkedMashMap<String, String>, colata in modo esplicito ogni chiave e valore a String.

UPDATE

A quanto pare la vera causa del eccezione di runtime (da non confondersi l'errore di compilazione "non sicuro typecast") è che Android sta passando il serializedExtra tra intenti come un normale HashMap piuttosto che usare la classe Map che hai fornito. Questo è descritto qui:

Come spiega Q & A, non esiste una soluzione semplice. Se si desidera passare una mappa preservando l'ordine delle chiavi, sarà necessario convertire la mappa in una matrice di coppie e passare quella. Dall'altra parte, sarà quindi necessario ricostruire la mappa dall'array passato.

+0

bene l'annotazione che dice alla compilazione di stare zitto ma non risolve il problema. Ricevo un avviso non un errore. L'errore i get è in runtime e non è in grado di capire perché. È un'eccezione di classe in utils.LinkedHashMap.java Seconda risposta che non risolve il problema. Il problema è che LinkedHashMap non può essere serializzato per qualche motivo Ma spesso per la tua risposta e il tempo che hai impiegato per scriverlo – weakwire

+1

La tua domanda riguarda un avvertimento del compilatore e la mia risposta ti dice 2 modi per gestire l'avviso del compilatore . Se si ottengono ANS anche errori di runtime, dovresti averlo detto nella domanda ... e dovresti anche fornire la traccia dello stack. A differenza di Jon Skeet, non posso leggerti nella tua mente. –

+0

Sono molto dispiaciuto. Hai ragione sto guardando questo troppo a lungo ora.Scusami di nuovo ho appena modificato il mio primo post – weakwire

2

LinkedHashMap fa implementare l'interfaccia Map, qui è la definizione del codice sorgente:

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

Il seguente test sta lavorando bene, quindi penso che il problema che hai non è correlato 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

apparentemente non in alcune versioni di Harmony. (Questo è un bug, ovviamente.) –

Problemi correlati