如何正确地为Map<字符串,对象>



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

我想对于地图<String,String>下面是正确的实现:

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<字符串,对象>

你不能。因为您无法将Object序列化为Parcel。如果问题中的Objectimplements 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);
}
}

HOWEVER:您不需要这样做,因为Parcel类已经知道如何序列化和取消序列化Map,前提是键是String,值是"已知"对象类型(包括SerializableParcelable(。所以你可以这样做:

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(获取"已知"对象类型的列表。

注意:如果您在Map上调用Parcel.getValue(),您将始终获得HashMap。安卓对此很愚蠢,并假设所有Map都是HashMap

相关内容

  • 没有找到相关文章

最新更新