java 序列化 clone_利用java序列化进行对象深Clone
這樣做被復(fù)制的對(duì)象與被復(fù)制對(duì)象里面的引用都是可以被一并深復(fù)制的,不同于Object基類(lèi)的Clone方法(淺復(fù)制:如果被復(fù)制的對(duì)象存在其他對(duì)象的引用,復(fù)制一個(gè)引用指向原對(duì)象的實(shí)例)。廢話不多說(shuō)Code如下:
[java] view plaincopyprint?
importjava.io.ByteArrayInputStream;
importjava.io.ByteArrayOutputStream;
importjava.io.IOException;
importjava.io.ObjectInputStream;
importjava.io.ObjectOutputStream;
importjava.io.Serializable;
publicclassCloneTest {
publicstaticvoidmain(String[] args)throwsIOException, ClassNotFoundException {
Teacher t =newTeacher();
t.setName("Teacher xin");
t.setAge(30);
Student s =newStudent();
s.setName("Student xiaoxin");
s.setAge(20);
s.setTeacher(t);
System.out.println("s name="+s.getName());
System.out.println("s age="+s.getAge());
System.out.println("s t name="+s.getTeacher().getName());
System.out.println("s t age="+s.getTeacher().getAge());
System.out.println("-------------------");
Student sCopy = (Student)s.deepCopy();
sCopy.getTeacher().setName("Teacher mao");
//下面運(yùn)行的結(jié)果看出對(duì)Student的引用Teacher類(lèi)進(jìn)行了深復(fù)制
System.out.println("sCopy t name="+sCopy.getTeacher().getName());
System.out.println("-------------------");
System.out.println("s t name="+s.getTeacher().getName());
}
}
classTeacherimplementsSerializable{
privatestaticfinallongserialVersionUID = -2380977769309339400L;
privateString name;
privateintage;
publicintgetAge() {
returnage;
}
publicvoidsetAge(intage) {
this.age = age;
}
publicString getName() {
returnname;
}
publicvoidsetName(String name) {
this.name = name;
}
}
classStudentimplementsSerializable{
privatestaticfinallongserialVersionUID = 739748261443702736L;
privateString name;
privateintage;
publicintgetAge() {
returnage;
}
publicvoidsetAge(intage) {
this.age = age;
}
privateTeacher teacher;
publicTeacher getTeacher() {
returnteacher;
}
publicvoidsetTeacher(Teacher teacher) {
this.teacher = teacher;
}
publicString getName() {
returnname;
}
publicvoidsetName(String name) {
this.name = name;
}
/**
* 把對(duì)象讀到字節(jié)流中在讀出來(lái)
* @return
* @throws IOException
* @throws ClassNotFoundException
*/
publicObject deepCopy()throwsIOException, ClassNotFoundException{
ByteArrayOutputStream bop =newByteArrayOutputStream();
ObjectOutputStream oos =newObjectOutputStream(bop);
oos.writeObject(this);
ByteArrayInputStream bis =newByteArrayInputStream(bop.toByteArray());
ObjectInputStream ois =newObjectInputStream(bis);
returnois.readObject();
}
}
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class CloneTest {
public static void main(String[] args) throws IOException, ClassNotFoundException {
Teacher t = new Teacher();
t.setName("Teacher xin");
t.setAge(30);
Student s = new Student();
s.setName("Student xiaoxin");
s.setAge(20);
s.setTeacher(t);
System.out.println("s name="+s.getName());
System.out.println("s age="+s.getAge());
System.out.println("s t name="+s.getTeacher().getName());
System.out.println("s t age="+s.getTeacher().getAge());
System.out.println("-------------------");
Student sCopy = (Student)s.deepCopy();
sCopy.getTeacher().setName("Teacher mao");
//下面運(yùn)行的結(jié)果看出對(duì)Student的引用Teacher類(lèi)進(jìn)行了深復(fù)制
System.out.println("sCopy t name="+sCopy.getTeacher().getName());
System.out.println("-------------------");
System.out.println("s t name="+s.getTeacher().getName());
}
}
class Teacher implements Serializable{
private static final long serialVersionUID = -2380977769309339400L;
private String name;
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class Student implements Serializable{
private static final long serialVersionUID = 739748261443702736L;
private String name;
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
private Teacher teacher;
public Teacher getTeacher() {
return teacher;
}
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
/**
* 把對(duì)象讀到字節(jié)流中在讀出來(lái)
* @return
* @throws IOException
* @throws ClassNotFoundException
*/
public Object deepCopy() throws IOException, ClassNotFoundException{
ByteArrayOutputStream bop = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bop);
oos.writeObject(this);
ByteArrayInputStream bis = new ByteArrayInputStream(bop.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
return ois.readObject();
}
}
運(yùn)行結(jié)果:
s name=Student xiaoxin s age=20 s t name=Teacher xin s t age=30 ------------------- sCopy t name=Teacher mao ------------------- s t name=Teacher xin
總結(jié)
以上是生活随笔為你收集整理的java 序列化 clone_利用java序列化进行对象深Clone的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java技术自我_2020年Java程序
- 下一篇: mysql 数据库dbhelp_C#