`
suko
  • 浏览: 74683 次
  • 性别: Icon_minigender_1
  • 来自: 富安
社区版块
存档分类
最新评论

使用序列化方法实现list集合的深拷贝

阅读更多
对于可序列化(实现Serializable接口)的对象,封装它的list集合可以通过以下方法实现深拷贝

public static <T> List<T> deepCopy(List<T> src) throws IOException, ClassNotFoundException {
	ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
	ObjectOutputStream out = new ObjectOutputStream(byteOut);
	out.writeObject(src);

	ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());
	ObjectInputStream in = new ObjectInputStream(byteIn);
	@SuppressWarnings("unchecked")
	List<T> dest = (List<T>) in.readObject();
	return dest;
}


扩展一下,其实只要对象实现了Serializable接口,都可以用序列化的方式实现对象的深拷贝
public static <T extends Serializable> T clone(T t) {
		T cloneObj = null;

		try {
			// 将对象写入字节流
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			ObjectOutputStream oos = new ObjectOutputStream(baos);
			oos.writeObject(t);
			oos.close();

			// 从字节流中读取
			ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
			ObjectInputStream ois = new ObjectInputStream(bais);
			cloneObj = (T) ois.readObject();

			ois.close();
		}
		catch (Exception e) {
			e.printStackTrace();
		}

		return cloneObj;
	}


已有轮子:
Apache的commons-lang包下面的工具类SerializationUtils已经为我们实现了拷贝功能,方法的源码如下:
public static Object clone(Serializable object)
    {
        return deserialize(serialize(object));
    }

其接受的参数object就是Serializable类型的

我们可以直接调用其方法实现对象拷贝(例子中的Student类实现了Serializable接口)
public static void main(String[] args) {
		Student student = new Student();
		Student clone = (Student) org.apache.commons.lang.SerializationUtils.clone(student);
		System.out.println(student.toString());
		System.out.println(clone.toString());
	}

分享到:
评论

相关推荐

    java List 深度复制方法

    总结来说,Java中实现List的深度复制,可以采用序列化和反序列化的方法,或者手动复制每个元素。选择哪种方法取决于你的具体需求,例如对象是否支持序列化,以及性能和代码复杂性的考量。在处理可变对象时,确保深...

    用序列化实现ListT 实例的深复制(推荐)

    以下是如何使用序列化实现List实例深复制的步骤: 1. 首先,创建一个辅助类`SerializLog`,该类包含一个静态方法`Clone&lt;T&gt;`,它接受一个泛型参数T,代表要复制的对象类型。 2. 在`Clone&lt;T&gt;`方法中,我们创建一个`...

    java不同对象及集合的多次复制

    - **序列化与反序列化**:将对象序列化为字节数组,然后再反序列化为新的对象,实现深拷贝。 3. **注解实现对象复制** - **Apache Commons BeanUtils库**:提供了`BeanUtils.copyProperties()`方法,可以快速实现...

    android 浅复制和深复制-Java Generic Deep Copy 篇

    通过实现`Cloneable`接口并覆写`clone()`方法,或者使用如上所述的泛型深拷贝工具类,我们可以有效地对数据对象进行复制,保证应用的稳定性和正确性。在处理复杂数据结构时,深拷贝能防止意外的改动影响到原始数据,...

    关于java中的深copy与浅copy的问题

    在Java中,实现深拷贝通常需要自定义序列化和反序列化的方法,或者使用`java.util.Arrays.copyOf()`或`java.util.ArrayList.clone()`等工具类。 下面通过一个`CopyTest`的例子来进一步解释: ```java public class...

    Java:面试题大全带答案

    理解何时需要深拷贝,如何实现深拷贝,如使用clone()方法或序列化。 - **Serializable接口**:Java通过实现此接口进行序列化和反序列化,可用于实现深拷贝。 面试中,对于以上知识点的深入理解和实际应用能力是...

    kotlin-deep-copy-helper:轻松复制和修改不可变的复杂对象树。 通过序列化,具有杰克逊库

    通常,在Kotlin中,我们会尽可能使用不可变的属性和集合。 但是,对于测试方案,我们通常希望对正常测试用例中的数据进行突变,破坏或以某种特定方式进行修改。 Kotlin数据类上的标准.copy()方法在嵌套属性上的可用...

    Array和Collection相互转换以及copy深度的小测

    如果你需要深拷贝,通常需要自己实现,例如通过`clone()`方法或序列化反序列化来实现。 在`CollectionConvertTest.java`文件中,我们可以找到实际的转换代码,这可能包括自定义的转换逻辑,测试不同的转换场景,并...

    复制copy的应用(C#代码编写)

    实现深拷贝通常需要自定义方法或序列化/反序列化。 ```csharp public MyClass DeepClone() { return JsonConvert.DeserializeObject(JsonConvert.SerializeObject(this)); } ``` ### 4. 使用ICloneable接口进行...

    Java八股文Java八股文

    Java八股文主要涵盖Java语言的基础知识,包括对象方法、数据类型、序列化、字符串处理、方法重载与重写、反射、动态代理以及集合框架等核心概念。下面将逐一详细解析这些知识点。 1. **Object类相关方法** - `...

    java 对象克隆

    对于复杂的对象结构,可以使用序列化和反序列化技术来实现深克隆。首先,将对象序列化为字节数组,然后反序列化为新的对象。这种方法可以确保所有引用类型的对象也被复制。 ```java import java.io.*; public ...

    数据复制代码JAVA

    对于复杂对象,可以利用Java的序列化机制进行深拷贝。将对象序列化为字节流,然后反序列化得到一个新的独立对象。这种方式适用于那些不支持`Cloneable`接口或`clone()`方法的对象。 9. **数据复制在大数据中的应用...

    一口气带你踩完五个 List 的大坑,真的是处处坑啊!

    当涉及到 List 的序列化和反序列化时,需要特别注意集合中对象的序列化兼容性。如果 List 中包含不可序列化的对象,或者对象的序列化版本不一致,可能会导致序列化失败。确保所有对象都实现了 `Serializable` 接口,...

    2019年最新版修订版Java程序员面试宝典.pdf

    如果想要实现深拷贝,则需要更复杂的方法。 ##### 二、JavaSE语法 1. **Java的`goto`语句**:Java中不支持`goto`语句,但有类似功能的`break`和`continue`。 2. **`&`和`&&`的区别**: - `&`:位与运算符,也可...

    JavaSe总结

    对象可以通过实现`Serializable`接口来支持序列化。 ### 对象序列化和反序列化演示 序列化对象可以将其状态保存到文件中,反序列化则可以从文件中恢复对象的状态。 ### 浅拷贝和深拷贝 浅拷贝只复制对象本身及其...

    23种设计模式的java实现

    Java内置了深拷贝和浅拷贝机制,通过实现Cloneable接口并重写clone()方法来实现原型模式。 6. 适配器模式:将两个不兼容的接口转换为一个可以一起工作的接口。Java中可以使用组合或继承来实现适配器。 7. 桥接模式...

    改善C#程序的建议

    例如,在示例代码中,`Employee`类通过序列化和反序列化来实现深拷贝。 #### 2. C#中`dynamic`的正确用法 动态类型关键字`dynamic`在C#中被广泛使用,用于表示运行时类型未知的对象。这提供了更大的灵活性,但也...

    java代码-集合类型,返回值为对象时。

    - Java的序列化机制允许将集合对象写入文件或网络,`ObjectOutputStream`用于序列化,`ObjectInputStream`用于反序列化。 - JSON库(如Jackson、Gson)可以将集合转换为JSON字符串,便于网络传输或存储。 9. **...

    C/C++笔试题面试题文档集合

    此外,深拷贝与浅拷贝的区别,以及何时使用智能指针来避免内存泄漏,也是常见的面试问题。 再者,C++中的异常处理是考察程序健壮性的重要部分,考生需要理解try-catch语句的使用,以及如何通过throw关键字抛出异常...

Global site tag (gtag.js) - Google Analytics