设为首页 | 加入收藏

中国计算机、电脑领域培训门户
中国计算机培训网首页 otrain.cn
  资讯中心: 职业新闻    考试资讯    考试认证        培训班中心: 网络工程培训    软件工程培训    创意设计培训    网站技能培训    软件应用培训    电脑硬件培训
  计算机论文        网上辅导        考试交友社区        城市分站: 北京    深圳    广州    杭州    合肥    重庆    上海    石家庄    苏州    天津    武汉    无锡    厦门    昆明
  • 您的位置 中国计算机培训网 >> 培训信息 >> 网络工程 >> Java对象序列化所引起的循环引用的思考
  • Java对象序列化所引起的循环引用的思考

  • 我要发布招生信息  进入建筑考试论坛交流经验
  • 地点:
    学费:育路网
    在Java中的模型关系设计中,循环的关系是很常见的,特别是ORM的出现,关系的循环更加有利于维护各自的状态。但就是这种循环的关系,在java对象序列化时,不可避免的会导致循环引用(Cycle Reference)的问题。
      导致CycleReference的情况
      还是举个例子吧(代码说话):一个很典型,很常见的双向引用的对象关系。
      @Entity
      public class Company{
      @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时,它发现这个对象持有一个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 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接口,但是拿到现实的模型图中去,谁也保证不了他们不跟别的对象有循环的关系存在。因此还是建议大家把模型都实现这个接口,也好一劳永逸。
  • Atrain.CN求学登记卡片 - 免费登记(报名/咨询),您可以在此直接完成网上报名,或预约我们的专业咨询人员回答您的疑问。请填写并提交下面的表格,留下至少一种有效的联系方法,该学校的招生人员会尽快与您取得联系。
    为了能及时给您解答回复,请务必请写您的真实信息,谢谢合作!
    您的联系方式仅供招生学校与您联络用,不会对外公布,请放心填写。
    操作方式: 确认报名   我要咨询
    真实姓名:  *
    性别:
    所在城市:  *
    报名人数:  *
    电话:  *
    E-mail:
    其他联系方式:
    咨询留言: (最多500字)
        

  •  
  • 上一篇:09年北京MCSE微软系统工程师培训班(6月13日开课)
    下一篇:带宽延时如何产生的?如何有效地计算?
  • 相关文章
Copyright 2007-2008    OTrain.cn  All Rights Reserved. 中国计算机培训网    版权所有  不得转载
主办:北京锐筑科技有限公司    电话:010-83688336    83688436    83033283    传真:010-83688336
中文域名:培训.网络    Email:sxying@gmail.com    MSN:sun.xueying@hotmail.com
中国计算机培训网    中国网络工程培训网    中国软件培训网     中国电脑培训网
          京ICP备09034455号