dubbo 序列化 问题 属性值 丢失 ArrayList 解决
参考文章: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接口新增了一个方法:
- {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}
所以,属性丢失。
dubbo 序列化 问题 属性值 丢失 ArrayList 解决的更多相关文章
- 浏览器后退按钮导致jquery动态添加的select option值丢失的解决方法
监控浏览器返回功能 判断浏览器返回功能 禁用浏览器的后退按钮 JS禁止浏览器后退键 http://volunteer521.iteye.com/blog/830522/ 浏览器返回功能 判断上一页面来 ...
- dubbo序列化hibernate.LazyInitializationException could not initialize proxy - no Session懒加载异常的解决
dubbo序列化,hibernate.LazyInitializationException could not initialize proxy - no Session懒加载异常的解决 转载声明: ...
- List<Object>中,以Object的某一属性值为参照进行排序,选取最大记录的解决办法
一.场景:java web, 在一列表中选取一条记录,该记录的某一个属性值在此List中为最大值: List的格式为List<Object>,其中Object为定义的Vo或者Po类,其中包 ...
- js获取元素属性值为空的原因和解决办法
问题描述:js获取某元素的属性值为空 代码: <!-- css定义在head中 --> <style> #box{ width: 100px; height: 100px; b ...
- JSP出现"属性值[request.getParameter("myMessage")]引用["],在值内使用时必须被转义"的解决方法
写JSP时出现属性值[request.getParameter("myMessage")]引用["],在值内使用时必须被转义. 源代码: <jsp:setPrope ...
- java对象json序列化时忽略值为null的属性
环境: jdk: openjdk11 操作系统: windows 10教育版1903 目的: 如题,当一个对象里有些属性值为null 的不想参与json序列化时,可以添加如下注解 import com ...
- VUE项目中使用this.$forceUpdate();解决页面v-for中修改item属性值后页面v-if不改变的问题
VUE项目中使用this.$forceUpdate();解决页面v-for中修改item属性值后页面v-if不改变的问题:https://blog.csdn.net/jerrica/article/d ...
- 解决引用类型为什么打出的是地址值,又怎么改成输出属性值(toString()底层)
一丶toString的源码解析: 一丶object的toString的源码解析: 集合中toString源码分析: 小结: 改成输出属性值 在父类中重写toString();方法 快捷键:Alt+In ...
- dubbo序列化的一点注意
最近工作中遇见了一个小问题,在此记录一下,大致是这样的,有一父类,有一个属性traceId,主要是记录日志号,这样可以把所有日志串起来,利于排查问题,所有的pojo对象继承于此,但是其中一同事在子类p ...
随机推荐
- (三)Solr——Solr的基本使用
1. Schema.xml 在schema.xml文件中,主要配置了solrcore的一些数据信息,包括Field和FieldType的定义等信息,在solr中,Field和FieldType都需要先 ...
- spring 代理 演变过程
动态代理演变 拿JDBC开事务举例子 最初 写代码 每个CUD 都需要开启事务 所以出现很多累赘代码 因此提出静态代理的构想,把事务交给后台做,程序员只需要 调用update(sql)就行了,upda ...
- 设置SSH编码为中文
http://www.qzz.in/?post=198下面是详细方法: 方法1: vi /etc/sysconfig/i18n 将内容改为 LANG="zh_CN.GB18030" ...
- chrome的input输入框填充后背景颜色变成黄色 (input:-webkit-autofill 导致的)
填写form表单时发现chrome的一个好坑啊! 当你之前有填写过表单,获取焦点时,input会有一个记录之前填写过的文本的下拉列表式的东东, 按理说,这没什么问题,很多时候为了方便,也需要它记录输入 ...
- AAAA block
[self AAAA:^(BOOL isSuccessed, id userInfo, NSString *errorMsg) { NSLog(@"AAAA: %d, userInfo: % ...
- 解决异常断电导致的: CorruptSSTableException: java.io.EOFException
问题产生 服务器重启,导致cassandra损坏,整个集群不可用.所使用的cassandra为2.1.9版本. 问题描述 运行启动命令,报错如下: DEBUG :: All segments have ...
- 使用 GROUP BY WITH ROLLUP 改善统计性能
使用 GROUP BY 的 WITH ROLLUP 字句可以检索出更多的分组聚合信息,它不仅仅能像一般的 GROUP BY 语句那样检索出各组的聚合信息,还能检索出本组类的整体聚合信息. 下面我们的例 ...
- [获取行数]php读取大文件提供性能的方法,PHP的stream_get_line函数读取大文件获取文件的行数的方...
背景: 下面是获取文件的行数的方法: 一个文件如果知道有几行的话,就可以控制获取一定的行数的数据,然后放入数据库.这样不管的读取大文件的性能,还是写入数据库的性能,都能得到很大的提高了. 下面是获取文 ...
- Atitit JAVA p2p设计与总结 JXTA 2
Atitit JAVA p2p设计与总结 JXTA 2 JXTA 2 是开放源代码 P2P 网络的第二个主要版本,它利用流行的.基于 Java 的参考实现作为构建基础.在设计方面进行了重要的修改,以 ...
- atitit.php中的dwr 设计模式
atitit.php中的dwr 设计模式 1. dwr的优点相对于ajax来说.. 1 2. DWR工作原理 1 3. php的dwr实现 1 4. 参考 3 1. dwr的优点相对于ajax来说.. ...