zoukankan      html  css  js  c++  java
  • C#中实现对象的深拷贝

    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     }

    浅拷贝指的是将该类型里面的值类型拷贝,而该类型里的引用类型不进行拷贝,实现浅拷贝很简单,再该类里编写一个方法,方法内部调用自身的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     }

    string是个列外

  • 相关阅读:
    java.lang.ClassNotFoundException: org.jaxen.JaxenException
    hdu 4882 ZCC Loves Codefires(贪心)
    C++ STL 源代码学习(之deque篇)
    算法导论学习笔记(2)-归并排序
    机器学习方法:回归(一):线性回归Linear regression
    HDU 2028 Lowest Common Multiple Plus
    C++11新特性应用--实现延时求值(std::function和std::bind)
    大数减法
    hive 运行sqlclient异常
    Oracle 12c agent install for windows
  • 原文地址:https://www.cnblogs.com/grj001/p/12224135.html
Copyright © 2011-2022 走看看