Как правильно написать реализацию Parcelable для карты <String, Object>? - PullRequest
0 голосов
/ 07 ноября 2018

Я не нашел правильного ответа о потоке стека на том же уровне и запутался в том, как добиться правильной реализации Parcelable для карты.

Полагаю, для карты ниже правильная реализация:

public void writeToParcel(Parcel out, int flags){
  out.writeInt(map.size());
  for(Map.Entry<String,String> entry : map.entrySet()){
    out.writeString(entry.getKey());
    out.writeString(entry.getValue());
  }
}

private MyParcelable(Parcel in){
  //initialize your map before
  int size = in.readInt();
  for(int i = 0; i < size; i++){
    String key = in.readString();
    String value = in.readString();
    map.put(key,value);
  }
}

А как же Карта ?

1 Ответ

0 голосов
/ 07 ноября 2018

Вы не можете. Потому что вы не можете сериализовать Object в Parcel. Если Object в вопросе implements Parcelable, то вы можете сделать что-то вроде этого:

public void writeToParcel(Parcel out, int flags){
  out.writeInt(map.size());
  for(Map.Entry<String,Parcelable> entry : map.entrySet()){
    out.writeString(entry.getKey());
    entry.getValue().writeToParcel(out, flags);
  }
}

private MyParcelable(Parcel in){
  //initialize your map before
  int size = in.readInt();
  for(int i = 0; i < size; i++){
    String key = in.readString();
    Parcelable value = in.readParcelable(getClass().getClassLoader());
    map.put(key,value);
  }
}

ОДНАКО: Вам не нужно этого делать, потому что класс Parcel уже знает, как сериализовать и десериализовать Map, при условии, что ключ является String, а значение «известный» тип объекта (включает Serializable и Parcelable). Так что вы можете просто сделать это:

public void writeToParcel(Parcel out, int flags){
    out.writeValue(map);
}


private MyParcelable(Parcel in){
    map = (Map)in.readValue(getClass().getClassLoader());
}

См. https://developer.android.com/reference/android/os/Parcel.html#writeValue(java.lang.Object) для списка "известных" типов объектов.

ПРИМЕЧАНИЕ: Вы всегда получите HashMap, если вы позвоните Parcel.getValue() на Map. Android глуп по этому поводу и предполагает, что все Map s HashMap s.

...