这是我第一次处理Java序列化,但有一个我无法解决的问题。
我有一个自定义类Square
的对象的ArrayList。我将Square
标记为Serializable
,并且有些字段实际上是可序列化的,而有些则不想序列化(我将它们标记为transient
)。顺便说一下,当我反序列化对象时,我想用我的自定义逻辑填充这些字段。
例如,我对字段int height
和int width
进行了序列化,但是我将transient
字段标记为int area
,所以当我反序列化对象时,我想计算area = height * width
(当然,这只是一个例子,我要做的事情更加复杂,例如,我必须通过调用其构造函数并传递我先前反序列化的某些字段来初始化某些字段。)
为此,我在课堂上实现了以下内容:
protected void readObject(java.io.ObjectInputStream stream)
throws IOException, ClassNotFoundException{
stream.defaultReadObject();
//do other stuff to finalize the construction of the object I've just deserialized
}
问题是stream.defaultReadObject();
之后的所有代码似乎都没有运行。
确实,如果我尝试调试程序,可以观察到在反序列化之后,所有标记为瞬态的字段仍为null
。
我必须序列化的arrayList对象的最后但并非最不重要的一类是子类。我从不实例化超类的对象,而仅实例化子类的对象。在某些子类中,我以这种方式覆盖了基本方法readObject(ObjectInputStream)
:
protected void readObject(java.io.ObjectInputStream stream)
throws IOException, ClassNotFoundException{
super.readObject(stream);
//do other stuff specific for the subclass
}
此外,我非常确定我用于序列化和反序列化对象的方法可以正常工作,实际上,当我序列化然后反序列化对象时,所有非transient
的字段都可以完美还原。
如果问题令人困惑,对不起,如果您需要解释,我将其添加!
反序列化方法:
public static <T extends Serializable> T deserialize(Context context, String fileName) {
T object = null;
try {
FileInputStream fileInputStream = context.openFileInput(fileName);
ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
object = (T) objectInputStream.readObject();
objectInputStream.close();
fileInputStream.close();
} catch (IOException ioExc) {
ioExc = new IOException("Cannot open the file specified);
}
catch (ClassNotFoundException cnfExc){
cnfExc = new ClassNotFoundException("Class not found");
}
return object;
}
带有要序列化的列表的类:
public Class listClass{
public static ArrayList<AAA> myList = new ArrayList<>();
//...
}
我反序列化列表的类:
listClass.myList = deserialize(getContext(), "myFile");
if (listClass == null){
listClass = new ArrayList<>();
}
AAA级:
public Class AAA implements Serializable{
protected int field1;
protected double field2;
protected BBB bbb;
//constructor...
private finalizeDeserialization(){
this.bbb = new BBB(field2);
}
protected void readObject(java.io.ObjectInputStream stream)
throws IOException, ClassNotFoundException{
stream.defaultReadObject();
finalizeDeserialization();
}
}
BBB类:
public Class bbb{
public BBB(double aDouble){
//...
}
//...
}
ACC类:
public Class ACC extends AAA{
private double field3;
private BBB cbb;
//constructor...
protected void readObject(java.io.ObjectInputStream stream)
throws IOException, ClassNotFoundException{
super.readObject(stream);
cbb = new BBB(field3);
}
}