一. 问题描述
通过dubbo调用某类接口时,若该接口的返回类型是Collection的子类并且扩展了自实现的属性, 则返回结果集会丢失自实现的属性。 比如, 我有个接口方法返回PageList(源码如下),则当客户端调用这个方法时,得到的返回对象中并没有paginator属性。
![c072e1e77815628ff52d7fe4127c3b9c.png](https://i-blog.csdnimg.cn/blog_migrate/4493a41889c30cfe90d1054c5d1999ef.jpeg)
二. 问题定位
dubbo默认的序列化及反序列化协议是使用的hessian2;调试源码,找到处理集合类型的序列器CollectionSerializer,源码如下:
![0ffc005953624aa14e7557a6afd1e3a0.png](https://i-blog.csdnimg.cn/blog_migrate/ed9bad4bb4bc9e84fab1d671f8c5f50d.jpeg)
以上代码,方法 writeObject(Object obj, AbstractHessianOutput out) 的入参obj,其实相当于以上的PageList对象。仔细看就发现这个方法只处理了放入集合中的对象,而没有对扩展的其它属性进行写入,从而导致属性丢失。
三、 解决方案
1、将集合对象改为普通类返回,集合作为普通类的属性。如下:
![1cb4f04e77acf2262a28986723ea5469.png](https://i-blog.csdnimg.cn/blog_migrate/4fddace357f50fad2fff869ae291cd58.jpeg)
2、更改序列化方式、修改hessian2序列化源码等