我开始使用Java,并开始使用序列化。我想知道是否有任何方法可以在类本身内编写反序列化函数。让我澄清一下我的意思:我可以从另一个类中反序列化一个对象(即来自类Person
的对象),并且可以正常工作:
public class Dummy{
...
public static void main(String args[])
{
...
Person father = null;
try {
FileInputStream load = new FileInputStream(saved_file);
ObjectInputStream in = new ObjectInputStream(load);
indiv = (Person) in.readObject();
in.close();
load.close();
} catch (...) { ... }
}
}
但是,为了保持整洁,是否可以将其作为函数移到Person类中?例如,要做这样的事情:
public class Person implements Serializable {
private boolean isOrphan = false;
private Person parent;
...
public void load(File saved_file) {
try {
FileInputStream load = new FileInputStream(saved_file);
ObjectInputStream in = new ObjectInputStream(load);
this = (Person) in.readObject(); // Error: cannot assign a value to final variabl this
in.close();
load.close();
} catch (...) { ... }
}
}
然后在另一个类中只需调用此:
public class Dummy{
...
public static void main(String args[])
{
...
Person father = null;
father.load(saved_file);
}
}
答案 0 :(得分:3)
您不能在尚不存在的实例上调用实例方法。即使您的代码可以编译,您也会得到NullPointerException
,因为您在null
上调用了一个方法。
使您的方法静态,并使其返回反序列化的实例。通常,this
不是您可以分配的变量,它是对对象的不变引用。
public static Person load(File saved_file) {
try (FileInputStream load = new FileInputStream(saved_file);
ObjectInputStream in = new ObjectInputStream(load)) {
return (Person) in.readObject();
} catch (...) { ... }
}
public class Dummy {
public static void main(String args[]) {
Person father = Person.load(saved_file);
}
}
PS:我还添加了带有资源的 try-catch 而不是显式的close()
,因为它更安全。