快捷搜索:  as  2018  FtCWSyGV  С˵  test  xxx  Ψһ  w3viyKQx

188金宝搏亚洲体育与真人:Java对象序列化所引起的循环引用的思考



在Java中的模型关系设计中,轮回的关系是很常见的,分外是ORM的呈现,关系的轮回加倍有利于掩护各自的状态。但便是这种轮回的关系,在java工具序列化时,弗成避免的会导致轮回引用(Cycle Reference)的问题。

导致CycleReference的环境

照样举个例子吧(代码措辞):一个很范例,很常见的双向引用的工具关系。

@Entity

public class C188金宝搏亚洲体育与真人ompan188金宝搏亚洲体育与真人y{

@Id

@Column(....)

private String id;

@OneToMany(....)

private Employee employee;

//setters/getters

......

}

@Entity

public class Employee{

@Id

@Column(....)

private String id;

@ManyToOne

private Company company;

//setters/getters

......

}

别的一种导致这个问题的环境是,多个工具间关系形成一条回路,跟电学有点像。(详细就不举例了,在模型设计时,最好照样避免呈现这种环境。)

导致这种问题的缘故原由

用jaxb(假如没有特殊解释,本文采纳的都是jaxb)序列化Company时,无疑会发生轮回引用。

当序列化引擎解析Company时188金宝搏亚洲体育与真人,它发明这个工具持有一个Employee的引用,转而去骚扰Employee.解析Employee时,发明他又持有Company的引用,又转回Company.如斯问题孕育发生。

引擎它并不知道在碰到轮回引用问题时,该怎么处置惩罚,它只是忠厚得按照固定的算法去履行义务。以是我们得让引擎智慧点,我们得让引擎碰到这种问题有处置惩罚机制。

办理问题

既然必要引擎更智慧,那就没法子,就得烧喷鼻拜佛,盼望制造商的产品扩展性足够好,斟酌了足够多的环境。

幸运的是,jaxb供给了有这种扩展。(CycleRecoverable接口)

行军接触(例子先行):(将以上的例子改下)

@Entity

public class Company implements CycleRecoverable{

@Id

@Column(....)

private String id;

@OneToMany(....)

private Employee employee;

//当碰到轮回引用时,用temp替代this,返给jaxb解析。

public Object onCycleDetected(Context arg0) {

Company temp = new Company ();

temp.setId(id);

return temp;

}

//setters/getters

......

}

@Entity

public class Employee implements CycleRecoverable{

@Id

@Column(....)

private String id;

@ManyToOne

private Company compan188金宝搏亚洲体育与真人y;

public Object188金宝搏亚洲体育与真人 onCycleDetected(Context arg0) {

Employee temp = new Employee();

temp.setId(id);

return temp;

}

//setters/getters

......

}

留意到onCycleDetected措施便是一个回调措施,当碰到轮回引用时,jaxb引擎会调用这个措施,用return工具来调换this.以是在这个历程中,就可以将引起轮回引用问题的关系断开,返回给jaxb.

当然Company和Employee工具没需要整个实现CycleRecoverable接口,然则拿到现实的模型图中去,谁也包管不了他们不跟其余工具有轮回的关系存在。是以照样建议大年夜家把模型都实现这个接口,也好一劳永逸。

您可能还会对下面的文章感兴趣: