Java对象序列化所引起的循环引用的思考 解决问题 既然需要引擎更聪明,那就没办法,就得烧香拜佛,希望制造商的产品扩展性足够好,考虑了足够多的情况。 幸运的是,jaxb提供了有这种扩展。(CycleRecoverable接口) 行军打仗(例子先行):(将以上的例子改下) @Entity public class Company implements CycleRecoverable{ @Id @Column(…) private String id; @OneToMany(…) private Employee employee; //当遇到循环引用时,java培训用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 company; public Object onCycleDetected(Context arg0) { Employee temp = new Employee(); temp.setId(id); return temp; } //setters/getters …… } 注意到onCycleDetected方法就是一个回调方法,当遇到循环引用时,jaxb引擎会调用这个方法,用return对象来替换this.所以在这个过程中,就可以将引起循环引用问题的关系断开,返回给jaxb. 当然Company和Employee对象没必要全部实现CycleRecoverable接口,但是拿到现实的模型图中去,谁也保证不了他们不跟别的对象有循环的关系存在。因此还是建议大家把模型都实现这个接口,也好一劳永逸。

评论