如何为Map <string,object =“”>正确编写Parcelable实现?

时间:2018-11-07 13:42:49

标签: android parcelable

我还没有找到关于stackoverflow的正确答案,并且对如何为Map实现正确的Parcelable实现感到困惑。

我想下面的Map 是正确的实现:

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);
  }
}

但是Map 呢?

1 个答案:

答案 0 :(得分:1)

不能。因为您无法将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,前提是密钥是{{ 1}},并且该值是“已知”对象类型(包括StringSerializable)。因此,您可以执行以下操作:

Parcelable

有关“已知”对象类型的列表,请参见https://developer.android.com/reference/android/os/Parcel.html#writeValue(java.lang.Object)

注意::如果您在public void writeToParcel(Parcel out, int flags){ out.writeValue(map); } private MyParcelable(Parcel in){ map = (Map)in.readValue(getClass().getClassLoader()); } 上致电HashMap,则会得到Parcel.getValue()。 Android对此很愚蠢,并假设所有Map都是Map