经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C# » 查看文章
C#深拷贝方法
来源:cnblogs  作者:Denny·Qi  时间:2022/12/12 18:52:55  对本文有异议
  • 概述

 

  为什么要用到深拷贝呢?比如我们建了某个类Person,并且实例化出一个对象,然后,突然需要把这个对象复制一遍,并且复制出来的对象要跟之前的一模一样,来看下我们一般会怎么做。

  • 方法一(利用反射实现)
    1. public static T DeepCopy<T>(T obj)
    2. {
    3. //如果是字符串或值类型则直接返回
    4. if (obj is string || obj.GetType().IsValueType) return obj;
    5.  
    6. object retval = Activator.CreateInstance(obj.GetType());
    7. FieldInfo[] fields = obj.GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);
    8. foreach (FieldInfo field in fields)
    9. {
    10. try { field.SetValue(retval, DeepCopy(field.GetValue(obj))); }
    11. catch { }
    12. }
    13. return (T)retval;
    14. }

     

  • 方法二(利用XML序列化和反序列化实现)

    1. public T DeepCopy<T>(T obj)
    2. {
    3. object retval;
    4. using (MemoryStream ms = new MemoryStream())
    5. {
    6. XmlSerializer xml = new XmlSerializer(typeof(T));
    7. xml.Serialize(ms, obj);
    8. ms.Seek(0, SeekOrigin.Begin);
    9. retval = xml.Deserialize(ms);
    10. ms.Close();
    11. }
    12. return (T)retval;
    13. }

     

  • 方法三(利用二进制序列化和反序列实现)

    1. public static T DeepCopy<T>(T obj)
    2. {
    3. object retval;
    4. using (MemoryStream ms = new MemoryStream())
    5. {
    6. BinaryFormatter bf = new BinaryFormatter();
    7. //序列化成流
    8. bf.Serialize(ms, obj);
    9. ms.Seek(0, SeekOrigin.Begin);
    10. //反序列化成对象
    11. retval = bf.Deserialize(ms);
    12. ms.Close();
    13. }
    14. return (T)retval;
    15. } 
  • 方法四(DataContractSerializer实现)
    1. //利用silverlight DataContractSerializer实现,用于在silverlight 客户端使用
    2. public static T DeepCopy<T>(T obj)
    3. {
    4. object retval;
    5. using (MemoryStream ms = new MemoryStream())
    6. {
    7. DataContractSerializer ser = new DataContractSerializer(typeof(T));
    8. ser.WriteObject(ms, obj);
    9. ms.Seek(0, SeekOrigin.Begin);
    10. retval = ser.ReadObject(ms);
    11. ms.Close();
    12. }
    13. return (T)retval;

      


原文链接:https://www.cnblogs.com/Denny-Qi/p/16976867.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号