博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Dubbo序列化多个CopyOnWriteArrayList对象变成同一对象的一个大坑!!
阅读量:6445 次
发布时间:2019-06-23

本文共 1981 字,大约阅读时间需要 6 分钟。

环境:

  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
list1 = new CopyOnWriteArrayList<>(); private List
list2 = new CopyOnWriteArrayList<>(); public List
getList1() { return list1; } public List
getList2() { return list2; }}

 

这个问题可把我给坑坏了, 现在已经将此问题提交至 github,

 

解决方案有3种

1. 避免使用在RPC调用或返回时使用 CopyOnWriteArrayList 对象

2. 避免使用 dubbo serialization, 改用 hessian 序列化

3. 将dubbo版本升级为 2.6.x, 并使用默认序列化(hessian)

转载于:https://www.cnblogs.com/imyjy/p/9364921.html

你可能感兴趣的文章
java如何远程登录linux并执行其命令 ,并且得到返回的参数的值
查看>>
spring boot mybatis 快速构建微服务
查看>>
寻找数据真相设想-find the data truth
查看>>
ActiveMQ传输文件的几种方式原理与优劣
查看>>
CSS Display(显示) and Visibility(可见性)
查看>>
java web中用于检测用户是否登陆的过滤器(Filter - 3)
查看>>
XUtils-DbUtils使用笔记
查看>>
更快学会任何东西的终极指南
查看>>
树莓派直接挂载Iphone手机导出照片
查看>>
网络延时与抖动
查看>>
Flask+Redis维护代理池
查看>>
IOS中使用UIWebView 加载网页、文件、 html的方法
查看>>
跨域资源共享(CORS)安全性浅析
查看>>
linux(centos)搭建SVN服务器
查看>>
向mysql看齐!
查看>>
使用coffeescript-maven-plugin,实时监控coffee文件的编译,只需一步配置
查看>>
Java Concurrent--线程封闭和实例封闭
查看>>
程序员的生存技巧 —— 搜索技巧
查看>>
Android第三方应用分享图文到微信朋友圈 & 微信回调通知分享状态
查看>>
Android8.0运行时权限策略变化和适配方案
查看>>