Dubbo序列化多个CopyOnWriteArrayList对象变成同一对象的一个大坑!!
环境:
win10 + jdk 1.8 + dubbo 2.5.10
问题描述:
当一个对象(此对象内包含多个CopyOnWriteArrayList对象) 作为参数调用RPC接口后, 服务提供者拿到的对象中的CopyOnWriteArrayList, 引用都相同了(即变成了同一个对象).
问题范围缩小:
Dubbo Serialization 反序列化时会有此问题, 用一下代码可以重现问题
import com.alibaba.dubbo.common.serialize.support.dubbo.GenericObjectInput;
import com.alibaba.dubbo.common.serialize.support.dubbo.GenericObjectOutput; import java.io.*; /**
*
* Dubbo序列化的一个坑
* @author yjy
* 2018-07-25 10:28
*/
public class SerializerTest { public static void main(String[] args) throws IOException { Entity entity = new Entity();
// 此时两个 CopyOnWriteArrayList 不同
System.out.println(entity.getList1() == entity.getList2()); // 序列化
OutputStream outputStream = new FileOutputStream("dubboSerializer");
GenericObjectOutput objectOutput = new GenericObjectOutput(outputStream);
objectOutput.writeObject(entity);
objectOutput.flushBuffer(); // 反序列化
GenericObjectInput input = new GenericObjectInput(new FileInputStream("dubboSerializer"));
Entity obj1 = (Entity) input.readObject();
// 此时两个 CopyOnWriteArrayList 相同????????????????????????
System.out.println(obj1.getList1() == obj1.getList2());
} }
import java.io.Serializable;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList; /**
* @author yjy
* 2018-07-25 10:28
*/
public class Entity implements Serializable { private static final long serialVersionUID = 187648346954430294L; private List<Integer> list1 = new CopyOnWriteArrayList<>();
private List<Integer> list2 = new CopyOnWriteArrayList<>(); public List<Integer> getList1() {
return list1;
} public List<Integer> getList2() {
return list2;
}
}
这个问题可把我给坑坏了, 现在已经将此问题提交至 github, Issue地址
解决方案有3种
1. 避免使用在RPC调用或返回时使用 CopyOnWriteArrayList 对象
2. 避免使用 dubbo serialization, 改用 hessian 序列化
3. 将dubbo版本升级为 2.6.x, 并使用默认序列化(hessian)
Dubbo序列化多个CopyOnWriteArrayList对象变成同一对象的一个大坑!!的更多相关文章
- 热部署环境下,dubbo序列化的bug和优化
一.问题的发现与解决 (1) 在热部署下,使用dubbo的序列化一个pojo对象,反序列化时报错:ClassNotFoundException. 最后发现原因是我们的框架选择使用了java序列 ...
- dubbo序列化
序列化:把对象转换为字节序列的过程称为对象的序列化. 反序列化:把字节序列恢复为对象的过程称为对象的反序列化. dubbo 支持多种序列化方式并且序列化是和协议相对应的.比如:dubbo协议的 dub ...
- dubbo序列化hibernate.LazyInitializationException could not initialize proxy - no Session懒加载异常的解决
dubbo序列化,hibernate.LazyInitializationException could not initialize proxy - no Session懒加载异常的解决 转载声明: ...
- dubbo 序列化 问题 属性值 丢失 ArrayList 解决
参考文章:http://blog.csdn.net/wanyanxgf/article/details/6944733 http://tianya23.blog.51cto.com/1081650/5 ...
- C#序列化及反序列化Json对象通用类JsonHelper
当今的程序界Json大行其道.因为Json对象具有简短高效等优势,广受广大C#码农喜爱.这里发一个序列化及反序列化Json对象通用类库,希望对大家有用. public class JsonHelper ...
- WPF [调用线程无法访问此对象,因为另一个线程拥有该对象。] 解决方案以及如何实现字体颜色的渐变
本文说明WPF [调用线程无法访问此对象,因为另一个线程拥有该对象.] 解决方案以及如何实现字体颜色的渐变 先来看看C#中Timer的简单说明,你想必猜到实现需要用到Timer的相关知识了吧. C# ...
- ServletContext对象(每个工程只有一个此对象)
一]重点方法: 1>存取对象 void setAttribute(String name, Object object);//将obj ...
- DOM对象本身也是一个js对象,所以严格来说,并不是操作这个对象慢,而是说操作了这个对象后,会触发一些浏览器行为(转)
一直都听说DOM很慢,要尽量少的去操作DOM,于是就想进一步去探究下为什么大家都会这样说,在网上学习了一些资料,这边整理出来. 首先,DOM对象本身也是一个js对象,所以严格来说,并不是操作这个对象慢 ...
- Object.create() 的含义:从一个实例对象,生成另一个实例对象
出处:https://wangdoc.com/javascript/oop/object.html#objectcreate 生成实例对象的常用方法是,使用new命令让构造函数返回一个实例.但是很多时 ...
随机推荐
- 【XSY3344】连续段 DP 牛顿迭代 NTT
题目大意 对于一个长度为 \(n\) 的排列 \(p\),我们称一个区间 \([l,r]\) 是连续的当且仅当 \((\max_{l\leq i\leq r}a_i)-(\min_{l\leq i\l ...
- Vim内直接使用p粘贴系统剪切板
解决方法 set clipboard=unnamed
- pycharm的Database连接新的Mysql5.7报错[08001]
在URL的后面增加参数: ?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC 解决. 原因是虽然mysql5.7的s ...
- C# activex开发中 axwebbrowser控件及 IE浏览器设置
<object type='application/x-vlc-plugin' id='vlc' events='True' codebase='../cab/axvlc.cab' classi ...
- pt-show-grants的用法
pt-show-grants的用法 1.先查找所有用户和Host 2.然后逐个执行show grants pt-show-grants的功能是格式化打印输出MySQL上的赋权,以便你可以有效地复制.比 ...
- js重点--原型链
通过将一个构造函数的原型对象指向父类的实例,就可以调用父类中的实例属性及父类的原型对象属性,实现继承. function animals(){ this.type = "animals&qu ...
- 基于jdk1.8的ArrayList源码分析
前言ArrayList作为一个常用的集合类,这次我们简单的根据源码来看看AarryList是如何使用的. ArrayList拥有的成员变量 public class ArrayList<E> ...
- MySQL启动出现The server quit without updating PID file错误解决办法
启动mysql服务的时候报下面这个错: 之间网上搜了各种办法,有重新初始化的(这怎么可能,里面还有数据...),有修改启动脚本的等等,但是都没用. 其实解决办法非常简单粗暴,那就是把/etc/my.c ...
- (六)循环和控制语句及列表迭代(enumerate)
一.pythoh中while.for.if的循环 嗯.........这个好像没什么好说的,简单粗暴来几个游戏! 1.来玩儿个猜数字游戏,需求:只能猜3次,小了提示小,大了提示大,猜对了游戏结束 3次 ...
- js 正则表达式,分组,非捕获或 环视的使用
定位一个字符串中,匹配与定位重复字符中的最后一个字符: 例子: <script type="text/javascript"> var str="http:/ ...