2015-01-12 19 views
0

我寫了一些通用的bean轉換,一起使用來轉換一個複雜的bean。有時輸入bean具有雙向參考,並且轉換器陷入無限循環。我該如何管理?如何使用雙向引用轉換bean?

例如輸入是一個與B bean有關的bean,而B bean與A實例有關係。當轉換的目的開始時,B轉換器調用到B場轉換成A,並在轉換B對象的轉換器,調用到一個字段轉換在B類,如你所知,在無限的轉換器陷阱循環。考慮關係圖具有兩個以上節點的bean之間更復雜的關係。

如何在轉換器中避免這種無限遞歸?

+2

使用'IdentityHashMap'保持到對象的引用已經轉變,轉變的新對象,如果它不是已經在它之前在'IdentityHashMap'檢查。 –

+1

@fardjad'IdentityHashMap'不使用'hashCode()'和'equals()'。 –

回答

1

對象物件編號形成

A -------> B 
^--- C <---' 

當序列化到XML,JSON或類似的,你正在建設一個。由於樹是網絡的一種簡單形式,因此不能簡單地將其中一個複製到另一箇中。

A 
'--> B 
    '--> C 
      '--> A (recursion alarm!) 
       '--> ... 

一個共同的解決辦法是

  • 或者停止序列化,一旦檢測到遞歸(只跟蹤那些已經序列化的所有對象的)

    A 
    '--> B 
        '--> C 
    
  • 或,當檢測到遞歸時,在序列化樹中添加一個存根引用到另一個節點。節點的唯一標識符是必需的。

    A(1) 
    '--> B(2) 
        '--> C(3) 
          '--> Stub that links to (1) 
    

存儲已經序列化對象的技術細節:

  • 使用HashSet看起來方便,因爲它不包含重複的 - 但是,因爲它需要hashCodeequals方法都項目這通常是不使用鑰匙,IdentityHashMap可以用一個好主意
  • ,它將COMPA重新使用==鍵不包含重複
  • 但因爲你平時檢查集合已經包含之前將其添加到項目,您還可以使用ArrayList使用此代碼:collection.stream().anyMatch(x -> x == key)