List的深度序列化Demo

今天项目中出现了这个问题。。。就是使用一个List去进行其他的操作,生成一个新的List。但是却将原来的List的值也给改了。。。这应该是引用传递的问题,查了资料发现这是浅拷贝造成的。(ps:使用addAll()方法是浅拷贝)

网上的定义是:

浅拷贝:被复制对象的任何变量都含有和原来的对象相同的值,而任何的对其他对象的引用仍然指向原来的对象。对拷贝后的引用的修改,还能影响原来的对象。

深拷贝:把要复制的对象所引用的对象都复制了一遍,对现在对象的修改不会影响原有的对象。

然后就照着网上的资料自己写了试试。下边的例子就是深拷贝和浅拷贝得到的不同结果。

 1 package demo01;
 2
 3 import java.io.ByteArrayInputStream;
 4 import java.io.ByteArrayOutputStream;
 5 import java.io.IOException;
 6 import java.io.ObjectInputStream;
 7 import java.io.ObjectOutputStream;
 8 import java.io.Serializable;
 9 import java.util.ArrayList;
10 import java.util.List;
11
12
13 public class DeepCopyDemo {
14
15     public static void printList(List<City> list){
16         for(City t : list){
17             System.out.println("中文: " + t.getName() + "英文:" + t.getEngName());
18         }
19         System.out.println("==================================");
20     }
21
22
23      //深拷贝
24     public static List deepCopy(List src) throws IOException, ClassNotFoundException{
25         ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
26         ObjectOutputStream out = new ObjectOutputStream(byteOut);
27         out.writeObject(src);
28         ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());
29         ObjectInputStream in =new ObjectInputStream(byteIn);
30         List dest = (List)in.readObject();
31         return dest;
32     }
33
34     public static void main(String[] args) throws IOException, ClassNotFoundException {
35         List<City> srcList=new ArrayList<City>();
36         City p1=new City("北京","beijing");
37         City p2=new City("上海","shanghai");
38         City p3=new City("广州","guangzhou");
39         srcList.add(p1);
40         srcList.add(p2);
41         srcList.add(p3);
42
43         List<City> destList=deepCopy(srcList);
44 //        List<City> destList=new ArrayList<City>();
45 //        destList.addAll(srcList);
46         printList(destList);
47         srcList.get(0).setEngName("bj");
48         System.out.println(srcList.get(0) == destList.get(0));
49         printList(destList);
50         printList(srcList);
51
52     }
53
54 }
55
56
57
58
59 class City implements Serializable{
60     private static final long serialVersionUID = -7622835197591599128L;
61     private String engName;
62     private String name;
63
64     public City(){};
65     public City(String name,String engName){
66         this.name=name;
67         this.engName=engName;
68     }
69     public String getEngName() {
70         return engName;
71     }
72     public void setEngName(String engName) {
73         this.engName = engName;
74     }
75     public String getName() {
76         return name;
77     }
78     public void setName(String name) {
79         this.name = name;
80     }
81
82 }

如果像代码中这样的话,就是深拷贝,结果就是这样的(这样的话就不会影响到原来的List):

如果使用注释掉的那两行代码,而不使用现有的这一行(也就是使用addAll()方法)。就会影响“之前的”List,结果是:

这样应该就很明显的看出效果了。

时间: 2024-10-08 18:22:24

List的深度序列化Demo的相关文章

使用JSONObject 深度序列化和反序列化

JSONObject 和JSONArray 是json-lib.jar里面最常用的两个类,分别可以对对象和数组(集合)进行序列化和反序列化,结构清晰命了,简单易用,功能强大,效率比较高,使用至今一直较为推崇,虽然尚有诸多功能尚未完全了解,姑且边学边记,以作归纳.沉淀. 首先看两个类: Student类: public class Student { private String name; private String gerder; private String address; public

导包补充,深度查询(深度序列化),十大接口

目录 一.导包补充 二.深度查询 1. 子序列化和depth方法 (1)什么是子序列化 (2)__all__ 方法 exclude方法 (3)子序列化实例 2. 插拔式 三.十大接口 1. 十大接口中注意点(很重要) 2. 实例 一.导包补充 在导包时,如果用from 文件1 import *,则文件1中的以下划线开头的变量,都不能访问.无论是单下划线还是双下线. 用import 文件1的方式,还是能访问到文件1中以下划线开头的变量,没有影响. 当我们用from 文件1 import *的方式导

ASP.NET 中JSON 的序列化和反序列化

JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式.在网站应用中使用JSON的场景越来越多,本文介绍ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍,ASP.NET如何序列化和反序列化的处理,在序列化和反序列化对日期时间.集合.字典的处理. 一.JSON简介: JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式. JSON是"名值对"的集合.结构由大括号''{}'

ASP.NET中JSON的序列化和反序列化

ASP.NET中JSON的序列化和反序列化 JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式.在网站应用中使用JSON的场景越来越多,本文介绍ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍,ASP.NET如何序列化和反序列化的处理,在序列化和反序列化对日期时间.集合.字典的处理.     一.JSON简介 JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式. JSON是

[转]ASP.NET中JSON的序列化和反序列化

本文转自:http://www.cnblogs.com/zhaozhan/archive/2011/01/09/1931340.html JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式.在网站应用中使用JSON的场景越来越多,本文介绍ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍,ASP.NET如何序列化和反序列化的处理,在序列化和反序列化对日期时间.集合.字典的处理.     一.JSON简介 JSON(JavaScript Objec

转:Json序列化和反序列化

JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式.在网站应用中使用JSON的场景越来越多,本文介绍 ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍,ASP.NET如何序列化和反序列化的处理,在序列化和反序列化对日期时间.集 合.字典的处理.     一.JSON简介 JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式. JSON是“名值对”的集合.结构由大括号'{}',

Asp.net中Json的序列化和反序列化(二)

 三.JSON序列化和反序列化日期时间的处理 JSON格式不直接支持日期和时间.DateTime值值显示为“/Date(700000+0500)/”形式的JSON字符串,其中第一个数字(在提供的示例中为 700000)是 GMT 时区中自 1970 年 1 月 1 日午夜以来按正常时间(非夏令时)经过的毫秒数.该数字可以是负数,以表示之前的时间.示例中包括“+0500”的部分可选,它指示该时间属于Local类型,即它在反序列化时应转换为本地时区.如果没有该部分,则会将时间反序列化为Utc. 修改

Asp.net中Json的序列化和反序列化(一)

JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式.在网站应用中使用JSON的场景越来越多,本文介绍ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍,ASP.NET如何序列化和反序列化的处理,在序列化和反序列化对日期时间.集合.字典的处理.     一.JSON简介 JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式. JSON是“名值对”的集合.结构由大括号'{}',中括

使用Ajax方法提交多个对象数组的问题

当用$.ajax()向后台提交参数时,如果参数中数组的话一般在后台会用List<T>接收;但老是不成功如下面代码 var arr1 = [{ "Name": "Tom", "Age": 17 }, { "Name": "Jim", "Age": 22}]; var arr2 = [{ "Name": "Tom2", "Age&