Erreur AndroidRuntime: Parcel: impossible de marshaler la valeur

109

J'essaie de transmettre un HashMap à une nouvelle activité en utilisant la fonction intent.puExtra. En parcourant le débogueur, il semble qu'il ajoute le HashMap sans problème, mais lorsque startActivty () est appelé, j'obtiens une erreur d'exécution indiquant que Parcel: impossible de marshaler la valeur com.appName.Liquor.

Liquor est une classe personnalisée que j'ai créée, et je pense que cela, en combinaison avec un HashMap, est à l'origine du problème. Si je passe une chaîne plutôt que mon HashMap, il charge l'activité suivante sans problème.

Activité principale

lv.setOnItemClickListener(new OnItemClickListener() {
   public void onItemClick(AdapterView<?> parent, View view,
      int position, long id) {

      String cat = ((TextView) view).getText().toString();
      Intent i = new Intent(OhioLiquor.this, Category.class);
      i.putExtra("com.appName.cat", _liquorBase.GetMap());
      startActivity(i);

Classe d'alcool

public class Liquor
{
public String name;
public int code;
public String category;

private HashMap<String, Bottle> _bottles;

public Liquor()
{
    _bottles = new HashMap<String, Bottle>();
}

public void AddBottle(Bottle aBottle)
{
    _bottles.put(aBottle.size, aBottle);
}
}

Sous-activité

public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);

    HashMap<Integer, Liquor> map = (HashMap<Integer, Liquor>)getIntent().getSerializableExtra("com.appName.cat");

    setListAdapter(new ArrayAdapter<String>(this, R.layout.list_item, GetNames(map)));

    ListView lv = getListView();
    lv.setTextFilterEnabled(true);

Lorsque l'erreur d'exécution existe, elle n'est jamais intégrée à la sous-classe d'activité. Je suis donc à peu près sûr que le problème existe dans l'ajout du HashMap à l'intention, et sur la base de l'erreur, je crois que ma classe d'alcool en est la cause, mais je ne peux pas comprendre pourquoi.

Votre aide sera très appréciée. Merci!

Jared
la source

Réponses:

274

Le vôtre HashMapest sérialisable mais la Bottleclasse est-elle sérialisable? Sinon, il ne sérialisera pas et générera des erreurs lors de l'exécution. Faire en sorte que la Bottleclasse implémente l' java.io.Serializableinterface

Naikus
la source
5
Merci, j'ai dû ajouter des outils Serializable aux classes Liqueur et Bouteille.
Jared
2
ça marche .. Je dois implémenter Serializable dans la classe Bottle. Merci @naikus
Ashokchakravarthi Nagarajan
177
L'alcool est toujours à blâmer :))
Cezar Alexandru Vancea
3
A travaillé pour moi :)
Jacky
1
Cela fonctionne, mais je ne comprends pas ce que la sérialisation a à voir avec cela? Android continue-t-il de sérialiser et de désérialiser périodiquement des objets? Et dans quels cas dois-je implémenter l'interface Serializable (comme ici)?
Reeshabh Ranjan