在JAVA中有SerializationUtils.clone 通常用于深拷贝对象。Java 中的 SerializationUtils.clone 是 Apache Commons Lang 库中的一个工具类,它通过序列化和反序列化来实现对象的深拷贝。虽然 C# 没有直接等价的 SerializationUtils.clone 方法,但你可以使用多种方法来实现类似的功能,例如一下方法。
使用Json.NET
方法简单,性能高,安全性高,示例如下。
1.先安装Newtonsoft.Json
2.使用
using Newtonsoft.Json;
public static class SerializationUtils
{
public static T Clone<T>(T obj)
{
if (obj == null) return default(T);
// 将对象序列化为 JSON 字符串
string json = JsonConvert.SerializeObject(obj);
// 将 JSON 字符串反序列化为新的对象
return JsonConvert.DeserializeObject<T>(json);
}
}
使用System.Text.Json
System.Text.Json也是深拷贝,使用方法如下。
using System.Text.Json;
public static class SerializationUtils
{
public static T Clone<T>(T obj)
{
if (obj == null) return default(T);
// 将对象序列化为 JSON 字符串
string json = JsonSerializer.Serialize(obj);
// 将 JSON 字符串反序列化为新的对象
return JsonSerializer.Deserialize<T>(json);
}
}
使用 ICloneable 接口(浅拷贝或自定义深拷贝)
C# 提供了 ICloneable 接口,允许你实现对象的克隆。然而,默认的 Clone 方法只提供浅拷贝(即只复制引用类型的第一层),如果你需要深拷贝,必须手动实现。
public class MyClass : ICloneable
{
public int Id { get; set; }
public List<string> Items { get; set; }
public object Clone()
{
// 手动实现深拷贝
return new MyClass
{
Id = this.Id,
Items = new List<string>(this.Items) // 深拷贝列表
};
}
}
// 使用示例
MyClass original = new MyClass { Id = 1, Items = new List<string> { "A", "B" } };
MyClass clone = (MyClass)original.Clone();
使用 MemberwiseClone(浅拷贝)
MemberwiseClone 是 C# 中的一个受保护的方法,用于创建对象的浅拷贝。它只会复制对象的字段,而不会递归地复制引用类型的对象。因此,它不适合深拷贝。
public class MyClass
{
public int Id { get; set; }
public List<string> Items { get; set; }
public MyClass ShallowClone()
{
return (MyClass)this.MemberwiseClone();
}
}
// 使用示例
MyClass original = new MyClass { Id = 1, Items = new List<string> { "A", "B" } };
MyClass shallowClone = original.ShallowClone();