博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
项目中copy List 数据,解决修改值后改变原值问题(SerialKiller)
阅读量:6341 次
发布时间:2019-06-22

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

  hot3.png

在copy 对像时,发现改变copy对象的属性值时,都会改变原值,方法如下:

List<A> a ;//a为方法参数中传进来的list;

方法1:

List<A> b = new ArrayList<A>(a);

方法2:

List<A> b = new ArrayList<A>(Arrays.asList(new A[a.size()]));

Collections.copy(b, a);

以上方法copy完毕后,经测试都会改变原list的对象属性值,放弃;

使用以下方法解决了此问题

/**

     * list中的对象必须实现序列化接口 执行序列化和反序列化  进行深度拷贝  
     * srcList
     *
     * IOException
     * ClassNotFoundException
     */
    @SuppressWarnings("unchecked")
    private <T> List<T> deepCopy(List<T> srcList) throws IOException, ClassNotFoundException {  
        ByteArrayOutputStream byteOut = new ByteArrayOutputStream();  
        ObjectOutputStream out = new ObjectOutputStream(byteOut);  
        out.writeObject(srcList);  
 
        ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());  
        ObjectInputStream in = new ObjectInputStream(byteIn);  
        List<T> destList = (List<T>) in.readObject();  
        return destList;  
    }

根据的2015年11月发现的序列化漏洞修改为:

import java.io.ByteArrayInputStream;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

import org.apache.commons.beanutils.BeanUtils;

import org.apache.commons.configuration.ConfigurationException;
import org.apache.struts2.ServletActionContext;
import org.nibblesec.tools.SerialKiller;

/**

  * list中的对象必须实现序列化接口 执行序列化和反序列化  进行深度拷贝 
  * @param srcList
  * @return
  * @throws IOException
  * @throws ClassNotFoundException
  * @throws ConfigurationException
  */
 @SuppressWarnings("unchecked")
 private <T> List<T> deepCopy(List<T> srcList) {
  List<T> destList = null;
  ByteArrayOutputStream byteOut = null;
  ObjectOutputStream out = null;
  ByteArrayInputStream byteIn  = null;
  ObjectInputStream ois = null;
  try {
   byteOut = new ByteArrayOutputStream();
   out = new ObjectOutputStream(byteOut);
   out.writeObject(srcList);
   byteIn = new ByteArrayInputStream(byteOut.toByteArray());
   ois = new SerialKiller(byteIn, "config/serialkiller.conf");
   //原方法放弃
   // ObjectInputStream in = new ObjectInputStream(byteIn);
   // destList = (List<T>) in.readObject();
   destList = (List<T>) ois.readObject();
  } catch (IOException e) {
   LOGGER.error("对象中包含没有继承序列化的对象: " + e.getMessage());
  } catch (ConfigurationException e) {
   LOGGER.error("对象中包含没有继承序列化的对象: " + e.getMessage());
  } catch (ClassNotFoundException e) {
   LOGGER.error("对象中包含没有继承序列化的对象: " + e.getMessage());
  }
  finally{
   try {
    if(ois != null){ois.close();ois =null;}
    if(byteIn != null){byteIn.close();byteIn = null;}
    if(out !=null ){out.close();out = null;}
    if(byteOut != null ){byteOut.close(); byteOut = null;}
   } catch (IOException e) {
    LOGGER.error("对象关闭失败: " + e.getMessage());
   }
  }

  return destList;

 }

转载于:https://my.oschina.net/farces/blog/277488

你可能感兴趣的文章
性能测试工具VTune的功能和用法介绍
查看>>
音频视频组件Audio DJ Studio for .NET更新至v10.0.0.0丨附下载
查看>>
RMAN Complete Recovery
查看>>
[ CodeForces 1064 B ] Equations of Mathematical Magic
查看>>
NYOJ-15:括号匹配(二)
查看>>
首次记录在案的
查看>>
成长路上如何快速升级?你需要强大的自我驱动力
查看>>
C#进阶系列——WebApi 跨域问题解决方案:CORS
查看>>
你真的会玩SQL吗?让人晕头转向的三值逻辑
查看>>
Unity 脚本的未来发展
查看>>
hdu 2055 An easy problem (java)
查看>>
JQuery:JQuery捕获HTML
查看>>
js自动闭合html标签,自动补全html标记
查看>>
cpu进程调度---RT Throttling【转】
查看>>
在MapGuide 的Fusion Viewer的选择面板中显示超链接
查看>>
CentOS7下单机部署RabbltMQ环境的操作记录
查看>>
unity shader tags
查看>>
挺有意思的,队列,先进先出,排队进行!
查看>>
错误:“产品订单的调度参数没有被定义”
查看>>
机器视觉在带钢针孔检测中的应用
查看>>