复制实体类值
时间: 2025-03-11 17:02:31 浏览: 25
### 如何深浅拷贝 Java 和 C# 实体类属性值
#### 浅拷贝与深拷贝的概念
浅拷贝仅复制对象中的基本数据类型以及引用类型的地址,而不会创建新的对象实例。对于引用类型的数据成员,源对象和目标对象共享同一份内存空间[^1]。
深拷贝不仅会复制对象本身及其内部的基本数据类型字段,还会递归地为每一个引用类型的字段分配新内存并赋值,从而确保原对象与其副本之间没有任何关联。
#### Java 中的浅拷贝与深拷贝
##### 浅拷贝实现方式:
可以通过继承 `Cloneable` 接口并重写 `clone()` 方法来完成浅拷贝操作,在此过程中需要注意调用父类的 `super.clone()` 函数以获得当前对象的一个副本。
```java
public class Person implements Cloneable {
private String name;
private Address address;
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
```
##### 深拷贝实现方式:
为了达到真正的深拷贝效果,除了要克隆原始对象外,还需要手动处理所有的非基础数据类型的成员变量,即对这些成员也执行相应的克隆逻辑。
```java
@Override
protected Person clone() throws CloneNotSupportedException {
Person clonedPerson = (Person) super.clone();
clonedPerson.address = this.address != null ? this.address.clone() : null;
return clonedPerson;
}
```
如果不想自己编写复杂的克隆代码,则可以考虑使用序列化机制来进行深拷贝。具体做法是先将对象转换成字节数组保存到临时文件或者内存缓冲区中,再反序列化得到一个新的对象实例。
```java
// 序列化深拷贝
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(this);
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
return (Person) ois.readObject();
```
#### C# 中的浅拷贝与深拷贝
C# 提供了两种简单的途径用于实现浅拷贝——通过 `MemberwiseClone()` 方法或是利用反射技术;而对于深拷贝而言,通常推荐采用 JSON 或 XML 的序列化/反序列化的手段。
##### 使用 MemberwiseClone 进行浅拷贝:
```csharp
public class Employee : ICloneable
{
public string Name { get; set; }
public Department Dept { get; set; }
public object Clone()
{
return this.MemberwiseClone(); // 创建该对象的一份浅表副本
}
}
```
##### 利用 Newtonsoft.Json 实现深拷贝:
```csharp
using Newtonsoft.Json;
public static T DeepCopy<T>(T obj)
{
var serialized = JsonConvert.SerializeObject(obj);
return JsonConvert.DeserializeObject<T>(serialized);
}
var originalEmployee = new Employee { /* 初始化 */ };
var copiedEmployee = DeepCopy(originalEmployee); // 执行深拷贝
```
#### 最佳实践建议
- 对于简单结构的对象可以选择直接覆盖默认的 `clone()` 方法或使用 `MemberwiseClone()` 来快速构建浅层副本;
- 如果涉及到复杂嵌套关系或者是含有不可变集合的情况时,应该优先选用基于序列化的方案来做深层复制工作;
- 需要注意的是无论哪种方法都可能带来性能开销上的差异,因此实际应用当中应当权衡利弊选取最适合的方式。
阅读全文
相关推荐


















