java - 序列化对象时是否需要处置它?

标签 java serialization

我是 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/

相关文章:

.net - 为什么类在 .Net 中默认不可序列化?

java - 使用 Java 树模型

java - 奇怪的 PHP shell_exec Java 行为

java - RabbitMQ 测试消费者处于 Activity 状态

java - 如何将同一类的多个对象绘制到一个 JPanel 上?

sql - 可序列化事务隔离锁

java - 通过tcp向logstash发送数据

C++ 网络序列化

asp.net - 从 ApiController 中的 json 序列化中排除属性

Java序列化问题