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

Lat*_*thy 9 java serialization

我知道什么是序列化以及为什么使用它,但我的问题是:

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

    private Object readResolve() throws java.io.ObjectStreamException { 
        return INSTANCE;
    }
    
    Run Code Online (Sandbox Code Playgroud)

Aas*_*set 10

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