ISerializable 接口

定义

实现 java 的类启用类的可序列化性。

[Android.Runtime.Register("java/io/Serializable", "", "Java.IO.ISerializableInvoker")]
public interface ISerializable : Android.Runtime.IJavaObject, IDisposable, Java.Interop.IJavaPeerable
[<Android.Runtime.Register("java/io/Serializable", "", "Java.IO.ISerializableInvoker")>]
type ISerializable = interface
    interface IJavaObject
    interface IDisposable
    interface IJavaPeerable
派生
属性
实现

注解

实现 java.io.Serializable 接口的类启用类的可序列化性。

<强>警告:反序列化不受信任的数据本质上是危险的,应避免。 应仔细验证不受信任的数据。 </strong>

不实现此接口的类将没有任何状态序列化或反序列化。 可序列化类的所有子类型本身都是可序列化的。 序列化接口没有方法或字段,仅用于标识可序列化的语义。

若要允许序列化不可序列化类的子类型,子类型可能负责保存和还原超类型的公共、受保护和(如果可访问)包字段的状态。 仅当它扩展的类具有可访问的 no-arg 构造函数来初始化类的状态时,子类型才承担此责任。 如果不是这种情况,则声明类 Serializable 是错误的。 错误将在运行时检测到。

在反序列化期间,将使用类的公共或受保护的 no-arg 构造函数初始化不可序列化类的字段。 不可序列化的子类必须可访问 no-arg 构造函数。 可序列化子类的字段将从流中还原。

遍历图形时,可能会遇到不支持可序列化接口的对象。 在这种情况下,将引发 NotSerializableException,并标识不可序列化对象的类。

在序列化和反序列化过程中需要特殊处理的类必须使用以下确切签名实现特殊方法:

private void writeObject(java.io.ObjectOutputStream out)
                throws IOException
            private void readObject(java.io.ObjectInputStream in)
                throws IOException, ClassNotFoundException;
            private void readObjectNoData()
                throws ObjectStreamException;

writeObject 方法负责为其特定类写入对象的状态,以便相应的 readObject 方法可以还原它。 可以通过调用 out.defaultWriteObject 来调用保存对象字段的默认机制。 该方法不需要关注属于其超级类或子类的状态。 状态是通过使用 writeObject 方法或 DataOutput 支持的基元数据类型的方法将单个字段写入 ObjectOutputStream 来保存的。

readObject 方法负责从流中读取和还原类字段。 它可以调用 in.defaultReadObject 来调用用于还原对象的非静态和非暂时性字段的默认机制。 defaultReadObject 方法使用流中的信息为流中保存的对象字段分配当前对象中对应命名的字段。 这会处理类演变为添加新字段的情况。 该方法不需要关注属于其超级类或子类的状态。 状态是通过从 ObjectInputStream 中读取各个字段的数据,并向对象的相应字段进行赋值来还原状态。 DataInput 支持读取基元数据类型。

readObjectNoData 方法负责初始化对象的特定类的状态,因为序列化流不会将给定类列为要反序列化的对象的超类。 如果接收方使用与发送方不同的反序列化实例类版本,并且接收方的版本扩展了未由发送方版本扩展的类,则可能会出现这种情况。 如果序列化流已被篡改,也可能发生这种情况;因此,readObjectNoData 有助于正确初始化反序列化的对象,尽管源流存在“敌对”或不完整。

需要指定在将对象写入流时要使用的替代对象的可序列化类应使用确切签名实现此特殊方法:

ANY-ACCESS-MODIFIER Object writeReplace() throws ObjectStreamException;

如果方法存在,并且可从在所序列化对象的类中定义的方法访问此方法,则通过序列化调用此 writeReplace 方法。 因此,该方法可以具有专用、受保护和包专用访问。 对此方法的子类访问遵循 java 辅助功能规则。

当从流中读取某个实例时,需要指定替换的类应使用确切的签名实现此特殊方法。

ANY-ACCESS-MODIFIER Object readResolve() throws ObjectStreamException;

此 readResolve 方法遵循与 writeReplace 相同的调用规则和辅助功能规则。

