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

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

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

    廉頗老矣,尚能飯否

    java:從技術到管理

    常用鏈接

    統(tǒng)計

    最新評論

    java對象序列化所引起的循環(huán)引用的思考[轉載]

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


    導致CycleReference的情況

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

     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


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

    導致這種問題的原因

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

    解決問題

    既然需要引擎更聰明,那就沒辦法,就得燒香拜佛,希望制造商的產品擴展性足夠好,考慮了足夠多的情況。
    幸運的是,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    //當遇到循環(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方法就是一個回調方法,當遇到循環(huán)引用時,jaxb引擎會調用這個方法,用return對象來替換this。所以在這個過程中,就可以將引起循環(huán)引用問題的關系斷開,返回給jaxb。
    當然Company和Employee對象沒必要全部實現CycleRecoverable接口,但是拿到現實的模型圖中去,誰也保證不了他們不跟別的對象有循環(huán)的關系存在。因此還是建議大家把模型都實現這個接口,也好一勞永逸。

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



    當一個類實現了序列化接口,有時會遇到 java.io.InvalidClassException 異常出現:
    java.io.InvalidClassException: com.test.Test; local class incompatible: stream classdesc serialVersionUID = 7981560250804078637, local class serialVersionUID = -8334405535174160822
    這是序列化兼容性所致;
    java通過一個名為UID(stream unique identifier)來控制,這個UID是隱式的,它通過類名,方法名等諸多因素經過計算而得,理論上是一一映射的關系,也就是唯一的。如果UID不一樣的話,就無法實現反序列化了,并且將會得到InvalidClassException。
    當要人為的產生一個新的版本(實現并沒有改動),而拋棄以前的版本的話,可以通過顯式的聲名UID來實現:
    private static final long serialVersionUID=????;//(你可以編造一個UID,但不能有重復)

    對于上例我們可以在com.test.Test類中加入 :
    private static final long serialVersionUID=7981560250804078637l;
    這樣就解決了新老版本的兼容性問題。
    當然,對于序列化還有很多問題,慢慢研究吧。


    柳德才
    13691193654
    18942949207
    QQ:422157370
    liudecai_zan@126.com
    湖北-武漢-江夏-廟山

    posted on 2009-01-14 13:10 liudecai_zan@126.com 閱讀(1587) 評論(0)  編輯  收藏 所屬分類: 在路上

    主站蜘蛛池模板: 8090在线观看免费观看| 女人裸身j部免费视频无遮挡| CAOPORN国产精品免费视频| 国产一级理论免费版| 亚洲人成未满十八禁网站| 成人毛片18女人毛片免费96| 亚洲午夜精品在线| 曰批全过程免费视频在线观看| 亚洲综合激情另类小说区| 在线看片免费人成视久网| 亚洲欧洲国产综合| 最新猫咪www免费人成| 亚洲中文字幕无码久久2020| 午夜私人影院免费体验区| 亚洲精品无码mⅴ在线观看| 大香人蕉免费视频75| 亚洲精品久久久久无码AV片软件| 热久久精品免费视频| 暖暖免费中文在线日本| 国产精品久久久亚洲| 免费观看无遮挡www的视频| 亚洲色中文字幕在线播放| 青青青国产色视频在线观看国产亚洲欧洲国产综合 | 成年男女免费视频网站| 国产亚洲男人的天堂在线观看| 免费人妻无码不卡中文字幕18禁| 一级午夜a毛片免费视频| 亚洲av永久无码精品国产精品| 91短视频在线免费观看| 亚洲午夜成人精品无码色欲| 免费人成网站在线播放| 免费视频成人手机在线观看网址| 亚洲欧洲校园自拍都市| 国产美女无遮挡免费视频网站| 精品国产污污免费网站入口| 亚洲国产精品综合一区在线| 波多野结衣中文一区二区免费| 秋霞人成在线观看免费视频 | 亚洲精品自产拍在线观看动漫| 99久久99这里只有免费费精品| 亚洲av纯肉无码精品动漫|