深度拷贝指的是将一个引用类型(包含该类型里的引用类型)拷贝一份(在内存中完完全全是两个对象,没有任何引用关系)..........  直接上代码:

     /// <summary>
/// 对象的深度拷贝(序列化的方式)
/// </summary>
public static class MyDeepCopy
{ /// <summary>
/// xml序列化的方式实现深拷贝
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="t"></param>
/// <returns></returns>
public static T XmlDeepCopy<T>(T t)
{
//创建Xml序列化对象
XmlSerializer xml = new XmlSerializer(typeof(T));
using (MemoryStream ms = new MemoryStream())//创建内存流
{
//将对象序列化到内存中
xml.Serialize(ms, t);
ms.Position = default;//将内存流的位置设为0
return (T)xml.Deserialize(ms);//继续反序列化
}
} /// <summary>
/// 二进制序列化的方式进行深拷贝
/// 确保需要拷贝的类里的所有成员已经标记为 [Serializable] 如果没有加该特性特报错
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="t"></param>
/// <returns></returns>
public static T BinaryDeepCopy<T>(T t)
{
//创建二进制序列化对象
BinaryFormatter bf = new BinaryFormatter();
using (MemoryStream ms = new MemoryStream())//创建内存流
{
//将对象序列化到内存中
bf.Serialize(ms, t);
ms.Position = default;//将内存流的位置设为0
return (T)bf.Deserialize(ms);//继续反序列化
}
}
}

浅拷贝指的是将该类型里面的值类型拷贝,而该类型里的引用类型不进行拷贝,实现浅拷贝很简单,再该类里编写一个方法,方法内部调用自身的MemberwiseClone()方法即可得到一个object类型的对象,将它强转成当前对象返回即可,列如:

     public class Person
{
public int ID { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public Cat Cat { get; set; } /// <summary>
/// Person类的浅拷贝
/// </summary>
/// <returns></returns>
public Person QainClone()
{
//调用自带的浅拷贝方法得到的是一个objec类型的对象,然后强转直接返回就可以了
return MemberwiseClone() as Person;
}
}

string是个列外

C#中实现对象的深拷贝的更多相关文章

  1. js中json对象的深拷贝

    /** * 对象深拷贝 * @param obj */ function deepCopy(obj) { var txt=JSON.stringify(obj); return JSON.parse( ...

  2. JS中有关对象的继承以及实例化、浅拷贝深拷贝的奥秘

    一.属性的归属问题 JS对象中定义的属性和方法如果不是挂在原型链上的方法和属性(直接通过如类似x的方式进行定义)都只是在该对象上,对原型链上的没有影响.对于所有实例共用的方法可直接定义在原型链上这样实 ...

  3. JS中如何进行对象的深拷贝

    在JS中,一般的=号传递的都是对象/数组的引用,并没有真正地拷贝一个对象,那如何进行对象的深度拷贝呢?如果你对此也有疑问,这篇文章或许能够帮助到你 一.对象引用.浅层拷贝与深层拷贝的区别 js的对象引 ...

  4. PHP中对象的深拷贝与浅拷贝

    先说一下深拷贝和浅拷贝通俗理解 深拷贝:赋值时值完全复制,完全的copy,对其中一个作出改变,不会影响另一个 浅拷贝:赋值时,引用赋值,相当于取了一个别名.对其中一个修改,会影响另一个 PHP中, = ...

  5. 利用html5中json的方法做对象的深拷贝解决引用的相互干扰

    var a=[name:'zs']; var str=Json.stringify(a); var b=Json.parse(str);//这里是将一个新对象赋值给b.与a没有引用同一个对象 b.na ...

  6. 谈谈java中对象的深拷贝与浅拷贝

    知识点:java中关于Object.clone方法,对象的深拷贝与浅拷贝 引言: 在一些场景中,我们需要获取到一个对象的拷贝,这时候就可以用java中的Object.clone方法进行对象的复制,得到 ...

  7. 探究JS中对象的深拷贝和浅拷贝

    深拷贝和浅拷贝的区别 在讲深拷贝和浅拷贝的区别之前,回想一下我们平时拷贝一个对象时是怎么操作的?是不是像这样? var testObj1 = {a: 1, b:2}, testObj2=testObj ...

  8. js中的浅拷贝和深拷贝

    说说最近所学:浅拷贝和深拷贝也叫做浅克隆和深克隆,深浅主要针对的是对象的"深度",常见的对象都是"浅"的,也就是对象里的属性就是单个的属性,而"深&q ...

  9. C#对象的深拷贝与浅拷贝

    转载自:http://blog.163.com/hr_msn/blog/static/21549405120132250396584/ 深拷贝是指源对象与拷贝对象互相独立,其中任何一个对象的改动都不会 ...

随机推荐

  1. Android 包信息工具类

    /** AndroidInfoUtils:安卓游戏包信息工具类**/ 1 public class AndroidInfoUtils { @SuppressWarnings("uncheck ...

  2. aria2自动更新BT Tracker服务器列表脚本

    vi /root/trackers-list-aria2.sh 内容如下: #!/bin/bash #/usr/sbin/service aria2 stop list=`wget -qO- http ...

  3. js中获取父节点,兄弟节点及处理属性节点

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  4. 在VMware Workstation中安装Ubuntu Server 16.04.5图解教程

    最近要在Ubuntu中部署openstack,为了节省空间和内存,最终选择了Ubuntu服务器.看了很多前辈和大佬的安装教程,在这里记录一下我自己的Ubuntu Server 16.04.5的安装过程 ...

  5. jquery中的trigger()和preventDefault()方法

    trigger()方法用户模拟用户操作,比较常见的一种情况就是输入框自动获得焦点: <!doctype html> <html> <head> <meta c ...

  6. php 共享内存学习(APC扩展)

    问题:希望可以在进程间共享变量,为共享数据提供快速访问 解决方案:使用APC扩展的数据存储功能 (cli模式下没有作用) //获取原来的值 $population = apc_fetch('popul ...

  7. Luogu 4449 于神之怒加强版

    挺套路的题,然而一开始还是想错了…… $\sum_{i = 1}^{n}\sum_{j = 1}^{m}gcd(i, j) ^ {k} = \sum_{T = 1}^{min(n, m)}\left ...

  8. 关于流程图设计,你需要Get的几点必备知识

    流程图(Flow Chart)这个概念对很多人来说并不陌生,但如果让你定义或者举例说明什么是产品流程图,恐怕还是有难度的.或许诸如“用户体验”.“交互设计”.“逻辑关系”等词会像走马灯般闪现在你的脑海 ...

  9. Socket发送文件

    .Net.cs using System; using System.Collections.Generic; using System.IO; using System.Linq; using Sy ...

  10. 禁止进入activity自动弹出键盘

    禁止进入activity自动弹出键盘 在Manifest.xml中设定activity的属性 android:windowSoftInputMode="stateHidden|stateUn ...