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

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

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

1
2
3
4
5
6
7
8
9
10
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接口,提供了对基本数据类型和对象序列化的方法。使用对象序列化功能可以非常方便的将对象写入输出流,或者从输入流中读取对象。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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://fulequn.github.io/2020/08/Article202008204/
作者
Fulequn
发布于
2020年8月20日
许可协议