用JAVA的ObjectOutputStream和ObjectInputStream完成对象的深克隆

用JAVA的ObjectOutputStream和ObjectInputStream完成对象的深克隆

在使用Java完成数据结构结点的构造时,遇到了数据域虽然也拷贝了,但只是浅层拷贝,两个不同的变量指向了同一块地址。也就是我将数据域中的T设置为引用类型后就会出现这种情况。

public class Node<T>            //结点类  
{
    public T data; //数据域
    public Node<T> next; //指针域            
    public Node(T data, Node<T> next)            
    {
    	this.data = data;
    	this.next = next;                      
    }
}

在经过Debug之后,发现了问题所在,然后结合Java中ObjectOutputStream和ObjectInputStream这两种流完成对象的深拷贝,这是序列化和反序列化的一种应用。

ObjectInput接口与ObjectOutput接口分别继承了DataInput接口和DataOutput接口,提供了对基本数据类型和对象序列化的方法。使用对象序列化功能可以非常方便的将对象写入输出流,或者从输入流中读取对象。

代码如下:

public class Node<T>              
{
    public T data; 
    public Node<T> next;                        

    public Node(T data, Node<T> next)            
    {
    	try {
    		// 将对象写到流里
    		ByteArrayOutputStream bo = new ByteArrayOutputStream();
        	ObjectOutputStream oo = new ObjectOutputStream(bo);
    		oo.writeObject(data);
    		// 从流里读出来
    		ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
        	ObjectInputStream oi = new ObjectInputStream(bi);
			@SuppressWarnings("unchecked")
			T data1 = (T) oi.readObject();
			this.data = data1;                        
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    	this.next = next;                      
    }
}

用JAVA的ObjectOutputStream和ObjectInputStream完成对象的深克隆
https://blog.fulequn.online/2020/08/Article202008204/
作者
Fulequn
发布于
2020年8月20日
许可协议