为什么序列化对象中的HashMap、HashSet或HashTable等集合不能包含对象自身的引用
2014-05-21 15:07
816 查看
如果一个被序列化的对象中,包含有HashMap、HashSet或HashTable集合,则这些集合中不允许保存当前被序列化对象的直接或间接引用。因为,这些集合类型在反序列化的时候,会调用到当前序列化对象的hashCode方法,而此时(序列化对象还未完全加载)计算出的hashCode有可能不正确,从而导致对象放置位置错误,破坏反序列化的实例。
示例:
class Super implements Serializable
{
final Set<Super> set = new HashSet<Super>();
}
finalclassSub extends Super
{
privateintid;
public Sub(int id)
{ this.id = id;
set.add(this); //集合中引用了当前对象
}
publicvoid checkInvariant()
{ if(!set.contains(this))
{ thrownew AssertionError("invariant violated");
}
}
publicint hashCode()
{ returnid;
}
publicboolean equals(Object o)
{ return(o instanceof Sub) && (id== ((Sub) o).id);
}
}
这个例子中,将当前对象(Sub对象)放入了对象中的HashSet中,在反序列化set时,因为id属性还未完成初始化,导致hashCode的结果为0,从而导致Sub对象在set中的位置放置错误,对象被破坏。
示例:
class Super implements Serializable
{
final Set<Super> set = new HashSet<Super>();
}
finalclassSub extends Super
{
privateintid;
public Sub(int id)
{ this.id = id;
set.add(this); //集合中引用了当前对象
}
publicvoid checkInvariant()
{ if(!set.contains(this))
{ thrownew AssertionError("invariant violated");
}
}
publicint hashCode()
{ returnid;
}
publicboolean equals(Object o)
{ return(o instanceof Sub) && (id== ((Sub) o).id);
}
}
这个例子中,将当前对象(Sub对象)放入了对象中的HashSet中,在反序列化set时,因为id属性还未完成初始化,导致hashCode的结果为0,从而导致Sub对象在set中的位置放置错误,对象被破坏。
相关文章推荐
- 【c++】为什么类的定义中不能包含其自身类型,但是能包含其自身的指针或引用类型
- 为什么类的定义中不能包含其自身类型,但是能包含其自身的指针或引用类型
- 为什么类的定义中不能包含自身类型,而可以包含其自身的指针类型和引用类型
- 为什么类的定义中不能包含其自身类型,但是能包含其自身的指针或引用类型
- 为什么C++类定义中,数据成员不能被指定为自身类型,但可以是指向自身类型的指针或引用?为什么在类体内可以定义将静态成员声明为其所属类的类型呢 ?
- 为什么C++类定义中,数据成员不能被指定为自身类型,但可以是指向自身类型的指针或引用?
- Linq to SQL 类型的对象图包含循环,如果禁用引用跟踪,择无法对其进行序列化。
- 黑马程序员 java 基础 毕向东 面向对象 集合框架 Map HashTable HashMap TreeMap
- 为什么static成员的类型可以是类本身?又为什么非static成员被限定声明为其自身类对象的指针或引用?
- hashtable,concurrenthashmap为什么键和值不能为null,而hashmap可以?
- 类的定义中不能包含其自身类型,但是能包含其自身的指针和引用类型
- excel2007出现"对象库无效或包含对不能找到的对象定义的引用"
- 各种集合小结:arrayList和linkedList,Vector;hashmap和hashtable,hashset,
- 为什么C++中的类不能定义自身类的对象,而java可以? 【转载】
- 为什么static成员的类型可以是类本身?又为什么非static成员被限定声明为其自身类对象的指针或引用?
- 为什么C++中的类不能定义自身类的对象,而java可以
- 为什么C++类定义中,数据成员不能被指定为自身类型,但可以是指向自身类型的指针或引用?
- 集合框架(HashSet,HashMap,HashTable)
- 关于集合hashtable,hashmap,hashset,treemap,treeset的几点简单
- 为什么临时对象(变量)不能初始化非const引用对象(变量)