为什么Serialable接口不包含任何方法?

时间:2015-07-14 06:48:49

标签: java serialization

我知道什么是序列化及其使用原因,但我的问题是:

  1. 为什么序列化是标记接口?
  2. 在Serializable接口中没有writeObjectreadObject的潜在好处是什么,因为当我们进行序列化时,我们最终会覆盖这两种方法?
  3. readResolve如何确保在反序列化期间创建的对象不是新对象。我知道下面的内容,它在反序列化过程中返回相同的对象,但谁将在内部调用此readResolve方法?

    private Object readResolve() throws java.io.ObjectStreamException { 
        return INSTANCE;
    }
    

2 个答案:

答案 0 :(得分:10)

  1. 因为需要一些明确的方法来声明一个类可序列化。框架不能只假设所有类都是可序列化的,因为有很多种类的对象如果将它们的字段写入磁盘并且稍后从那里重新加载就会停止工作(例如FileInputStream,它依赖于开放操作系统文件句柄,在反序列化对象时可能不再存在)。这种声明的现代方式是注释,但是在添加序列化时Java中不存在这些注释。
  2. 如果序列化程序的默认行为足够好,您不一定需要覆盖它们。除了实施Serializable
  3. 之外,您无需执行任何操作
  4. The serialization framework calls it when an object has been completely deserialized。此时,允许对象检查其自己的内容,如果它确定它应该由另一个实例表示,则它可以返回该实例(如果不是,则返回this)。无论此方法产生什么,都会返回到请求反序列化的代码。如果返回了一个预先存在的对象,那么任何人都不会看到由反序列化程序创建的新对象,最终会被垃圾回收。

答案 1 :(得分:2)

标记接口用于告诉JVM执行特定任务。他们没有任何方法。 Serializable也是一个标记界面。

序列化是展平对象的过程。当您在类中实现可序列化接口时,它会告诉JVM序列化其对象,即它必须转换为流。