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命令让构造函数返回一个实例.但是很多时 ...
随机推荐
- drf相关问题
drf自定义用户认证: 登录默认 使用django的ModelBackend,对用户名和密码进行验证.但我们平时登录网站时除了用户名也可以用邮箱或手机进行登录,这就需要我们自己扩展backend 一. ...
- 【Linux】Jenkins安装
安装环境准备 操作系统:Linux(CentOS7) 软件:jdk,安装及配置步骤见Linux安装jdk 软件:tomcat,安装及配置见Linux安装tomcat Jenkins安装 由于Jenki ...
- EditText以及登录UI实现
EditText是可以输入的文本框 <?xml version="1.0" encoding="utf-8"?><RelativeLayout ...
- 各类聚类(clustering)算法初探
1. 聚类简介 0x1:聚类是什么? 聚类是一种运用广泛的探索性数据分析技术,人们对数据产生的第一直觉往往是通过对数据进行有意义的分组.很自然,首先要弄清楚聚类是什么? 直观上讲,聚类是将对象进行分组 ...
- Linux之 proc文件系统
用户态与内核态交互的接口之一,管理方式与普通文件相同每个节点的文件权限(读/写)决定其查看和配置权限大量LINUX系统参数和状态信息可通过proc节点查看或配置/proc/<pid>/:查 ...
- 2018-2019-2 《Java程序设计》第6周学习总结
20175319 2018-2019-2 <Java程序设计>第6周学习总结 教材学习内容总结 本周学习<Java程序设计>第七章和第十章: 内部类: 1.内部类可以使用外嵌类 ...
- python 正则指北之我的总结
本文经本人搜索网络加上个人理解整理而成,如有侵权,请告知,会立即删除! 正则引擎大体上可分为不同的两类:DFA和NFA,而NFA又基本上可以分为传统型NFA和POSIX NFA. DFA Determ ...
- sql 查询某个条件多条数据中最新的一条数据或最老的一条数据
sql 查询某个条件下多条数据中最新的一条数据或最老的一条数据 test_user表结构如下: 需求:查询李四.王五.李二创建的最初时间或者最新时间 1:查询最初的创建时间: SELECT * FRO ...
- c语言变量及输入输出
scanf: 格式字符串的一般形式:%[*][输入数据宽度][长度] 类型 (其中有方括号[] 的项为任选项.) 各项意义: 1) 类型:表示输入数据的类型,其格式符和意义如下表所示. ...
- zipline框架--简介
Zipline is a Pythonic algorithmic trading library. It is an event-driven system for backtesting. Zip ...