我是 Java 新手,我想知道在序列化对象时是否有必要释放对象以释放内存?我尝试在序列化后使用我的可序列化对象并且工作正常,但我的目标是在取消序列化之前无法访问它。谢谢。
Poo p = new Poo();
try {
FileOutputStream g = new FileOutputStream("obj.ser");
ObjectOutputStream stream = new ObjectOutputStream(g);
stream.writeObject(p);
stream.close();
}
catch(Exception e) { e.printStackTrace(); }
p.getInfo(); // works
最佳答案
您可以使用自定义序列化的方法来使对象无效(即,使对象在每次调用非私有(private)方法时抛出异常;这样您至少可以确保没有成功调用任何方法)。
public final class Poo implements Serializable {
private volatile boolean invalid = false;
public String getInfo() {
synchronized (this) {
if (invalid) {
throw new IllegalStateException("Object shouldn't be used until deserialized");
}
}
// do something
}
// do the same to other methods
// if necessary Object methods like equals and hashCode too
private class SerializationProxy implements Serializable {
private Object readResolve() {
Poo.this.invalid = false;
return Poo.this;
}
}
private synchronized Object writeReplace() {
invalid = true;
return new SerializationProxy();
}
}
但是,如果您只想使内存可用,则只需将对象的所有引用设置为 null
即可。例如。如果没有对 p
的静态引用:
p = null;
这会在您声明 p
的作用域末尾自动完成(很可能是方法的末尾)。也许编译器甚至可以做一些优化(如果不再需要则释放对象);但我不知道语言规范是否允许这样做。
编辑
制作了 Poo
final
以防止继承类覆盖和添加方法并忽略 invalid
字段。
关于java - 序列化对象时是否需要处置它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23772448/