子类继承之序列化解决方案
程序员文章站
2022-03-13 10:51:29
...
在写原型模式的时候,在用clone()方法实现了的时候,发现对于深拷贝来说,会对每一个相关类添加clone方法.这样会增加代码量,故推荐在深拷贝的时候使用序列化与反序列化实行.参见于我写的原型模式.
在写序列化的时候,我想到关于子类继承实现序列化的问题,倘若是父类实现了Serializable接口,那直接对子类序列化即可.倘若父类没有实现,而子类实现了Serializable,那仅能得到子类属性而得不到其集成自父类的属性了.当然倘若都不实现Serializable,那在序列化的时候是会报错的.对象序列化的时候必须实现Serializable.
下面是父类实现了Serializable的代码:
当父类没有实现serializable,而子类实现的情况下,解决的办法是若父类有带参构造方法的时候,需要添加一个无参构造方法,子类中需要加上:
此方法在序列化时候自动调用,先序列化子类,然后序列化父类的属性.
在写序列化的时候,我想到关于子类继承实现序列化的问题,倘若是父类实现了Serializable接口,那直接对子类序列化即可.倘若父类没有实现,而子类实现了Serializable,那仅能得到子类属性而得不到其集成自父类的属性了.当然倘若都不实现Serializable,那在序列化的时候是会报错的.对象序列化的时候必须实现Serializable.
下面是父类实现了Serializable的代码:
package serializable;
import java.io.Serializable;
public class SuperClass implements Serializable {
String name;
String age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
package serializable;
public class SonClass extends SuperClass {
String sex;
String profession;
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getProfession() {
return profession;
}
public void setProfession(String profession) {
this.profession = profession;
}
}
package serializable;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class Test {
public static void main(String[] args) {
SonClass son = new SonClass();
son.setName("Alex");
son.setAge("20");
son.setProfession("fighter");
son.setSex("man");
SonClass son2=null;
try {
FileOutputStream ba = new FileOutputStream("text.txt");
ObjectOutputStream oo = new ObjectOutputStream(ba);
oo.writeObject(son);
oo.flush();
oo.close();
FileInputStream bi = new FileInputStream("text.txt");
ObjectInputStream oi = new ObjectInputStream(bi);
son2 = (SonClass) oi.readObject();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(son2.getName());
System.out.println(son2.getAge());
System.out.println(son2.getProfession());
System.out.println(son2.getSex());
}
}
当父类没有实现serializable,而子类实现的情况下,解决的办法是若父类有带参构造方法的时候,需要添加一个无参构造方法,子类中需要加上:
private void writeObject(ObjectOutputStream out) throws IOException {
out.defaultWriteObject();
out.writeObject(name);
out.writeObject(age);
}
private void readObject(ObjectInputStream in) throws IOException,
ClassNotFoundException {
in.defaultReadObject();
name = (String) in.readObject();
age = (String) in.readObject();
}
此方法在序列化时候自动调用,先序列化子类,然后序列化父类的属性.