2010-05-23 13 views
5

Więc chcę przekazać LinkedHashMap do intencji.serializować/deserializować 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"); 

Ten działał jak urok z HashMap. Ale z LinkedHashMap mam problem mam błąd tutaj wykonawczego

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

mam żadnego błędu z HashMap.

Dostałam też ostrzeżeniem „Bezpieczeństwo typu: Nieograniczony odlana z serializable LinkedHashMap” ale miałem to ostrzeżenie z HashMap też. Wszelkie pomysły. Każda pomoc jest bardzo cenna.

Po prostu to zobaczyłem. https://issues.apache.org/jira/browse/HARMONY-6498

+0

pls zobaczyć moją odpowiedź do oryginalnego pytanie alternatywy do LinkedListHashMap – mdma

+0

AFAIK ... że odpowiedź nie jest istotne dla tej kwestii, która jest faktycznie o typach generycznych. –

+0

Jakich błędów runtime dostałeś? Dołącz ślad stosu. –

Odpowiedz

4

Źródłem problemu jest to, że próbujesz wpisać rzut na typ ogólny. Nie można tego zrobić bez rzucania niebezpiecznego/niezaznaczonego typu.

Typy wykonawcze typów ogólnych to typy nieprzetworzone; tj. typy, w których rzeczywiste typy parametrów typu nie są znane. W tym przypadku typem środowiska wykonawczego będzie LinkedHashMap<?, ?>. Nie można w ten sposób bezpiecznie typować do wersji LinkedMashMap<String, String>, ponieważ system środowiska wykonawczego nie ma możliwości sprawdzenia, czy wszystkie klucze i wartości są w rzeczywistości instancjami String.

Masz dwie opcje:

  • Można dodać adnotację, aby poinformować kompilator „shut up” o niesprawdzony obsady. To trochę ryzykowne. Jeśli z jakiegoś powodu jeden z kluczy lub wartości w rzeczywistości nie jest łańcuchem, aplikacja może uzyskać później w niezapowiedzianym miejscu; na przykład podczas iteracji kluczy lub przypisywania wyniku do get.

  • Można ręcznie skopiować deserialised Map<?, ?> do nowego LinkedMashMap<String, String> wyraźnie odlewania każdy klucz i wartość String.

UPDATE

Podobno prawdziwą przyczyną wyjątkiem wykonawczego (w odróżnieniu od „niebezpieczne typecast” błąd kompilacji) jest to, że Android jest przepuszczenie serializedExtra między zamiarów jako zwykły HashMap zamiast używać podaną klasę Map. Jest to opisane tutaj:

Jak wyjaśnia Q &A, nie ma prostego rozwiązania. Jeśli chcesz przekazać mapę zachowującą kolejność kluczy, musisz przekonwertować mapę na tablicę par i przekazać ją. Z drugiej strony będziesz musiał zrekonstruować mapę z podanej tablicy.

+0

dobrze o adnotacji mówi kompilacji, aby zamknąć, ale nie rozwiązuje problemu. Otrzymuję ostrzeżenie, a nie błąd. Błąd i get jest w środowisku uruchomieniowym i nie może naprawdę zrozumieć dlaczego. Jest to wyjątek klasy w utils.LinkedHashMap.java 2. odpowiedź nie rozwiązuje problemu ponownie. Problem polega na tym, że LinkedHashMap nie może być serializowany z jakiegoś powodu. Ale bardzo zależy ci na twojej odpowiedzi i czasie, jaki zrobiłeś, aby go napisać. – weakwire

+1

Twoje pytanie dotyczy ostrzeżenia kompilatora, a moja odpowiedź informuje o 2 sposobach uporania się z ostrzeżeniem dla kompilatora . Jeśli masz również problemy z błędami środowiska wykonawczego, powinieneś powiedzieć to w pytaniu ... i powinieneś również podać ślad stosu. W przeciwieństwie do Jona Skeeta nie mogę czytać w twoich myślach. –

+0

Bardzo mi przykro. Masz rację, szukam tego zbyt długo. Znowu zmieniłem właśnie mój pierwszy wpis – weakwire

2

LinkedHashMap robi zaimplementować interfejs mapę, tutaj jest definicja z kodu źródłowego:

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

Poniższy test działa dobrze, więc myślę, że problem masz nie jest związane 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

widocznie nie w niektórych wersjach Harmony. (To oczywiście błąd.) –