今天偶然发现,通过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 更换其他序列化方式