public abstract class SerialCloneable<T> {
protected final T clone() {
ObjectOutputStream oos = null;
ByteArrayOutputStream bos = null;
ObjectInputStream ois = null;
ByteArrayInputStream bis = null;
try {
bos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(bos);
oos.writeObject(getPrototypeInstance());
bis = new ByteArrayInputStream(bos.toByteArray());
ois = new ObjectInputStream(bis);
T obj = (T) ois.readObject();
return obj;
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
protected abstract T getPrototypeInstance();
}
public class Citation extends SerialCloneable<Citation> implements Serializable {
private String name;
private Student student;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
@Override
public String toString() {
return "Citation{" +
"name='" + name + '\'' +
", student=" + student +
'}';
}
@Override
protected Citation getPrototypeInstance() {
return this;
}
}
public class Student implements Serializable {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}