ArrayList 的深拷贝Demo
来源:互联网 发布:真真假假的程序员之死 编辑:程序博客网 时间:2024/06/04 18:35
一直以来都是取,从来没有馈过,呵呵,现在把日常的一些小积累贡献出来吧。
关于包含自定义类元素的ArrayList的深拷贝问题,相信大家都遇到过。看了一些前人的经验,发现常用的主要有两类:
1. 在需要进行ArrayList实例传递的时候,依次拷贝自定义类中的所有属性,然后添加到新的ArrayList实例中。
2. 利用序列化以及反序列化的方法。将需要传递的ArrayList实例序列化到内存中,然后再从内存中取出并反序列化。
序列化自定义类的时候,必须在类的定义前加上[Serializable]。 为了演示,自己做了一个小DEMO。主要功能是,点击ForStruct面板,传递一个Arraylist的参数给ForGrow面板,然后在ForGrow面板上对ArrayList实例进行修改以及初始值的获取,并在DataGridView中显示出来。如下:
自定义的Tree类:
[Serializable] class Tree { private int no; public int No { get { return no; } set { no = value; } } private int age; public int Age { get { return age; } set { age = value; } } }
ForStruct面板:
public partial class ForStruct : Form { public ForStruct() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Tree tree1 = new Tree(); Tree tree2 = new Tree(); tree1.No = 1; tree1.Age = 10; tree2.No = 2; tree2.No = 12; ArrayList trees = new ArrayList(); trees.Add(tree1); trees.Add(tree2); ForGrow fg = new ForGrow(trees); fg.Show(); } }
ForGrow面板:
public partial class ForGrow : Form { ArrayList treeData = new ArrayList(); public ForGrow(ArrayList trees) { InitializeComponent(); treeData = trees; } int countRun = 0; ArrayList treeTemp = new ArrayList(); private void button1_Click(object sender, EventArgs e) { countRun++; treeTemp = ArrayListCopy.createData(treeData); ((Tree)treeTemp[0]).Age = 20 + countRun * 5; ((Tree)treeTemp[1]).Age = 32 + countRun * 5; ForData fd = new ForData(treeTemp); fd.Show(); fd.Text = countRun.ToString(); } private void button2_Click(object sender, EventArgs e) { ForData fd = new ForData(treeData); fd.Show(); fd.Text = "初始值!"; } }
ArrayListCopy类:
class ArrayListCopy { public static ArrayList createData(ArrayList treesSource) { ArrayList dataTemp = new ArrayList(); ArrayList treesCopy = new ArrayList(); for (int i = 0; i < treesSource.Count; i++) { dataTemp.Add((Tree)treesSource[i]); } treesCopy = (ArrayList)CloneObject(dataTemp); return treesCopy; } private static object CloneObject(object obj) { MemoryStream ms = new MemoryStream(); object CloneObject; BinaryFormatter bf = new BinaryFormatter(null, new StreamingContext(StreamingContextStates.Clone)); bf.Serialize(ms, obj); ms.Seek(0, SeekOrigin.Begin); CloneObject = bf.Deserialize(ms); ms.Close(); return CloneObject; } }
ForData面板:
public partial class ForData : Form { public ForData(ArrayList data) { InitializeComponent(); this.dataGridView1.DataSource = data; } private void ForData_Activated(object sender, EventArgs e) { this.Refresh(); } }
ForStruct面板
ForGrow面板
ForData面板
效果有点粗糙,见谅,呵呵,主要是想表达清楚一个意思。
- ArrayList 的深拷贝Demo
- ArrayList的深拷贝
- ArrayList的深拷贝与浅拷贝
- ArrayList深拷贝的一种实现方法
- ArrayList深拷贝的一种实现方法
- ArrayList深拷贝的一种实现方法
- ArrayList的深浅拷贝。
- 深拷贝ArrayList实例
- 精简深拷贝ArrayList实例
- 【转】ArrayList深拷贝的一种实现方法
- js 深拷贝与浅拷贝Demo
- ArrayList拷贝
- 利用串行化实现ArrayList深拷贝
- java中ArrayList深拷贝有关问题
- java中ArrayList深拷贝有关问题
- Java中的深拷贝与浅拷贝ArrayList
- C# ArrayList深度拷贝
- java拷贝ArrayList
- DS1339
- 异常解析
- 使用Intel编译器(1)并行化(4)向导自动并行化(GAP)
- Mal/VB-FQD spy
- 编译Linux内核数
- ArrayList 的深拷贝Demo
- SQL SERVER 与ACCESS、EXCEL的数据转换
- ssh中“Host key verification failed.“的解决方案
- Android 开源项目 地址
- vlan设置
- 删掉从svn 文件夹里复制出来所带的信息(去掉.svn文件夹)
- 水晶报表字符串字体大小根据字数调整
- 网购网站常用jquery图片放大
- BeanUtils.copyProperties与PropertyUtils.copyPropert