尝试取消选中ConcurrentHashMap时出现ClassCastException

时间:2015-02-09 11:22:12

标签: android serialization classcastexception parcelable parcel

使用ConcurrentHashMap和androids parcel机制时,我遇到了一些奇怪的行为。

我的情况是,我有一个ConcurrentHashMap,它在某些时候被包含了。我按照推荐的方式将它序列化为Bundle,然后将包写入parcel:

ConcurrentHashMap<String, CustomClass> concurrentMap = new ConcurrentHashMap<>();

...

@Override
public void writeToParcel ( Parcel dest, int flags ) {      
    Bundle map = new Bundle(1);
    map.putSerializable("map", concurrentMap);
    dest.writeBundle(map);
}

我稍后会检索它:

public void readFromParcel ( Parcel in ) {

    Bundle map = in.readBundle(CustomClass.class.getClassLoader());
    concurrentMap = (ConcurrentHashMap<String, CustomClass>) map.getSerializable("map");  
}

ClassCastException 在尝试将检索到的地图强制转换回ConcurrentHashMap时在最后一行发生。 由于HashMap和ConcurrentHashMap都实现了Serializable接口并扩展了AbstractMap,因此我不太了解这个问题。

有人经历过这个或者可以解释这个问题吗?

1 个答案:

答案 0 :(得分:2)

好的,所以这不是解释,但至少有一个快速解决方案。我不喜欢它,但它有效。

因为&#39; getSerializable()&#39;以某种方式将我的ConcurrentHashMap视为普通的HashMap,我暂时使用HashMap来获取ConcurrentHashMap。

 HashMap<String, CustomClass > tempMap = (HashMap<String, CustomClass >) map.getSerializable("map");
 concurrentMap = new ConcurrentHashMap<>(tempMap);