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