序列化运行时将版本号(称为 serialVersionUID)与每个可序列化类相关联,该版本号在反序列化期间用于验证序列化对象的发送方和接收方是否已为与序列化兼容的该对象的类加载了类。 如果接收方为具有与相应发送方的类不同的 serialVersionUID 的对象加载了类,则反序列化将导致一个 InvalidClassException。 可序列化类可以通过声明一个名为 "serialVersionUID" 静态、最终和类型的 long字段来显式声明其自己的 serialVersionUID:

ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;

如果可序列化类未显式声明 serialVersionUID,则序列化运行时将根据类的各个方面计算该类的默认 serialVersionUID 值,如 Java(TM) 对象序列化规范中所述。 但是,<强烈建议/em> 所有可序列化类显式声明 serialVersionUID 值,因为默认 serialVersionUID 计算对可能因编译器实现而异的类详细信息高度敏感,因此在反序列化期间会导致意外InvalidClassException。<> 因此,若要保证跨不同 java 编译器实现的一致 serialVersionUID 值,可序列化类必须声明显式 serialVersionUID 值。 此外,强烈建议显式 serialVersionUID 声明尽可能使用 private 修饰符,因为此类声明仅适用于立即声明的 class--serialVersionUID 字段不能用作继承成员。 数组类不能声明显式 serialVersionUID,因此它们始终具有默认的计算值,但对于数组类,将放弃匹配 serialVersionUID 值的要求。

如果面向 android N,则 serialVersionUID 计算的 Android 实现将略有变化。为了保持兼容性,仅启用此更改是应用程序目标 SDK 版本设置为 24 或更高版本。 强烈建议使用显式 serialVersionUID 字段来避免兼容性问题。

<h3>实现可序列化的 Judiciously</h3> 请参阅 有效 Java 关于序列化的章节,以全面覆盖序列化 API。 本书介绍如何使用此接口,而不会损害应用程序的可维护性。

<h3>推荐的替代项</h3><强>JSON</strong> 是简洁、可读且高效的。 Android 包括一个 android.util.JsonReader streaming API 和一个 org.json.JSONObject tree API 读取和写入 JSON。 使用 GSON绑定库直接读取和写入 Java 对象。

在 1.1 中添加。

适用于 . 的 java.io.SerializableJava 文档

本页的某些部分是根据 Android 开放源代码项目创建和共享的工作进行的修改,并根据 Creative Commons 2.5 属性许可证中所述的术语使用。

属性

Handle

获取基础 Android 对象的 JNI 值。

(继承自 IJavaObject)
JniIdentityHashCode

返回包装实例的值 java.lang.System.identityHashCode()

(继承自 IJavaPeerable)
JniManagedPeerState

托管对等方的状态。

(继承自 IJavaPeerable)
JniPeerMembers

成员访问和调用支持。

(继承自 IJavaPeerable)
PeerReference

返回 JniObjectReference 包装的 Java 对象实例。

(继承自 IJavaPeerable)

方法

Disposed()

在释放实例时调用。

(继承自 IJavaPeerable)
DisposeUnlessReferenced()

如果没有对此实例的未完成引用,则调用 Dispose();否则不执行任何操作。

(继承自 IJavaPeerable)
Finalized()

在实例完成时调用。

(继承自 IJavaPeerable)
SetJniIdentityHashCode(Int32)

设置由 JniIdentityHashCode. 返回的值。

(继承自 IJavaPeerable)
SetJniManagedPeerState(JniManagedPeerStates)

实现 java 的类启用类的可序列化性。

(继承自 IJavaPeerable)
SetPeerReference(JniObjectReference)

设置由 PeerReference. 返回的值。

(继承自 IJavaPeerable)
UnregisterFromRuntime()

取消注册此实例,以便运行时不会从将来 Java.Interop.JniRuntime+JniValueManager.PeekValue 的调用中返回它。

(继承自 IJavaPeerable)

扩展方法

JavaCast<TResult>(IJavaObject)

执行 Android 运行时检查的类型转换。

JavaCast<TResult>(IJavaObject)

实现 java 的类启用类的可序列化性。

GetJniTypeName(IJavaPeerable)

实现 java 的类启用类的可序列化性。

适用于