.NET 中的深拷贝实现方法详解
在 .NET 中实现深拷贝(Deep Copy)有几种常用方法,深拷贝是指创建一个新对象,并递归地复制原对象及其所有引用对象,而不仅仅是复制引用。
1. 使用序列化/反序列化
using System; using System.IO; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; public static class ObjectCopier { public static T DeepCopy<T>(T obj) { if (!typeof(T).IsSerializable) { throw new ArgumentException("The type must be serializable.", nameof(obj)); } if (ReferenceEquals(obj, null)) { return default; } IFormatter formatter = new BinaryFormatter(); using (var stream = new MemoryStream()) { formatter.Serialize(stream, obj); stream.Seek(0, SeekOrigin.Begin); return (T)formatter.Deserialize(stream); } } }
2. 使用 JSON 序列化(Newtonsoft.Json 或 System.Text.Json)
// 使用 Newtonsoft.Json using Newtonsoft.Json; public static T DeepCopy<T>(T obj) { var json = JsonConvert.SerializeObject(obj); return JsonConvert.DeserializeObject<T>(json); } // 使用 System.Text.Json (推荐.NET Core 3.0+) using System.Text.Json; public static T DeepCopy<T>(T obj) { var json = JsonSerializer.Serialize(obj); return JsonSerializer.Deserialize<T>(json); }
3. 实现 ICloneable 接口(手动实现)
public class MyClass : ICloneable { public int Value { get; set; } public MyOtherClass Other { get; set; } public object Clone() { var copy = (MyClass)MemberwiseClone(); // 浅拷贝 copy.Other = (MyOtherClass)Other.Clone(); // 深拷贝引用类型 return copy; } } public class MyOtherClass : ICloneable { public string Name { get; set; } public object Clone() { return MemberwiseClone(); // 浅拷贝(因为只有值类型) } }
4. 使用 AutoMapper(适用于复杂对象)
5. 注意事项
- 序列化方法要求所有相关类都是可序列化的(有
[Serializable]
特性或可以被 JSON 序列化) - 循环引用可能导致堆栈溢出或序列化异常
- 性能考虑:对于大型对象图,序列化方法可能较慢
- 某些特殊类型(如委托、COM 对象)可能无法正确拷贝
上一篇:Asp.NET Core WebApi 配置文件详细说明
栏 目:ASP.NET
本文标题:.NET 中的深拷贝实现方法详解
本文地址:https://fushidao.cc/wangluobiancheng/23808.html
您可能感兴趣的文章


阅读排行
推荐教程
- 07-25在 .NET 中 使用 ANTLR4构建语法分析器的方法
- 07-25ASP.NET中Onclick与OnClientClick遇到的问题
- 07-25Asp.NET Core WebApi 配置文件详细说明
- 07-25ASP.NET Core 模型验证消息的本地化新姿势详解
- 03-31详解如何在.NET代码中使用本地部署的Deepseek语言模型
- 07-25.NET Core 实现缓存的预热的方式
- 07-25.NET根据文件的哈希值筛选重复文件的实现思路
- 07-25.NET 中的深拷贝实现方法详解
- 07-25Math.NET Numerics 开源数学库安装使用详解
- 07-25.NET WPF 可视化树(Visual Tree)详解