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#,深拷贝
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
基于Springboot+Junit+Mockito做单元测试的示例
2023-01-03 21:15:51
C# Newtonsoft.Json 解析多嵌套json 进行反序列化的实例
2022-04-09 11:23:13
![](https://img.aspxhome.com/file/2023/1/71061_0s.jpg)
详解Java中Dijkstra(迪杰斯特拉)算法的图解与实现
2023-05-03 18:35:24
![](https://img.aspxhome.com/file/2023/9/99899_0s.png)
android实现歌词自动滚动效果
2022-03-16 17:09:10
![](https://img.aspxhome.com/file/2023/7/138797_0s.jpg)
Android SQLite数据库的增 删 查找操作
2023-02-09 09:47:25
![](https://img.aspxhome.com/file/2023/9/99809_0s.png)
C# 获取打印机当前状态的方法
2021-09-29 19:54:43
2021年最新Redis面试题汇总(3)
2022-02-27 13:31:22
![](https://img.aspxhome.com/file/2023/1/73071_0s.jpg)
WinForm天猫双11自动抢红包源码分享
2023-02-09 16:23:19
![](https://img.aspxhome.com/file/2023/8/104238_0s.png)
MyBatis-Plus不使用数据库默认值的问题及解决
2023-11-13 17:37:20
![](https://img.aspxhome.com/file/2023/9/59499_0s.png)
C#实现winform渐变效果的方法
2023-03-14 00:26:06
Android广播实现App开机自启动
2023-01-06 14:54:44
Java实现在线聊天功能
2021-10-18 22:16:23
![](https://img.aspxhome.com/file/2023/4/91094_0s.gif)
Java十分钟精通类 封装 继承
2023-11-25 10:55:58
JVM Client和Server端有什么区别
2023-08-05 22:49:53
![](https://img.aspxhome.com/file/2023/5/64385_0s.png)
SpringBoot微信消息接口配置详解
2023-08-23 09:51:21
![](https://img.aspxhome.com/file/2023/2/58422_0s.jpg)
详解SpringBoot中的tomcat优化和修改
2022-12-31 04:00:44
Javaweb中Request获取表单数据的四种方法详解
2023-10-07 03:07:02
![](https://img.aspxhome.com/file/2023/6/72606_0s.png)
java中sdk与jdk的区别详细解析
2023-11-25 03:37:14
ASP.NET MVC 5使用X.PagedList.Mvc进行分页教程(PagedList.Mvc)
2023-09-23 08:02:41
![](https://img.aspxhome.com/file/2023/0/85770_0s.png)
第一次编写Java流布局图形界面
2023-10-13 08:27:11
![](https://img.aspxhome.com/file/2023/5/71865_0s.jpg)