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命令让构造函数返回一个实例.但是很多时 ...
随机推荐
- Cnblogs美化总结
测试 扩展阅读 [转载]详谈如何定制自己的博客园皮肤 - 云+社区 - 腾讯云谢谢!! [PS]3步搞定博客园界面风格 - nowgood - 博客园 [分享]博客美化(6)为你的博文自动添加目录 - ...
- What Kind of Friends Are You? ZOJ 3960
比赛的时候用vector交集做的...情况考虑的不全面 wrong到疯 赛后考虑全了情况....T了 果然 set_intersection 不能相信 嗯 不好意思 交集a了 第二个代码 求出来 ...
- hihoCoder #1954 : 压缩树(虚树)
题意 有一棵 \(n\) 个节点且以 \(1\) 为根的树,把它复制成 \(m\) 个版本,有 \(q\) 次操作,每次对 \([l, r]\) 这些版本的 \(v\) 节点到根的路径收缩起来. 收缩 ...
- python在windows(双版本)及linux环境下安装
python下载 下载地址:https://www.python.org/downloads/ 可以下载需要的版本,这里选择2.7.12和3.6.2 下面第一个是linux版本,第二个是windows ...
- manjaro下的.vimrc
我的插件管理是用vim-plug来管理的 下载命令 curl -fLo ~/.vim/autoload/plug.vim --create-dirs \ https://raw.githubuserc ...
- Dijkstra【迪杰斯特拉算法】
有关最短路径的最后一个算法——Dijkstra 迪杰斯特拉算法是由荷兰计算机科学家迪杰斯特拉于1959 年提出的,因此又叫迪杰斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路 ...
- selenium自动化测试python
一.环境部署 1.selenium安装 pip3 install selenium 1.安装浏览器驱动 WebDriver 需要通过浏览器驱动来与浏览器交互,以下列出几种常用的浏览器驱动下载地址: C ...
- Haproxy 安装及配置
Haproxy介绍 HAProxy是一个特别适用于高可用性环境的TCP/HTTP开源的反向代理和负载均衡软件.实现了一种事件驱动,单一进程模型,支持非常大的并发连接,是因为事件驱动模型有更好的资源和时 ...
- Redies安装,修配置,设置密码,
Redies下载路径:https://github.com/MicrosoftArchive/redis/releases 我下的是Redis-x64-3.2.100.msi 下载后安装,一步一步操作 ...
- 0426JavaSE01day02.txt=========正则、Object、包装类详解
正则表达式 基本正则表达式:正则表达式简介.分组(). "^"和"$" String正则API:matches方法.split方法.replaceAll方法 O ...