参考文章:http://blog.csdn.net/wanyanxgf/article/details/6944733

http://tianya23.blog.51cto.com/1081650/582256/

这里重点说下解决办法:

由于dubbo采用的序列化和反序列化方案为hessian,但是 hessian 对ArrayList 采用CollectionSerializer类进行 序列化处理,这里 实际代码只会对 ArrayList第一层属性进行处理。

项目中使用PageList 封装类 继承了 ArrayList,并且里面有负责 java对象 PageTools,故 无法转换,属性丢失。

public class PageList<E> extends ArrayList<E> {
private static final long serialVersionUID = 6110720806295292900L;
private PagingTools pagingTools; public PageList() {
this.pagingTools = new PagingTools();
} public PageList(Collection<E> c) {
this(c, (PagingTools)null);
} public PageList(Collection<E> c, PagingTools pageTools) {
super(c);
this.pagingTools = pageTools == null?new PagingTools():pageTools;
} public PagingTools getPageTools() {
return this.pagingTools;
} public void setPageTools(PagingTools pageTools) {
if(pageTools != null) {
this.pagingTools = pageTools;
} }
}

  

解决方法: 使用其他 序列化方案  ,这里试了 json ,结果一样。 最终没办法,使用了java原生的序列化。

具体操作:  在 dubbo服务端和客户端 配置 序列化方案

<dubbo:protocol serialization="java"/>

h1. 现象

为一个dubbbo接口新增了一个方法:

  1. {code}
  2. DomainObject<String> testSer();
  3. 实现:
  4. @Override
  5. public DomainObject<String> testSer() {
  6. DomainObject<String> result = new DomainObject<String>();
  7. result.setAge(10);
  8. result.setName("test");
  9. result.add("DomainObject1");
  10. return result;
  11. }
  12. {code}

返回值定义如下:

  1. {code}
  2. public class DomainObject<E> extends ArrayList<E> {
  3. private static final long serialVersionUID = -7393642276493435828L;
  4. private String name;
  5. private int    age;
  6. }
  7. {code}

远程调用:

  1. {code}
  2. DomainObject<String> result = voucherInfoQueryService.testSer();
  3. System.out.println(result.getAge());
  4. System.out.println(result.getName());
  5. System.out.println(result.get(0));
  6. {code}

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

  1. {code}
  2. 0
  3. null
  4. DomainObject1
  5. {code}

h1. 问题排查

h4. 使用java自带序列化执行序列化和反序列化, 不会出现属性丢失的问题,怀疑dubbo序列化有特殊处理

h4. dubbo 默认用的序列化协议是hessian2,查看代码

序列化时代码如下:

  1. {code}
  2. public void writeObject(Object object)
  3. throws IOException
  4. {
  5. if (object == null) {
  6. writeNull();
  7. return;
  8. }
  9. Serializer serializer;
  10. ##查找对应的serializer
  11. serializer = findSerializerFactory().getSerializer(object.getClass());
  12. ##序列化
  13. serializer.writeObject(object, this);
  14. }
  15. {code}

