我还没有找到关于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
。如果问题中的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);
}
}
HOWEVER:您不需要这样做,因为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(获取"已知"对象类型的列表。
注意:如果您在Map
上调用Parcel.getValue()
,您将始终获得HashMap
。安卓对此很愚蠢,并假设所有Map
都是HashMap
。