public interface Serializable
允许非序列化的类型进行序列化,亚型可能承担了保存和恢复的超类型的公众,保护国家的责任,和(如果可以)包装领域。亚型可能只有扩展的类有一个可访问的无参数构造函数来初始化该类的状态承担这个责任。这是如果没有声明一个类可序列化错误。将在运行时检测到错误。
在反序列化期间,非序列化的类的字段将被初始化,使用公共的或受保护的类的无参数构造函数。没有参数的构造函数必须是可序列化的类访问。可序列化类的字段将从流恢复。
当遍历一个图,一个对象可能会遇到不支持序列化的接口。在这种情况下,notserializableexception将抛出,将确定的非序列化对象的类。
类,需要特殊处理的序列化和反序列化过程中必须用特殊方法在实施这些具体的签名:
private void writeObject(java.io.objectoutputstream出来)抛出IOExceptionprivate void readObject(java.io.objectinputstream在)抛出IOException,时抛出;private void readobjectnodata()把objectstreamexception;
writeObject方法负责写作对象的状态为其特定的类,相应的readObject方法可以恢复。保存对象的字段的默认机制可以通过调用out.defaultwriteobject调用。该方法不需要担心自己属于其超类或子类的状态。国家通过写个人领域使用writeObject方法或使用的方法对原始数据类型支持的数据对象的保存。
readObject方法负责从流中读取和恢复类的字段。它可以叫in.defaultreadobject调用恢复对象的非静态和非瞬态字段的默认机制。该方法采用defaultreadobject流中的信息来分配对象保存在流与对应的字段名在当前对象的字段。当类已经进化到添加新字段时,将处理这种情况。该方法不需要担心自己属于其超类或子类的状态。国家通过写个人领域使用writeObject方法或使用的方法对原始数据类型支持的数据对象的保存。
的readobjectnodata方法负责初始化对象的状态的特定类型的事件,序列化流不列出给定类的父类被反序列化的对象。这可能的情况下,接受方使用不同版本的反序列化实例的类比发送方和接收器的版本出现,延伸是不是由发送者的版本扩展的类。这也可能如果序列化流已被篡改的发生;因此,readobjectnodata用于初始化反序列化对象尽管“敌意”或不完整的源与流。
序列化的类,需要指定另一个对象时要使用的写作对象流应具有确切的签名实现这个特殊的方法:
any-access-modifier对象writereplace()抛出objectstreamexception;
这writereplace方法是通过序列化如果方法存在也可从一个在序列化对象的类定义的方法。因此,该方法可以有私有的、受保护的和包的私有访问。子类访问该方法遵循java访问规则。
当从流中读取它的实例时,需要指定一个替换的类,应该用确切的签名来实现这个特殊的方法。
any-access-modifier对象readresolve()抛出objectstreamexception;
这个实例方法遵循相同的调用规则和访问规则writereplace。
每个可序列化的类的版本号的序列化运行时的同事,被称为一个serialVersionUID,用于在反序列化期间验证发送方和接收器有序列化对象,对象是相对于序列化兼容加载的类。如果接收机,具有比相应的类的对象发送不同的serialVersionUID加载一个类,然后反序列化将导致InvalidClassException
。一个可序列化的类可以声明自己的serialVersionUID通过声明一个字段命名"serialVersionUID"
,必须是静态的,最终明确,并long
型:
any-access-modifier静态长42l serialVersionUID =;如果序列化的类没有显式声明serialVersionUID,则序列化运行时将计算中基于该类的各个方面这类serialVersionUID值,在java对象序列化规范描述(TM)。然而,这是强烈建议所有可序列化的类声明serialVersionUID值,因为默认serialVersionUID计算类的细节,可能取决于编译器实现的变化高度敏感,从而导致在反序列化期间意外
InvalidClassException
s。因此,为了保证一致的serialVersionUID值在不同的java编译器的实现,可序列化类必须声明一个明确的serialVersionUID值。还强烈建议显式声明serialVersionUID使用
private
修饰在可能的地方,因为这样的声明只适用于立即声明类-- serialVersionUID字段不能作为继承的成员。数组类不能声明一个明确的serialVersionUID,所以他们总是有默认值,但匹配serialVersionUID值要求豁免数组类。
ObjectOutputStream
,
ObjectInputStream
,
ObjectOutput
,
ObjectInput
,
Externalizable
Submit a bug or feature
For further API reference and developer documentation, see Java SE Documentation. That documentation contains more detailed, developer-targeted descriptions, with conceptual overviews, definitions of terms, workarounds, and working code examples.
Copyright © 1993, 2014, Oracle and/or its affiliates. All rights reserved.