2016-09-12 44 views
0

我們有一個非常困難的錯誤。 equals - 我們的域對象DomainOrder中的方法實施錯誤。問題是,我們的客戶使用域對象。所有舊版本。所以客戶也必須更新。java序列化|更改服務器端的域對象實現

客戶端與服務器通過RMI(JEE-6)

我們必須儘快修復它溝通,但有太多的客戶。所以我們的想法是在服務器端暫時修復問題暫時。但我不確定它會起作用。

當前形勢下,我們的結果Set只包含一個對象,導致equals回報true針對不同的對象:

[...] 
List<DBOrder> list = orderService.getOrders(criteria); 
Set<DomainOrder> orders = new HashSet<>(); 
for(DBOrder dborder : list){ 
    orders.add(convertDBOrderToDomain(dborder)); // mapping new DomainOrder(..) 
} 
[...] 

我將如何修復它在服務器端:

List<DBOrder> list = orderService.getOrders(criteria); 
Set<DomainOrder> orders = new HashSet<>(); 
for(DBOrder dborder : list){ 
    final DomainOrder domainOrder = convertDBOrderToDomain(dborder); 

    // temp fix for all old versions. 
    orders.add(new DomainOrder(){ 

     private DomainOrder delegate = domainOrder ; 

     @Override 
     public Long getId(){ 
      return delegate.getId(); 
     } 
     [...] 

     @Override 
     public boolean equals(){ 
      return [fix]; 
     } 

    }); 
} 

那麼你是什麼認爲它會起作用嗎?該iImportant目標是:

  1. 客戶將獲得所有訂單
  2. 客戶將獲得結果的反序列化任何錯誤。

我希望有一些自己的Java序列化經驗,RMI可以幫助我。

回答

0

重要的目標是:

  1. 客戶將獲得所有訂單

這只是你如何重新實現equals()的問題。

  1. 客戶端在反序列化結果時不會出現錯誤。

這就要求您不要更改類關注的serialVersionUID。如果它沒有,請在之前從serialver工具中獲取它。

+0

是的,我會使用相同的'serialVersionUID' – dit

+0

但客戶端會得到新的equals實現還是會使用他自己的舊的'DomainOrder'? – dit

+1

@dit客戶端將在他的類路徑中獲得該類的任何版本。除非您已經在使用代碼庫功能,否則RMI無法幫助您。 – EJP