Java 序列化对象时是否需要处理它?

Java 序列化对象时是否需要处理它?,java,serialization,Java,Serialization,我是Java新手,我想知道当我序列化对象时,是否有必要释放对象以释放内存?我尝试在序列化之后使用我的可序列化对象,工作正常,但我的目标是在对其进行解序列化之前不获取访问权限。谢谢 Poo p = new Poo(); try { FileOutputStream g = new FileOutputStream("obj.ser"); ObjectOutputStream stream = new ObjectOutputStream(g); st

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

答案是否,序列化对象后并不总是需要“处置”对象


如果您有“处理”对象的特定原因(无论在代码上下文中是什么意思),那么就这样做。如果您有关于此特定原因的问题,请改进您的问题,但您的问题是一般意义上的问题,在这种意义上,答案是否定的。

答案是否定的,序列化对象后并不总是需要“处置”对象


如果您有“处理”对象的特定原因(无论在代码上下文中是什么意思),那么就这样做。如果您对此特定原因有疑问,请改进您的问题,但您的问题是一般意义上的问题,从这个意义上说,答案是否定的。

您可以使用自定义序列化的方法使对象无效(即,让对象在每次调用非私有方法时抛出一个异常;这样至少可以确保没有方法被成功调用)

但是,如果您只想使内存可用,则只需将对象的所有引用设置为
null
。例如,如果没有对
p
的静态引用:

p = null;
如果您声明
p
(最有可能是方法的结尾),则会在作用域的末尾自动完成。也许编译器甚至可以进行一些优化(如果不再需要,请释放对象);但是我不知道,语言规范是否允许这样做

编辑
生成
Poo
final
,以防止继承的类重写和添加方法,并忽略
无效
字段。

您可以使用自定义序列化的方法使对象无效(即,让对象在每次调用非私有方法时抛出一个异常;这样至少可以确保没有方法被成功调用)

但是,如果您只想使内存可用,则只需将对象的所有引用设置为
null
。例如,如果没有对
p
的静态引用:

p = null;
如果您声明
p
(最有可能是方法的结尾),则会在作用域的末尾自动完成。也许编译器甚至可以进行一些优化(如果不再需要,请释放对象);但是我不知道,语言规范是否允许这样做

编辑
使
Poo
final
,以防止继承的类重写和添加方法,并忽略
无效的
字段。

序列化是基于内存中的对象生成一些字节。您可以使用这些字节执行一些操作,如将它们写入文件、通过网络发送等。原始对象将同样的

垃圾收集器会在程序无法再访问某个对象后的某个时间自动执行处理对象以“释放内存”的操作。您所能做的最好的方法是确保您没有保留对该对象的任何引用。然后将收集该对象


这些是独立且不相关的概念。

序列化是基于内存中的对象生成某些字节。您可以使用这些字节执行某些操作,如将其写入文件、通过网络发送等。原始对象保持不变

垃圾收集器会在程序无法再访问某个对象后的某个时间自动执行处理对象以“释放内存”的操作。您所能做的最好的方法是确保您没有保留对该对象的任何引用。然后将收集该对象


这些都是独立且不相关的概念。

为什么你认为这在一般意义上是必要的?释放内存,然后在去实体化后再次使用。有意义吗?一点也没有。你问的是“有必要吗”,答案肯定是否定的。如果你有具体的理由“处置”对象(无论在代码的上下文中这意味着什么),那么就这样做。为什么你认为这在一般意义上是必要的?释放内存,然后在去序列化后再次使用。有意义吗?一点也没有。你问的是“有必要吗”,答案肯定是否定的。如果你有特定的理由“处置”对象(无论这在代码上下文中意味着什么),然后这样做。