C#中4种深拷贝方法介绍

作者:junjie 时间:2023-01-02 21:16:11 

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;
}

4:利用silverlight DataContractSerializer实现,用于在silverlight 客户端使用


public static T DeepCopy<T>(T obj)
   {
     object retval;
     using (MemoryStream ms = new MemoryStream())
     {
       DataContractSerializer ser = new DataContractSerializer(typeof(T));
       ser.WriteObject(ms, obj);
       ms.Seek(0, SeekOrigin.Begin);
       retval = ser.ReadObject(ms);
       ms.Close();
     }
     return (T)retval;

补充:第一个已经通过递归实现了深拷贝。

标签:C#,深拷贝
0
投稿

猜你喜欢

  • 基于Springboot+Junit+Mockito做单元测试的示例

    2023-01-03 21:15:51
  • C# Newtonsoft.Json 解析多嵌套json 进行反序列化的实例

    2022-04-09 11:23:13
  • 详解Java中Dijkstra(迪杰斯特拉)算法的图解与实现

    2023-05-03 18:35:24
  • android实现歌词自动滚动效果

    2022-03-16 17:09:10
  • Android SQLite数据库的增 删 查找操作

    2023-02-09 09:47:25
  • C# 获取打印机当前状态的方法

    2021-09-29 19:54:43
  • 2021年最新Redis面试题汇总(3)

    2022-02-27 13:31:22
  • WinForm天猫双11自动抢红包源码分享

    2023-02-09 16:23:19
  • MyBatis-Plus不使用数据库默认值的问题及解决

    2023-11-13 17:37:20
  • C#实现winform渐变效果的方法

    2023-03-14 00:26:06
  • Android广播实现App开机自启动

    2023-01-06 14:54:44
  • Java实现在线聊天功能

    2021-10-18 22:16:23
  • Java十分钟精通类 封装 继承

    2023-11-25 10:55:58
  • JVM Client和Server端有什么区别

    2023-08-05 22:49:53
  • SpringBoot微信消息接口配置详解

    2023-08-23 09:51:21
  • 详解SpringBoot中的tomcat优化和修改

    2022-12-31 04:00:44
  • Javaweb中Request获取表单数据的四种方法详解

    2023-10-07 03:07:02
  • java中sdk与jdk的区别详细解析

    2023-11-25 03:37:14
  • ASP.NET MVC 5使用X.PagedList.Mvc进行分页教程(PagedList.Mvc)

    2023-09-23 08:02:41
  • 第一次编写Java流布局图形界面

    2023-10-13 08:27:11
  • asp之家 软件编程 m.aspxhome.com