Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么';t可序列化接口是否包含任何方法?_Java_Serialization - Fatal编程技术网

Java 为什么';t可序列化接口是否包含任何方法?

Java 为什么';t可序列化接口是否包含任何方法?,java,serialization,Java,Serialization,我知道什么是序列化以及为什么使用序列化,但我的问题是: 为什么序列化是一个标记接口 在Serializable接口中没有writeObject,readObject的潜在好处是什么,因为当我们进行序列化时,我们最终覆盖了这两种方法 readResolve如何确保反序列化期间创建的对象不是新对象。我知道下面的代码,它在反序列化过程中返回相同的对象,但是谁会在内部调用这个readResolve方法呢 private Object readResolve() throws java.io.Object

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

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

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

  • 因为需要有一些明确的方式来声明类是可序列化的。该框架不能仅仅假设所有类都是可序列化的,因为有许多类型的对象将停止工作,如果它们的字段写入磁盘,然后从磁盘重新加载(例如,
    FileInputStream
    ,它依赖于打开的操作系统文件句柄,当对象被反序列化时,该句柄可能不再存在)。拥有这种声明的现代方式是注释,但在添加序列化时,Java中不存在注释
  • 如果序列化程序的默认行为足够好,则不必重写它们;除了实现
    Serializable
    ,您不需要做任何事情
  • 。此时,允许对象检查其自身的内容,如果它决定改为由另一个实例表示,则可以返回该实例(如果不是,则返回
    this
    )。此方法产生的任何结果都将返回到请求反序列化的代码。如果返回了一个先前存在的对象,反序列化程序创建的新对象将不会被任何人看到,并且最终将被垃圾收集

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


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

    因为当我们进行序列化时,我们最终会覆盖这两个方法:不,您没有。谁将在内部调用此readResolve方法?:ObjectInputStream(或它使用的一个类),用于反序列化对象。接口不能指定私有方法,原因之一。@gronostaj:我相信该链接并不能回答我的所有问题。嗨,Aasmund,谢谢你的评论。你能详细解释一下你的第1点吗?@Lathy:什么部分?@Lathy:框架不能假设所有类都是可序列化的。“@Lathy:有些类的结构是这样的,如果你只是(递归地)将一个实例的字段序列化到磁盘,然后将它们读回一个新实例中(可能在另一个程序中或在同一程序的另一次执行中),它们可能不起作用。例如,依赖共享数据的实例将中断(如果实例
    a
    b
    都引用某个对象
    c
    ,如果分别序列化它们并再次反序列化,它们现在将引用
    c
    的两个不同副本)(将继续)(续。)此外,引用诸如操作系统句柄等短暂事物的实例(例如,
    FileInputStream
    )在反序列化后很可能不起作用,因为它们引用的句柄不再存在(如果关闭原始的
    FileInputStream
    ,Java的“连接”)打开的文件也将关闭,反序列化的
    FileInputStream
    中的文件句柄不再有效)。