Dubbo序列化问题排查

h1. 现象

为一个dubbbo接口新增了一个方法:
{code}
DomainObject<String> testSer();


实现:
@Override
    public DomainObject<String> testSer() {
        DomainObject<String> result = new DomainObject<String>();
        result.setAge(10);
        result.setName("test");
        result.add("DomainObject1");
        return result;
    }
{code}

返回值定义如下:
{code}
public class DomainObject<E> extends ArrayList<E> {
    private static final long serialVersionUID = -7393642276493435828L;
    private String name;
    private int    age;
}
{code}

远程调用:
{code}
DomainObject<String> result = voucherInfoQueryService.testSer();
System.out.println(result.getAge());
System.out.println(result.getName());
System.out.println(result.get(0));
{code}

输出结果:丢失了age和name两个属性的值,而 list内部的值还是存在的
{code}
0
null
DomainObject1
{code}

h1. 问题排查

h4. 使用java自带序列化执行序列化和反序列化, 不会出现属性丢失的问题,怀疑dubbo序列化有特殊处理
h4. dubbo 默认用的序列化协议是hessian2,查看代码
序列化时代码如下:
{code}
public void writeObject(Object object)
    throws IOException
  {
    if (object == null) {
      writeNull();
      return;
    }


    Serializer serializer;
    ##查找对应的serializer
    serializer = findSerializerFactory().getSerializer(object.getClass());
    ##序列化
    serializer.writeObject(object, this);
  }
{code}

查找serializer:由代码可知,上面的DomainObject对应的serializer是CollectionSerializer
{code}
public Serializer getSerializer(Class cl)
    throws HessianProtocolException
  {
  ...
   else if (Collection.class.isAssignableFrom(cl)) {
      if (_collectionSerializer == null) {
	_collectionSerializer = new CollectionSerializer();
   ...
      }
{code}

CollectionSerializer.writeObject

{code}
public void writeObject(Object obj, AbstractHessianOutput out)
    throws IOException
  {
    ...
    Iterator iter = list.iterator();
    while (iter.hasNext()) {
      Object value = iter.next();


      out.writeObject(value);
    }
    ...
  }
{code}
所以,属性丢失。
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值