环境:

  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对象变成同一对象的一个大坑!!的更多相关文章

  1. 热部署环境下,dubbo序列化的bug和优化

    一.问题的发现与解决 (1)     在热部署下,使用dubbo的序列化一个pojo对象,反序列化时报错:ClassNotFoundException. 最后发现原因是我们的框架选择使用了java序列 ...

  2. dubbo序列化

    序列化:把对象转换为字节序列的过程称为对象的序列化. 反序列化:把字节序列恢复为对象的过程称为对象的反序列化. dubbo 支持多种序列化方式并且序列化是和协议相对应的.比如:dubbo协议的 dub ...

  3. dubbo序列化hibernate.LazyInitializationException could not initialize proxy - no Session懒加载异常的解决

    dubbo序列化,hibernate.LazyInitializationException could not initialize proxy - no Session懒加载异常的解决 转载声明: ...

  4. dubbo 序列化 问题 属性值 丢失 ArrayList 解决

    参考文章:http://blog.csdn.net/wanyanxgf/article/details/6944733 http://tianya23.blog.51cto.com/1081650/5 ...

  5. C#序列化及反序列化Json对象通用类JsonHelper

    当今的程序界Json大行其道.因为Json对象具有简短高效等优势,广受广大C#码农喜爱.这里发一个序列化及反序列化Json对象通用类库,希望对大家有用. public class JsonHelper ...

  6. WPF [调用线程无法访问此对象,因为另一个线程拥有该对象。] 解决方案以及如何实现字体颜色的渐变

    本文说明WPF [调用线程无法访问此对象,因为另一个线程拥有该对象.] 解决方案以及如何实现字体颜色的渐变 先来看看C#中Timer的简单说明,你想必猜到实现需要用到Timer的相关知识了吧. C# ...

  7. ServletContext对象(每个工程只有一个此对象)

    一]重点方法:        1>存取对象                        void setAttribute(String name, Object object);//将obj ...

  8. DOM对象本身也是一个js对象,所以严格来说,并不是操作这个对象慢,而是说操作了这个对象后,会触发一些浏览器行为(转)

    一直都听说DOM很慢,要尽量少的去操作DOM,于是就想进一步去探究下为什么大家都会这样说,在网上学习了一些资料,这边整理出来. 首先,DOM对象本身也是一个js对象,所以严格来说,并不是操作这个对象慢 ...

  9. Object.create() 的含义:从一个实例对象,生成另一个实例对象

    出处:https://wangdoc.com/javascript/oop/object.html#objectcreate 生成实例对象的常用方法是,使用new命令让构造函数返回一个实例.但是很多时 ...

随机推荐

  1. Unity插件系列之二维码

    1.二维码常见的生成与识别途径 1.草料二维码 https://cli.im/text 2.在软件中实现生成和扫描二维码 使用zxing实现 zxing是一个用java写的开源项目,zxing.net ...

  2. audio与video控件/标签的隐藏,iso/Android下自动全屏播放,短暂黑屏问题

    (一)audio音频标签 <audio src="xxx.mp3"></audio> (二)video视频标签 <video src="xx ...

  3. Centos 7 搭建 你懂的

    2018-11-21    19:10:18 本文初衷只是为自己下次搭建做个记录,文中代码也是借鉴其他博客的 以下为博客链接 https://www.cnblogs.com/shipengfei/p/ ...

  4. yii2 使用指定数据库执行createCommand

    Yii::$app->dbName->createCommand($sql)->queryAll(); 指定dbName数据库配置

  5. SNOI 2019 字符串

    SNOI 2019 字符串 题目 题解: 解法一: 记一个数组\(f\),\(f[i]=\min_j\ s[j]\neq s[j+1] (j\geq i)\),直接sort即可,复杂度\(O(nlog ...

  6. 微信公众号开发之access_token的全局共用

    最近做微信公众号开发,涉及到access_token的缓存问题(避免各自的应用都去取access_token,同时解决微信 appid和appsecret的安全问题),在通用权限管理系统底层增加了实现 ...

  7. (转) qt: usb热插拔(linux);

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> ...

  8. 关于IsDeleted,Islock,State类型Bit,char(1),tinyint的探讨

    做IsDeleted,Islock,State时,字段的数据类型选择一般有三种Bit,char,tinyint,大于2个字节的类型我们暂时不考虑,这里以mssql为例. 数据大小​: Bit,char ...

  9. shell拼写检查,利用Linux字典

    rename #find path -type  f -name "*.mp3" -exec mv { } target_dir \; #mp3 file mv dir_file ...

  10. python3 练手实例1 计算三角形周长和面积

    def j(): a,b,c=map(float,input('请输入三角形三条边的长度,用空格隔开:').split()) if a>0 and b>0 and c>0 and a ...