java连载 |在服务器端更改域对象实现

java serialisation | change domain object implementation on server side

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

客户端通过 RMI (JEE-6) 与服务器通信

我们必须尽快修复它,但是客户太多了。所以我们的想法是暂时在服务器端解决这个问题。但我不确定它是否有效。

当前情况,我们的结果 Set 只包含一个对象,导致 equals returns 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 方面有经验的人可以帮助我。

The important goals are:

  1. The client will get all Orders

这只是您如何重新实现 equals() 的问题。

  1. The client will get NO error on deserialization of result.

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