dubbo 接口调用部分字段丢失问题

      今天偶然发现,通过dubbo接口调用发现某个字段是空的。第一反应是不是没有设置值,查看服务端代码,是设置值了的。这就奇了怪了。怀疑人生啊,我反复去看返回实体类,发现那个类继承了另外一个类。而且那个为空的字段,在父类也定义了。猜想是不是这个原因导致的,移除子类的该字段,正常了。我擦 ,这是什么鬼,只能去查资料了。

   dubbo默认使用的序列化方式是hession

-- 序列化
public static byte[] serialize(Object obj) throws IOException {
    ByteArrayOutputStream os = new ByteArrayOutputStream();
    HessianOutput ho = new HessianOutput(os);
    ho.writeObject(obj);
    return os.toByteArray();
}

-- 反序列化
public static Object deserialize(byte[] by) throws IOException {
    ByteArrayInputStream is = new ByteArrayInputStream(by);
    HessianInput hi = new HessianInput(is);
    return hi.readObject();
}

查看源码即可得知,hession 序列化会把子类父类所有属性序列化,如果存某个字段子类父类都存在,那么会序列化后将有2个值

一个有值,一个为空。那么在反序列化时会对该字段做两次赋值,操作过后字段的值就被设置成空了。

言归正传怎么解决呢?

1 最好不重复定义字段咯,删除即可

2 有时候就是有人不按常理出牌,那么就修改hession的源码

3 更换其他序列化方式

你可能感兴趣的:(JAVA)