- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
深拷贝是指创建一个新对象,该对象的值与原始对象完全相同,但在内存中具有不同的地址。这意味着如果您对原始对象进行更改,则不会影响到复制的对象 。
常见的C#常见的深拷贝方式有以下4类:
ICloneable
接口,重写 Colne
方法。方法内部可以调用上面任意实现方法。 可以使用 BinaryFormatter 类将对象序列化成二进制形式并保存到文件或内存流中,然后再使用 BinaryFormatter 反序列化对象,这样就可以得到该对象的一个完全独立的副本.
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
public static T DeepCopy<T>(T obj)
{
if (obj == null)
{
return default(T);
}
MemoryStream stream = new MemoryStream();
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, obj);
stream.Seek(0, SeekOrigin.Begin);
T copy = (T)formatter.Deserialize(stream);
stream.Close();
return copy;
}
可以使用 XmlSerializer 类将对象序列化成 XML 形式并保存到文件或内存流中,然后再使用 XmlSerializer 反序列化对象,这样也可以得到该对象的一个完全独立的副本.
using System.IO;
using System.Xml.Serialization;
public static T DeepCopy<T>(T obj)
{
if (obj == null)
{
return default(T);
}
XmlSerializer serializer = new XmlSerializer(typeof(T));
MemoryStream stream = new MemoryStream();
serializer.Serialize(stream, obj);
stream.Seek(0, SeekOrigin.Begin);
T copy = (T)serializer.Deserialize(stream);
stream.Close();
return copy;
}
可以使用 DataContractSerializer 类将对象序列化成 XML 或二进制形式并保存到文件或内存流中,然后再使用 DataContractSerializer 反序列化对象.
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using System.Runtime.Serialization.Formatters.Binary;
public static T DeepCopy<T>(T obj)
{
if (obj == null)
{
return default(T);
}
DataContractSerializer serializer = new DataContractSerializer(typeof(T));
MemoryStream stream = new MemoryStream();
serializer.WriteObject(stream, obj);
stream.Seek(0, SeekOrigin.Begin);
T copy = (T)serializer.ReadObject(stream);
stream.Close();
return copy;
}
可以使用 JsonConvert 类将对象序列化成 JSON 字符串,然后再使用 JsonConvert 反序列化对象.
using Newtonsoft.Json;
public static T DeepCopy<T>(T obj)
{
if (obj == null)
{
return default(T);
}
string json = JsonConvert.SerializeObject(obj);
T copy = JsonConvert.DeserializeObject<T>(json);
return copy;
}
using System.Text.Json;
public static T DeepCopy<T>(T obj)
{
if (obj == null)
{
return default(T);
}
string jsonString = JsonSerializer.Serialize<T>(obj);
// 将 JSON 字符串反序列化为对象
var deserializedPerson = JsonSerializer.Deserialize<T>(jsonString);
return deserializedPerson;
}
通过反射生成对象,通过反射机制获取该对象的所有字段和属性信息。遍历所有字段和属性,以递归方式将源对象中的值复制到目标对象中.
using System;
using System.Reflection;
public static T DeepCopy<T>(T obj)
{
if (obj == null)
{
return default(T);
}
Type type = obj.GetType();
object copy = Activator.CreateInstance(type);
// 获取所有字段和属性信息,并将源对象中的值复制到目标对象中
foreach (FieldInfo fieldInfo in type.GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public))
{
object value = fieldInfo.GetValue(obj);
fieldInfo.SetValue(copy, DeepCopy(value));
}
foreach (PropertyInfo propertyInfo in type.GetProperties(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public))
{
if (!propertyInfo.CanWrite || !propertyInfo.CanRead)
{
continue;
}
object value = propertyInfo.GetValue(obj);
propertyInfo.SetValue(copy, DeepCopy(value));
}
return (T)copy;
}
可以手动编写代码复制对象中的所有成员变量,这需要对对象结构有很好的了解,并且比较繁琐,容易漏掉某些成员.
public class Person
{
public string Name;
public int Age;
public Person DeepCopy()
{
Person copy = new Person();
copy.Name = this.Name;
copy.Age = this.Age;
return copy;
}
}
可以在对象中实现 ICloneable 接口,并重写 Clone 方法来实现深拷贝。重写的 Clone 方法内可以调用上述任何一种方案.
public class Person : ICloneable
{
public string Name;
public int Age;
public object Clone()
{
Person copy = new Person();
copy.Name = this.Name;
copy.Age = this.Age;
return copy;
}
}
还有一种方式是使用第三方库实现深拷贝,例如 AutoMapper、ValueInjecter 等。这些库可以自动复制对象中的所有成员变量,从而实现深拷贝。 其中比较常用的包括:
AutoMapper:这是一个非常流行的对象映射库,可以用于将一个对象的属性值复制到另一个对象中,从而实现对象深拷贝.
Newtonsoft.Json:这是一个广泛使用的 JSON 序列化/反序列化库,它也提供了一些方法来实现对象深拷贝.
Cloneable:这是一个专门为 .NET 平台设计的对象克隆库,它提供了多种深拷贝和浅拷贝的方式.
FastDeepCloner:这是一个高性能的对象复制库,它支持对任意类型进行深拷贝,并且提供了多种可配置选项.
可以需要根据自己的具体需求选择适合自己的库。如果只是需要简单的深拷贝操作,那么 AutoMapper 和 Newtonsoft.Json 都是不错的选择;如果需要更加高效、灵活的操作,那么可以考虑使用 FastDeepCloner 或 Cloneable 等库.
最后此篇关于解读---深拷贝的文章就讲到这里了,如果你想了解更多关于解读---深拷贝的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我有一个基类和两个派生类,我需要将一个指向派生类对象的指针复制到另一个类中,就像示例一样。 class Base { public: Base(const Base& other); } cl
考虑 Container 类,它主要存储 Box 对象的 unique_ptr vector ,并可以对它们执行一些计算。 class Container { private: std::
引用是指保存的值为对象的地址。在 Python 语言中,一个变量保存的值除了基本类型保存的是值外,其它都是引用,因此对于它们的使用就需要小心一些。下面举个例子: 问题描述:已知一个列表,求生成一个
我正在尝试实现 Bron-Kerbosch 算法,这是一种用于查找派系的递归算法。我设法达到了一个点,它返回了正确数量的派系,但是当我打印它们时,它们不正确 - 添加了额外的节点。我在这里遗漏了什么明
在评估中,我选择了选项LINE I 上的运行时错误。没有未定义行为这样的选项,尽管我认为这是正确的选择。 我不确定,但我认为评估有误。我编译并运行了该程序,它确实打印了 3, 9, 0, 2, 1,
在函数签名中通过 const 值传递参数是否有任何好处(或相反,成本)? 所以: void foo( size_t nValue ) { // ... 对比 void foo( const s
我为 answer to another question 写了一个 OutputIterator .在这里: #include using namespace std; template clas
我有一个由第三方生成的 dll,它具有某种内部数据结构,将其大小限制为 X 个元素。 所以基本上,它有一个以 X 为限制的队列。 据我所知,DLL 是每个进程的,但是是否可以多次加载 DLL?也许每个
假设我有以下两个数据结构: std::vector all_items; std::set bad_items; all_items vector 包含所有已知项和 bad_items vector
如何在不渲染 CGImage 的情况下从另一个 CIImage 复制一个 CIImage 最佳答案 CIImage *copiedImage = [originalImage copy]; 正如您在
我有一个名为 UINode 的 GUI,我想创建一个拷贝并只更改一些内容。该项目由 3 个基本线程组成。 PingThread、RosThread 和 GuiThread。我试图复制粘贴项目文件夹并将
Qt 新手。如果这个问题太幼稚,请多多包涵。在 Windows 操作系统环境中,我有 Qt 对话框框架应用程序,它具有“重复”- 按钮。在同一目录中,有 Qt 应用程序 - (一个带有关闭按钮的对话框
我正在尝试创建一个函数来复制我的卡片结构。我只需复制 cvalue 即可轻松开始。然而,我的 cvalue 没有复制,当应该读取 1000 时它仍然读取 5。 #include #include
string str1("someString"); string str2 = string(str1);//how many copies are made here //copy2 =
我希望了解 boost::bind 执行何种函数对象的内部拷贝。由于这些对象的构造函数似乎没有被调用,我推测这是一种“非常浅的复制”,所以我引入了动态内存分配来产生一些错误。但是,下面代码的运行时输出
我正在查看 http://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#c22-make-default-operations-consis
下面的类方法Augmented3dPoint::getWorldPoint()返回对其成员的引用 cv::Point3f world_point; class Augmented3dPoint { p
我需要通过 MyClass2 将用户定义的 lambda 传递给 MyClass1。我想确保只有一步,没有拷贝。下面的代码实现了吗?有没有更好的方法来做到这一点(比如使用编译器完成的隐式移动)? 注意
在我的数据库访问代码中,我想写一个方法: variant_t GetQueryRows (...) 我想这样调用它: const variant_t result = GetQueryRows (..
我有一个包含引用的类,例如: class A { A(B &b) : b(b) {} // constructor B &b; } 有时b必须是只读的,有时是可写的。当我创建一个 const A
我是一名优秀的程序员,十分优秀!