java序列化|在服务器端更改域对象实现

时间:2016-09-12 08:24:06

标签: java java-ee serialization rmi

我们遇到了一个非常难的问题。我们的域对象equals中的DomainOrder - 方法实现错误。问题是,域对象由我们的客户使用。所有旧版本。所以客户也必须更新。

客户端通过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. 客户端在反序列化结果时不会出错。
  3. 我希望有一些拥有java序列化和RMI经验的人可以帮助我。

1 个答案:

答案 0 :(得分:0)

  

重要目标是:

     
      
  1. 客户将获得所有订单
  2.   

这只是你重新实现equals()的问题。

  
      
  1. 客户端在反序列化结果时不会出错。
  2.   

这要求您不要更改相关课程的serialVersionUID。如果没有,请在之前从serialver工具中获取它。