[英]Serializable by extending with empty constructor?
TLDR:有没有一种方法可以在超类没有时强制子类具有空的构造函数?
我需要从序列化的数据容器初始化一个不可序列化的类TravelTimeDataArray
。 TravelTimeDataArray
无法序列化,因为它没有实现Serializable接口,缺少空的构造函数,并且使用Link
类型的non-serializable字段。
public class TravelTimeDataArray implements TravelTimeData {
private final double[] timeSum;
private final int[] timeCnt;
private final double[] travelTimes;
private final Link link; //I'm not serializable
public TravelTimeDataArray(final Link link, final int numSlots) {
this.timeSum = new double[numSlots];
this.timeCnt = new int[numSlots];
this.travelTimes = new double[numSlots];
this.link = link;
resetTravelTimes();
}
//getters and setters
}
我的第一个想法是将其扩展为可序列化的类。 除了使用Link
,我还可以使用ID属性的可序列化的String并添加空的构造函数。
public class SerialTravelTimeDataArray extends TravelTimeDataArray implements java.io.Serializable{
private final String linkId = null; // I am serializable
public SerialTravelTimeDataArray(){ }
public SerialTravelTimeDataArray(TravelTimeDataArray ttDA){
// intialize me using ttDA's data
}
// Methods to serialize the fields.
// Methods to populate super's fields from the deserialized data containers
}
由于父类没有空的构造函数,因此子类的空的构造函数出现错误。 当超级类没有时,是否有一种方法可以强制子类具有空的构造函数?
根据可序列化接口 :
Serializable类必须执行以下操作:
- 实现java.io.Serializable接口
- 标识应可序列化的字段(使用serialPersistentFields成员显式声明它们可序列化,或使用transient关键字表示不可序列化的字段。)
- 可以访问其第一个不可序列化超类的no-arg构造函数
需要访问对象的第一个不可序列化超类的无参数构造函数,因为在反序列化对象时将调用它。 否则,将引发异常。 请注意,序列化对象不会调用其超类的默认构造函数,并且不会引发任何异常。
如果扩展类不是必须的,则可以考虑使用如下封装:
public class Foo implements Serializable {
private final double[] timeSum;
private final int[] timeCnt;
private final double[] travelTimes;
private final String linkId;
private final transient TravelTimeDataArray ttDA;
public Foo(TravelTimeDataArray ttDA) {
this.ttDA = ttDA;
this.timeSum = ttDA.getTimeSum();
this.timeCnt = ttDA.getTimeCnt();
this.travelTimes = ttDA.getTravelTimes();
this.linkId = ttDA.getLink().getId();
}
// Methods
}
如果不需要在您的类中访问TravelTimeDataArray
,则可以跳过transient TravelTimeDataArray ttDA
字段。 希望这会有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.