C#中实现对象的深拷贝

简介: 原文:C#中实现对象的深拷贝深度拷贝指的是将一个引用类型(包含该类型里的引用类型)拷贝一份(在内存中完完全全是两个对象,没有任何引用关系)..........  直接上代码: 1 /// 2 /// 对象的深度拷贝(序列化的方式) 3 /// 4 ...
原文: C#中实现对象的深拷贝

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

 1     /// <summary>
 2     /// 对象的深度拷贝(序列化的方式)
 3     /// </summary>
 4     public static class MyDeepCopy
 5     {
 6 
 7         /// <summary>
 8         /// xml序列化的方式实现深拷贝
 9         /// </summary>
10         /// <typeparam name="T"></typeparam>
11         /// <param name="t"></param>
12         /// <returns></returns>
13         public static T XmlDeepCopy<T>(T t)
14         {
15             //创建Xml序列化对象
16             XmlSerializer xml = new XmlSerializer(typeof(T));
17             using (MemoryStream ms = new MemoryStream())//创建内存流
18             {
19                 //将对象序列化到内存中
20                 xml.Serialize(ms, t);
21                 ms.Position = default;//将内存流的位置设为0
22                 return (T)xml.Deserialize(ms);//继续反序列化
23             }
24         }
25 
26         /// <summary>
27         /// 二进制序列化的方式进行深拷贝
28         /// 确保需要拷贝的类里的所有成员已经标记为 [Serializable] 如果没有加该特性特报错
29         /// </summary>
30         /// <typeparam name="T"></typeparam>
31         /// <param name="t"></param>
32         /// <returns></returns>
33         public static T BinaryDeepCopy<T>(T t)
34         {
35             //创建二进制序列化对象
36             BinaryFormatter bf = new BinaryFormatter();
37             using (MemoryStream ms = new MemoryStream())//创建内存流
38             {
39                 //将对象序列化到内存中
40                 bf.Serialize(ms, t);
41                 ms.Position = default;//将内存流的位置设为0
42                 return (T)bf.Deserialize(ms);//继续反序列化
43             }
44         }
45     }
View Code

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

 1     public class Person
 2     {
 3         public int ID { get; set; }
 4         public string Name { get; set; }
 5         public string Email { get; set; }
 6         public Cat Cat { get; set; }
 7 
 8         /// <summary>
 9         /// Person类的浅拷贝
10         /// </summary>
11         /// <returns></returns>
12         public Person QainClone()
13         {
14             //调用自带的浅拷贝方法得到的是一个objec类型的对象,然后强转直接返回就可以了
15             return MemberwiseClone() as Person;
16         }
17     }
View Code

string是个列外

目录
相关文章
|
C# 数据格式 XML
.NET[C#]中实现实体对象深拷贝(克隆/复制)的几种方法
.NET[C#]中实现实体对象深拷贝(克隆/复制)的几种方法,总有一种适合你。 方式一 使用二进制流 using System; using System.IO; using System.Runtime.
4036 0
|
存储 C#
C#序列化实现深拷贝及原理
一、基本概念 1、深拷贝 深拷贝要求将要clone的对象的引用类型成员对象也拷贝到新对象中,而不是拷贝这些对象的引用(浅拷贝)。 2、序列化 将对象或对象图形转换成线性字节序列,以存储或传输到另一个位置的过程。
1249 0
|
C#
编写高质量代码改善C#程序的157个建议[为类型输出格式化字符串、实现浅拷贝和深拷贝、用dynamic来优化反射]
前言   本文已更新至http://www.cnblogs.com/aehyok/p/3624579.html 。本文主要学习记录以下内容:   建议13、为类型输出格式化字符串   建议14、正确实现浅拷贝和深拷贝   建议15、使用dynamic来简化反射实现 建议13、为类型输出格式化字符串    有两种方法可以为类型提供格式化的字符串输出。
791 0
|
C# C++ 编译器
浅析C#深拷贝与浅拷贝(转)
1.深拷贝与浅拷贝   拷贝即是通常所说的复制(Copy)或克隆(Clone),对象的拷贝也就是从现有对象复制一个“一模一样”的新对象出来。虽然都是复制对象,但是不同的 复制方法,复制出来的新对象却并非完全一模一样,对象内部存在着一些差异。
1249 0
|
C#
编写高质量代码改善C#程序的157个建议[为类型输出格式化字符串、实现浅拷贝和深拷贝、用dynamic来优化反射]
原文:编写高质量代码改善C#程序的157个建议[为类型输出格式化字符串、实现浅拷贝和深拷贝、用dynamic来优化反射] 前言   本文已更新至http://www.cnblogs.com/aehyok/p/3624579.html 。
834 0