c# 实现深层复制的3中方法

1:利用反射实现

public static T DeepCopy<T>(T obj)

{

  //如果是字符串或值类型则直接返回

  if (obj is string || obj.GetType().IsValueType) return obj;

  object retval = Activator.CreateInstance(obj.GetType());

  FieldInfo[] fields = obj.GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);

  foreach (FieldInfo field in fields)

  {

    try { field.SetValue(retval, DeepCopy(field.GetValue(obj))); }

    catch { }

  }

  return (T)retval;

}

   

2:利用xml序列化和反序列化实现

  public T DeepCopy<T>(T obj)

    {

      object retval;

      using (MemoryStream ms = new MemoryStream())

      {

        XmlSerializer xml = new XmlSerializer(typeof(T));

        xml.Serialize(ms, obj);

        ms.Seek(0, SeekOrigin.Begin);

        retval = xml.Deserialize(ms);

        ms.Close();

      }

      return (T)retval;

    }

   

3:利用二进制序列化和反序列化实现

public static T DeepCopy<T>(T obj)

{

  object retval;

  using (MemoryStream ms = new MemoryStream())

  {

    BinaryFormatter bf = new BinaryFormatter();

    //序列化成流

    bf.Serialize(ms, obj);

    ms.Seek(0, SeekOrigin.Begin);

    //反序列化成对象

    retval = bf.Deserialize(ms);

    ms.Close();

  }

  return (T)retval;

}

   
时间: 2024-11-06 09:06:11

c# 实现深层复制的3中方法的相关文章

C#数字图像处理算法学习笔记(一)--C#图像处理的3中方法

C#数字图像处理算法学习笔记(一)--C#图像处理的3中方法 Bitmap类:此类封装了GDI+中的一个位图,次位图有图形图像及其属性的像素数据组成.因此此类是用于处理像素数据定义的图形的对象.该类的主要方法和属性如下:  GetPixel与SetPixel方法:获取或设置一个图像的指定像素的颜色. PixelFormat属性:返回图像的像素格式. Height和Width:返回图像的高度和宽度. LockBits与UnLockBits方法:分别锁定和解锁系统内存中的位图像素. LockBits

javascript 数组以及对象的深拷贝(复制数组或复制对象)的方法

javascript 数组以及对象的深拷贝(复制数组或复制对象)的方法 前言 在js中,数组和对象的复制假设使用=号来进行复制.那仅仅是浅拷贝. 例如以下图演示: 如上.arr的改动,会影响arr2的值,这显然在绝大多数情况下,并非我们所须要的结果. 因此,数组以及对象的深拷贝就是javascript的一个基本功了. 数组的深拷贝 条条大道通罗马,实现数组的深拷贝.是有好几种方法的.举比例如以下: for 循环实现数组的深拷贝 for循环是很好用的.假设不知道高级方法.通过for循环可以完毕我们

深层复制构造函数--初识

浅层复制构造函数会产生迷途指针,进而造成程序崩溃,所以,我们需要用深层复制构造函数来解决这个问题 #include <iostream> using namespace std; class A { public: A() { x = new int; *x = 5; } ~A() { delete x; x = NULL; } //删除指针后,紧接着就要把指针设置为 NULL,养成这样的习惯 A(const A&a) //深层复制构造函数 { cout << "

JAVA文件夹导入到Eclipse中方法:

将JAVA文件夹导入到Eclipse中方法:方法一: 直接将java文件夹复制,然后粘贴到项目下:方法二:1.打开eclipse,点击项目的空白处,选择import:2.选择Existing Project into Workspace,点击next,找到下载的java代码,导入到eclipse中. 选到你要导入的文件,然后Finish就可以了

如何把一个Array 复制到ArrayList中?

如何把一个Array 复制到ArrayList中? string[] array = new string[]{" 1", "2"," 3", "4"," 5" }; ArrayList list = new ArrayList();一:使用for循环,将array数组中的数据逐步加入到ArrayList的对象中: //1.for循环            for (int i = 0; i < ar

Android TextView实现长按复制文本功能的方法

上网查询Android开发实现长按复制文本功能的方法很多,有什么改写系统长按响应,有用EditView控件替换TextView的方法,还有自定义控件什么的,总之都比较麻烦,而且效果也不好. 其实现在新的Android开发只需要增加一行代码就可以实现这个功能,在布局文件的TextView控件属性中增加这么一句就行:android:textIsSelectable="true" 但查询资料说只有android sdk 11起才支持,v11以下则不行了.我测试了一下在Android4没问题,

java数组对象的浅层复制与深层复制

实际上,java中数组对象的浅层复制只是复制了对象的引用(参考),而深层复制的才是对象所代表的值.

对JVM虚拟机中方法区的理解

因为jdk8的jvm已经取消了方法区,所以这边先主要介绍jdk8以下版本中方法区相关内容. 1.虚拟机规范中方法区的概念: 原文链接:http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html#jvms-2.5.4 The method area is analogous to the storage area for compiled code of a conventional language or analogous to

深入理解Java中方法的参数传递机制

形参和实参 我们知道,在Java中定义方法时,是可以定义参数的,比如: public static void main(String[] args){ } 这里的args就是一个字符串数组类型的参数. 在程序设计语言中,参数有形式参数和实际参数之分,先来看下它们的定义: 形式参数:是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数,简称"形参". 实际参数:在主调函数中调用一个函数时,函数名后面括号中的参数称为"实际参数",简称"