查找serializer:由代码可知,上面的DomainObject对应的serializer是CollectionSerializer

  1. {code}
  2. public Serializer getSerializer(Class cl)
  3. throws HessianProtocolException
  4. {
  5. ...
  6. else if (Collection.class.isAssignableFrom(cl)) {
  7. if (_collectionSerializer == null) {
  8. _collectionSerializer = new CollectionSerializer();
  9. ...
  10. }
  11. {code}

CollectionSerializer.writeObject

  1. {code}
  2. public void writeObject(Object obj, AbstractHessianOutput out)
  3. throws IOException
  4. {
  5. ...
  6. Iterator iter = list.iterator();
  7. while (iter.hasNext()) {
  8. Object value = iter.next();
  9. out.writeObject(value);
  10. }
  11. ...
  12. }
  13. {code}

所以,属性丢失。

dubbo 序列化 问题 属性值 丢失 ArrayList 解决的更多相关文章

  1. 浏览器后退按钮导致jquery动态添加的select option值丢失的解决方法

    监控浏览器返回功能 判断浏览器返回功能 禁用浏览器的后退按钮 JS禁止浏览器后退键 http://volunteer521.iteye.com/blog/830522/ 浏览器返回功能 判断上一页面来 ...

  2. dubbo序列化hibernate.LazyInitializationException could not initialize proxy - no Session懒加载异常的解决

    dubbo序列化,hibernate.LazyInitializationException could not initialize proxy - no Session懒加载异常的解决 转载声明: ...

  3. List<Object>中,以Object的某一属性值为参照进行排序,选取最大记录的解决办法

    一.场景:java web, 在一列表中选取一条记录,该记录的某一个属性值在此List中为最大值: List的格式为List<Object>,其中Object为定义的Vo或者Po类,其中包 ...

  4. js获取元素属性值为空的原因和解决办法

    问题描述:js获取某元素的属性值为空 代码: <!-- css定义在head中 --> <style> #box{ width: 100px; height: 100px; b ...

  5. JSP出现"属性值[request.getParameter("myMessage")]引用["],在值内使用时必须被转义"的解决方法

    写JSP时出现属性值[request.getParameter("myMessage")]引用["],在值内使用时必须被转义. 源代码: <jsp:setPrope ...

  6. java对象json序列化时忽略值为null的属性

    环境: jdk: openjdk11 操作系统: windows 10教育版1903 目的: 如题,当一个对象里有些属性值为null 的不想参与json序列化时,可以添加如下注解 import com ...

  7. VUE项目中使用this.$forceUpdate();解决页面v-for中修改item属性值后页面v-if不改变的问题

    VUE项目中使用this.$forceUpdate();解决页面v-for中修改item属性值后页面v-if不改变的问题:https://blog.csdn.net/jerrica/article/d ...

  8. 解决引用类型为什么打出的是地址值,又怎么改成输出属性值(toString()底层)

    一丶toString的源码解析: 一丶object的toString的源码解析: 集合中toString源码分析: 小结: 改成输出属性值 在父类中重写toString();方法 快捷键:Alt+In ...

  9. dubbo序列化的一点注意

    最近工作中遇见了一个小问题,在此记录一下,大致是这样的,有一父类,有一个属性traceId,主要是记录日志号,这样可以把所有日志串起来,利于排查问题,所有的pojo对象继承于此,但是其中一同事在子类p ...

随机推荐

  1. [转载]mac下查看.mobileprovision文件及钥匙串中证书.cer文件

    一. mobileprovision文件查看 xxx.mobileprovision是ios开发中的设备描述文件,里面有证书信息.调试设备的UUID信息.bundle identifier等,此文件是 ...

  2. iOS 小数点精度问题处理

    实际开发中有时候经常会需要去处理小数点精度问题,如果是整数保留整数,如果有小数则保留不为0的的小数,最大2位小数 eg: 2.013 ---> 2.01 2.0 ---> 2 2.10 - ...

  3. NumberUtils

    package cn.edu.hbcf.common.utils; import java.math.BigDecimal; import java.text.NumberFormat; import ...

  4. ECMall中Widgets模式的布局引擎

    自己做过框架的人,可能都会思考一个问题,模板引擎需要什么特性? Widgets模式,很多系统中都有出现,但对于纯开发人员,不管前端或后台人员来说,都觉得稍微麻烦了一点.因为他将界面硬生生的拆分出了很多 ...

  5. traceroute/tracert--获取网络路由路径

    traceroute 是用来检测发出数据包的主机到目标主机之间所经过的网关数量的工具.traceroute 的原理是试图以最小的TTL发出探测包来跟踪数据包到达目标主机所经过的网关,然后监听一个来自网 ...

  6. 完整的jdbc查询结果集编码

    public static ArrayList<HashMap<String,Object>> query(Connection conn,String sql, Object ...

  7. 爬虫 (6)- Scrapy 实战案例 - 爬取不锈钢的相关钢卷信息

    超详细创建流程及思路 一. 新建项目 1.创建文件夹,然后在对应文件夹创建一个新的python项目 2.点击Terminal命令行窗口,运行下面的命令创建scrapy项目 scrapy startpr ...

  8. 【转】【Mysql学习】之Mac上用终端使用mySQL

    收藏了几篇文章,以供查阅: 在此感谢: m0_38017925:<Mac上用终端使用mySQL> xiamu03:<在MacOS上使用终端操作数据库>

  9. 【JMeter4.0】之遇到的问题总结(持续更新)

    目录: 一.图形结果监听器选择文件报错 二.TCP取样器压测出现500 错误,读取数据超时 三.如何解决JMeter通过JDBC访问MySQL的问题总结 四.如何解决JMeter通过JDBC访问Ora ...

  10. CI 框架购物车问题

    因为CI 是外国的框架.购物逻辑和中国的不一样.所以需要改进ci 框架的 cart 类: (1)先把 cart类拷贝一份到application/libaries/下 (2)因为cart中购车中的商品 ...