<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Kevin.Zhong

    彪悍的人生不需要解釋,彪悍的代碼不需要測試。

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      17 隨筆 :: 12 文章 :: 14 評論 :: 0 Trackbacks

      在Java中的模型關(guān)系設(shè)計中,循環(huán)的關(guān)系是很常見的,特別是ORM的出現(xiàn),關(guān)系的循環(huán)更加有利于維護各自的狀態(tài)。但就是這種循環(huán)的關(guān)系,在java對象序列化時,不可避免的會導(dǎo)致循環(huán)引用(Cycle Reference)的問題。


    導(dǎo)致CycleReference的情況

      
     還是舉個例子吧(代碼說話):一個很典型,很常見的雙向引用的對象關(guān)系。

     1@Entity
     2
     3public class Company{
     4
     5    @Id
     6
     7    @Column(.)
     8
     9    private String id;
    10
    11    @OneToMany(.)
    12
    13    private Set<Employee> employee = new HashSet<Employee>();
    14
    15    //setters/getters
    16
    17    
    18
    19}

    20
    21@Entity
    22
    23public class Employee{
    24
    25    @Id
    26
    27    @Column(.)
    28
    29    private String id;
    30
    31    @ManyToOne
    32
    33    private Company company;
    34
    35    //setters/getters
    36
    37    
    38
    39}

    40
    41


    另外一種導(dǎo)致這個問題的情況是,多個對象間關(guān)系形成一條回路,跟電學(xué)有點像。(具體就不舉例了,在模型設(shè)計時,最好還是避免出現(xiàn)這種情況。)

    導(dǎo)致這種問題的原因

    用jaxb(如果沒有特殊解釋,本文采用的都是jaxb)序列化Company時,無疑會發(fā)生循環(huán)引用。
    當(dāng)序列化引擎解析Company時,它發(fā)現(xiàn)這個對象持有一個Employee的引用,轉(zhuǎn)而去騷擾Employee。解析Employee時,發(fā)現(xiàn)他又持有Company的引用,又轉(zhuǎn)回Company。如此問題產(chǎn)生。
    引擎它并不知道在遇到循環(huán)引用問題時,該怎么處理,它只是忠實得按照固定的算法去執(zhí)行任務(wù)。所以我們得讓引擎聰明點,我們得讓引擎遇到這種問題有處理機制。

    解決問題

    既然需要引擎更聰明,那就沒辦法,就得燒香拜佛,希望制造商的產(chǎn)品擴展性足夠好,考慮了足夠多的情況。
    幸運的是,jaxb提供了有這種擴展。(CycleRecoverable接口)
    行軍打仗(例子先行):(將以上的例子改下)

     1@Entity
     2
     3public class Company implements CycleRecoverable{
     4
     5    @Id
     6
     7    @Column(.)
     8
     9    private String id;
    10
    11    @OneToMany(.)
    12
    13    private Set<Employee> employee = new HashSet<Employee>();
    14
    15    //當(dāng)遇到循環(huán)引用時,用temp替代this,返給jaxb解析。
    16
    17    public Object onCycleDetected(Context arg0) {
    18
    19        Company temp = new Company ();
    20
    21        temp.setId(id);
    22
    23        return temp;
    24
    25    }

    26
    27    //setters/getters
    28
    29    
    30
    31}

    32
    33@Entity
    34
    35public class Employee implements CycleRecoverable{
    36
    37    @Id
    38
    39    @Column(.)
    40
    41    private String id;
    42
    43    @ManyToOne
    44
    45    private Company company;
    46
    47    public Object onCycleDetected(Context arg0) {
    48
    49        Employee temp = new Employee();
    50
    51        temp.setId(id);
    52
    53        return temp;
    54
    55    }

    56
    57  //setters/getters
    58
    59    
    60
    61}

    62
    63


    注意到onCycleDetected方法就是一個回調(diào)方法,當(dāng)遇到循環(huán)引用時,jaxb引擎會調(diào)用這個方法,用return對象來替換this。所以在這個過程中,就可以將引起循環(huán)引用問題的關(guān)系斷開,返回給jaxb
    當(dāng)然Company和Employee對象沒必要全部實現(xiàn)CycleRecoverable接口,但是拿到現(xiàn)實的模型圖中去,誰也保證不了他們不跟別的對象有循環(huán)的關(guān)系存在。因此還是建議大家把模型都實現(xiàn)這個接口,也好一勞永逸。

    希望大家得到了想要的東西。
    Thanks

    posted on 2009-01-05 11:17 Kevin.Zhong 閱讀(3013) 評論(4)  編輯  收藏 所屬分類: rest

    評論

    # re: java對象序列化所引起的循環(huán)引用的思考 2009-01-06 09:11 yeshucheng
    這個就是所謂的對象圖序列化吧  回復(fù)  更多評論
      

    # re: java對象序列化所引起的循環(huán)引用的思考 2009-01-06 09:16 Kevin.Zhong
    @yeshucheng
    是的,如果需要將模型推向前臺,序列化模型是很常見的做法。  回復(fù)  更多評論
      

    # re: java對象序列化所引起的循環(huán)引用的思考 2009-01-06 09:30 congdepeng@126.com

    我可以引用這句話嗎
    彪悍的人生不需要解釋,彪悍的代碼不需要注釋。
      回復(fù)  更多評論
      

    # re: java對象序列化所引起的循環(huán)引用的思考 2009-01-06 12:41 Kevin.Zhong
    @congdepeng@126.com
    我改了,彪悍的代碼不需要測試。哈哈。  回復(fù)  更多評論
      


    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 国产成人亚洲合集青青草原精品| 亚洲av午夜成人片精品电影| 亚洲精品中文字幕无乱码| 黄网站免费在线观看| 亚洲深深色噜噜狠狠爱网站| 久久久WWW免费人成精品| 中文亚洲成a人片在线观看| 黄床大片免费30分钟国产精品| 亚洲乱码中文字幕综合234 | va亚洲va日韩不卡在线观看| 亚洲狠狠色丁香婷婷综合| 日本免费一区尤物| 色多多免费视频观看区一区| 免费在线视频一区| 国产日韩AV免费无码一区二区 | 亚洲国产成人久久综合碰碰动漫3d| 日日麻批免费40分钟无码| 亚洲精品视频久久| 啦啦啦在线免费视频| 免费人成网上在线观看| 亚洲精品午夜国产VA久久成人| 无码人妻久久一区二区三区免费 | 中文无码亚洲精品字幕| 国产精品免费_区二区三区观看| 国产精品亚洲专一区二区三区| 狠狠色婷婷狠狠狠亚洲综合| 久久久久国产精品免费看| 亚洲成_人网站图片| 亚洲欧洲久久久精品| 2015日韩永久免费视频播放| 亚洲第一成年网站视频| 亚洲精品午夜无码电影网| 18禁超污无遮挡无码免费网站国产| 国产成人亚洲综合a∨| 久久精品亚洲视频| 四虎成人免费大片在线| 久久综合九色综合97免费下载| 亚洲男人天堂2018av| 亚洲日韩中文字幕在线播放| 免费观看成人毛片a片2008| 精品一区二区三区免费视频|