子类继承之序列化解决方案

在写原型模式的时候,在用clone()方法实现了的时候,发现对于深拷贝来说,会对每一个相关类添加clone方法.这样会增加代码量,故推荐在深拷贝的时候使用序列化与反序列化实行.参见于我写的原型模式.
在写序列化的时候,我想到关于子类继承实现序列化的问题,倘若是父类实现了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();
}



此方法在序列化时候自动调用,先序列化子类,然后序列化父类的属性.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值