ObjectInputStream 类
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
ObjectInputStream 反序列化以前使用 ObjectOutputStream 编写的基元数据和对象。
[Android.Runtime.Register("java/io/ObjectInputStream", DoNotGenerateAcw=true)]
public class ObjectInputStream : Java.IO.InputStream, IDisposable, Java.Interop.IJavaPeerable, Java.IO.IObjectInput
[<Android.Runtime.Register("java/io/ObjectInputStream", DoNotGenerateAcw=true)>]
type ObjectInputStream = class
inherit InputStream
interface IObjectInput
interface IDataInput
interface IJavaObject
interface IDisposable
interface IJavaPeerable
- 继承
- 属性
- 实现
注解
ObjectInputStream 反序列化以前使用 ObjectOutputStream 编写的基元数据和对象。
当 ObjectOutputStream 和 ObjectInputStream 分别与 FileOutputStream 和 FileInputStream 一起使用时,可以为应用程序提供对象的图形的持久存储。 ObjectInputStream 用于恢复以前序列化的那些对象。 其他用途包括使用套接字流或在远程通信系统中封送和取消封送参数的参数之间传递对象。
ObjectInputStream 可确保从流创建的图形中所有对象的类型与 Java 虚拟机中存在的类匹配。 使用标准机制根据需要加载类。
只能从流中读取支持 java.io.Serializable 或 java.io.Externalizable 接口的对象。
方法 readObject
用于从流中读取对象。 应使用 Java 的安全强制转换来获取所需的类型。 在 Java 中,字符串和数组是对象,在序列化期间被视为对象。 读取时,需要将其强制转换为预期的类型。
可以使用 DataInput 上的相应方法从流中读取基元数据类型。
对象的默认反序列化机制将每个字段的内容还原为写入时具有的值和类型。 反序列化过程会忽略声明为暂时性或静态的字段。 对其他对象的引用会导致根据需要从流中读取这些对象。 使用引用共享机制正确还原对象的图形。 反序列化时始终分配新对象,这可以防止覆盖现有对象。
读取对象类似于运行新对象的构造函数。 为 对象分配内存, (NULL) 初始化为零。 为不可序列化的类调用 No-arg 构造函数,然后从流中还原可序列化类的字段,从最接近 java.lang.object 的可序列化类开始,并使用对象最具体的类结束。
例如,从 ObjectOutputStream 中的示例编写的流中读取数据: <br>
FileInputStream fis = new FileInputStream("t.tmp");
ObjectInputStream ois = new ObjectInputStream(fis);
int i = ois.readInt();
String today = (String) ois.readObject();
Date date = (Date) ois.readObject();
ois.close();
类通过实现 java.io.Serializable 或 java.io.Externalizable 接口来控制它们的序列化方式。
实现 Serializable 接口允许对象序列化保存和还原对象的整个状态,并允许类在写入流和读取流之间的演变。 它自动遍历对象之间的引用,保存和还原整个图形。
在序列化和反序列化过程中需要特殊处理的可序列化类应实现以下方法:
private void writeObject(java.io.ObjectOutputStream stream)
throws IOException;
private void readObject(java.io.ObjectInputStream stream)
throws IOException, ClassNotFoundException;
private void readObjectNoData()
throws ObjectStreamException;
readObject 方法负责使用由相应的 writeObject 方法写入流的数据读取和还原其特定类的对象的状态。 方法无需关注属于其超类或子类的状态。 状态是通过从 ObjectInputStream 中读取各个字段的数据,并针对对象的相应字段进行赋值来还原的。 DataInput 支持读取基元数据类型。
如果尝试读取对象数据超出相应 writeObject 方法写入的自定义数据的边界,将导致引发 OptionalDataException 且 eof 字段值为 true。 超出分配数据末尾的非对象读取将以与指示流结束相同的方式反映数据结束:字节读取将返回 -1 作为字节读取或读取的字节数,基元读取将引发 EOFExceptions。 如果没有相应的 writeObject 方法,则默认序列化数据的末尾将标记分配数据的末尾。
从 readExternal 方法内发出的基元和对象读取调用的行为方式相同-如果流已定位在相应 writeExternal 方法写入的数据的末尾,则对象读取将引发 OptionalDataException,eof 设置为 true,按字节读取将返回 -1,基元读取将引发 EOFExceptions。 请注意,对于使用旧 ObjectStreamConstants.PROTOCOL_VERSION_1
协议编写的流,此行为不会保留,这些流未划分由 writeExternal 方法写入的数据末尾,因此无法检测到。
如果序列化流未将给定类列为要反序列化的对象超类,readObjectNoData 方法负责为其特定类初始化对象的状态。 如果接收方使用反序列化实例的类的版本与发送方不同,并且接收方的版本扩展了不受发送方版本扩展的类,则可能会出现这种情况。 如果序列化流被篡改,则也可能发生这种情况。因此,readObjectNoData 对于正确初始化反序列化对象非常有用,尽管源流存在“恶意”或不完整。
序列化不会读取不实现 java.io.Serializable 接口的任何对象的字段或向其赋值。 不可序列化的 对象的子类可以序列化。 在这种情况下,不可序列化的类必须具有 no-arg 构造函数,以允许初始化其字段。 在这种情况下,子类负责保存和还原不可序列化类的状态。 通常,该类的字段 (公共、包或受保护的) 可访问,或者有可用于还原状态的 get 和 set 方法。
对象反序列化时发生的任何异常都将由 ObjectInputStream 捕获并中止读取过程。
实现 Externalizable 接口允许对象完全控制对象的序列化形式的内容和格式。 调用 Externalizable 接口 writeExternal 和 readExternal 的方法来保存和还原对象状态。 当由类实现时,他们可以使用 ObjectOutput 和 ObjectInput 的所有方法编写和读取自己的状态。 对象负责处理发生的任何版本控制。
枚举常量的反序列化方式与普通可序列化或可外部化对象不同。 枚举常量的序列化形式仅包含其名称;不传输常量的字段值。 若要反序列化枚举常量,ObjectInputStream 从流中读取常量名称;然后,通过使用枚举常量基类型和接收的常量名称作为参数调用静态方法 Enum.valueOf(Class, String)
来获取反序列化常量。 与其他可序列化或可外部化对象一样,枚举常量可以充当随后出现在序列化流中的反向引用的目标。 无法自定义反序列化枚举常量的过程:在反序列化期间,枚举类型定义的任何特定于类的 readObject、readObjectNoData 和 readResolve 方法都会被忽略。 同样,任何 serialPersistentFields 或 serialVersionUID 字段声明也会被忽略 -- 所有枚举类型都具有固定的 serialVersionUID 为 0L。
在 JDK1.1 中添加。
的 java.io.ObjectInputStream
Java 文档。
此页面的部分内容是基于 创建和共享的工作进行的修改,并根据 署名许可中所述的术语使用。
构造函数
ObjectInputStream() |
提供一种方法,使完全重新实现 ObjectInputStream 的子类不必分配仅由 ObjectInputStream 实现使用的私有数据。 |
ObjectInputStream(IntPtr, JniHandleOwnership) |
创建 JNI 对象的托管表示形式时使用的构造函数;由运行时调用。 |
ObjectInputStream(Stream) |
创建从指定的 InputStream 读取的 ObjectInputStream。 |
属性
Class |
返回此 |
Handle |
基础 Android 实例的句柄。 (继承自 Object) |
JniIdentityHashCode |
ObjectInputStream 反序列化以前使用 ObjectOutputStream 编写的基元数据和对象。 (继承自 Object) |
JniPeerMembers |
ObjectInputStream 反序列化以前使用 ObjectOutputStream 编写的基元数据和对象。 |
PeerReference |
ObjectInputStream 反序列化以前使用 ObjectOutputStream 编写的基元数据和对象。 (继承自 Object) |
ThresholdClass |
此 API 支持 Mono for Android 基础结构,不应直接从代码使用。 |
ThresholdType |
此 API 支持 Mono for Android 基础结构,不应直接从代码使用。 |
方法
Available() |
返回可在不阻止的情况下从此输入流) 读取或跳过 (或跳过的字节数的估计值,当检测到流结束时,该字节数可能为 0 或 0。 (继承自 InputStream) |
Clone() |
创建并返回此对象的副本。 (继承自 Object) |
Close() |
关闭此输入流并释放与该流关联的任何系统资源。 (继承自 InputStream) |
DefaultReadObject() |
从此流中读取当前类的非静态和非暂时性字段。 |
Dispose() |
ObjectInputStream 反序列化以前使用 ObjectOutputStream 编写的基元数据和对象。 (继承自 Object) |
Dispose(Boolean) |
ObjectInputStream 反序列化以前使用 ObjectOutputStream 编写的基元数据和对象。 (继承自 Object) |
EnableResolveObject(Boolean) |
启用流以允许替换从流中读取的对象。 |
Equals(Object) |
指示其他某个对象是否“等于”此对象。 (继承自 Object) |
GetHashCode() |
返回对象的哈希代码值。 (继承自 Object) |
JavaFinalize() |
当垃圾回收确定不再引用对象时,由对象上的垃圾回收器调用。 (继承自 Object) |
Mark(Int32) |
标记此输入流中的当前位置。 (继承自 InputStream) |
MarkSupported() |
测试此输入流是否支持 |
Notify() |
唤醒正在等待此对象的监视器的单个线程。 (继承自 Object) |
NotifyAll() |
唤醒正在等待此对象的监视器的所有线程。 (继承自 Object) |
Read() |
读取一个字节的数据。 |
Read(Byte[]) |
从输入流中读取一定数量的字节,并将其存储在缓冲区数组 |
Read(Byte[], Int32, Int32) |
将输入流中最多 |
ReadAllBytes() |
从输入流中读取所有剩余字节。 (继承自 InputStream) |
ReadAsync() |
ObjectInputStream 反序列化以前使用 ObjectOutputStream 编写的基元数据和对象。 (继承自 InputStream) |
ReadAsync(Byte[]) |
ObjectInputStream 反序列化以前使用 ObjectOutputStream 编写的基元数据和对象。 (继承自 InputStream) |
ReadAsync(Byte[], Int32, Int32) |
ObjectInputStream 反序列化以前使用 ObjectOutputStream 编写的基元数据和对象。 (继承自 InputStream) |
ReadBoolean() |
以布尔值读取。 |
ReadByte() |
读取 8 位字节。 |
ReadChar() |
读取 16 位字符。 |
ReadClassDescriptor() |
从序列化流中读取类描述符。 |
ReadDouble() |
读取 64 位双精度值。 |
ReadFields() |
从流中读取持久字段,并按名称使它们可用。 |
ReadFloat() |
读取 32 位浮点数。 |
ReadFully(Byte[]) |
读取字节,阻塞,直到读取所有字节。 |
ReadFully(Byte[], Int32, Int32) |
读取字节,阻塞,直到读取所有字节。 |
ReadInt() |
读取 32 位 int。 |
ReadLine() |
已过时.
读取已由 \n、\r、\r\n 或 EOF 终止的行。 |
ReadLong() |
读取 64 位长。 |
ReadNBytes(Byte[], Int32, Int32) |
将输入流中请求的字节数读取到给定字节数组中。 (继承自 InputStream) |
ReadNBytes(Int32) |
从输入流读取最多指定数量的字节。 (继承自 InputStream) |
ReadObject() |
从 ObjectInputStream 读取对象。 |
ReadObjectOverride() |
此方法由使用受保护的 no-arg 构造函数构造 ObjectOutputStream 的受信任子类调用。 |
ReadShort() |
读取 16 位短。 |
ReadStreamHeader() |
提供 readStreamHeader 方法以允许子类读取和验证其自己的流标头。 |
ReadUnshared() |
从 ObjectInputStream 读取“未共享”对象。 |
ReadUnsignedByte() |
读取无符号 8 位字节。 |
ReadUnsignedShort() |
读取无符号的 16 位短。 |
ReadUTF() |
读取修改后的 UTF-8 格式的字符串。 |
RegisterValidation(IObjectInputValidation, Int32) |
在返回图形之前注册要验证的对象。 |
Reset() |
将此流重新定位到上次在此输入流上调用该方法时 |
ResolveClass(ObjectStreamClass) |
加载与指定流类说明等效的本地类。 |
ResolveObject(Object) |
此方法将允许 ObjectInputStream 的受信任子类在反序列化期间将一个对象替换为另一个对象。 |
ResolveProxyClass(String[]) |
返回一个代理类,该类实现代理类描述符中名为 的接口;子类可以实现此方法,以从流中读取自定义数据以及动态代理类的描述符,从而允许它们为接口和代理类使用备用加载机制。 |
SetHandle(IntPtr, JniHandleOwnership) |
设置 Handle 属性。 (继承自 Object) |
Skip(Int64) |
跳过并丢弃 |
SkipAsync(Int64) |
ObjectInputStream 反序列化以前使用 ObjectOutputStream 编写的基元数据和对象。 (继承自 InputStream) |
SkipBytes(Int32) |
跳过字节。 |
SkipNBytes(Int64) |
跳过并丢弃此输入流中确切 |
ToArray<T>() |
ObjectInputStream 反序列化以前使用 ObjectOutputStream 编写的基元数据和对象。 (继承自 Object) |
ToString() |
返回对象的字符串表示形式。 (继承自 Object) |
TransferTo(Stream) |
从此输入流中读取所有字节,并按读取顺序将字节写入给定输出流。 (继承自 InputStream) |
UnregisterFromRuntime() |
ObjectInputStream 反序列化以前使用 ObjectOutputStream 编写的基元数据和对象。 (继承自 Object) |
Wait() |
导致当前线程等待,直到它被唤醒,通常是通过 em <通知/em> 或 <em>interrupted</em>。<> (继承自 Object) |
Wait(Int64) |
导致当前线程等待,直到它被唤醒,通常是通过 em <通知/em> 或 <em>interrupted</em>,或直到经过一定数量的实时。<> (继承自 Object) |
Wait(Int64, Int32) |
导致当前线程等待,直到它被唤醒,通常是通过 em <通知/em> 或 <em>interrupted</em>,或直到经过一定数量的实时。<> (继承自 Object) |
显式接口实现
IJavaPeerable.Disposed() |
ObjectInputStream 反序列化以前使用 ObjectOutputStream 编写的基元数据和对象。 (继承自 Object) |
IJavaPeerable.DisposeUnlessReferenced() |
ObjectInputStream 反序列化以前使用 ObjectOutputStream 编写的基元数据和对象。 (继承自 Object) |
IJavaPeerable.Finalized() |
ObjectInputStream 反序列化以前使用 ObjectOutputStream 编写的基元数据和对象。 (继承自 Object) |
IJavaPeerable.JniManagedPeerState |
ObjectInputStream 反序列化以前使用 ObjectOutputStream 编写的基元数据和对象。 (继承自 Object) |
IJavaPeerable.SetJniIdentityHashCode(Int32) |
ObjectInputStream 反序列化以前使用 ObjectOutputStream 编写的基元数据和对象。 (继承自 Object) |
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
ObjectInputStream 反序列化以前使用 ObjectOutputStream 编写的基元数据和对象。 (继承自 Object) |
IJavaPeerable.SetPeerReference(JniObjectReference) |
ObjectInputStream 反序列化以前使用 ObjectOutputStream 编写的基元数据和对象。 (继承自 Object) |
扩展方法
JavaCast<TResult>(IJavaObject) |
执行 Android 运行时检查的类型转换。 |
JavaCast<TResult>(IJavaObject) |
ObjectInputStream 反序列化以前使用 ObjectOutputStream 编写的基元数据和对象。 |
GetJniTypeName(IJavaPeerable) |
ObjectInputStream 反序列化以前使用 ObjectOutputStream 编写的基元数据和对象。 |
ReadBooleanAsync(IDataInput) |
ObjectInputStream 反序列化以前使用 ObjectOutputStream 编写的基元数据和对象。 |
ReadByteAsync(IDataInput) |
ObjectInputStream 反序列化以前使用 ObjectOutputStream 编写的基元数据和对象。 |
ReadCharAsync(IDataInput) |
ObjectInputStream 反序列化以前使用 ObjectOutputStream 编写的基元数据和对象。 |
ReadDoubleAsync(IDataInput) |
ObjectInputStream 反序列化以前使用 ObjectOutputStream 编写的基元数据和对象。 |
ReadFloatAsync(IDataInput) |
ObjectInputStream 反序列化以前使用 ObjectOutputStream 编写的基元数据和对象。 |
ReadFullyAsync(IDataInput, Byte[]) |
ObjectInputStream 反序列化以前使用 ObjectOutputStream 编写的基元数据和对象。 |
ReadFullyAsync(IDataInput, Byte[], Int32, Int32) |
ObjectInputStream 反序列化以前使用 ObjectOutputStream 编写的基元数据和对象。 |
ReadIntAsync(IDataInput) |
ObjectInputStream 反序列化以前使用 ObjectOutputStream 编写的基元数据和对象。 |
ReadLineAsync(IDataInput) |
ObjectInputStream 反序列化以前使用 ObjectOutputStream 编写的基元数据和对象。 |
ReadLongAsync(IDataInput) |
ObjectInputStream 反序列化以前使用 ObjectOutputStream 编写的基元数据和对象。 |
ReadShortAsync(IDataInput) |
ObjectInputStream 反序列化以前使用 ObjectOutputStream 编写的基元数据和对象。 |
ReadUnsignedByteAsync(IDataInput) |
ObjectInputStream 反序列化以前使用 ObjectOutputStream 编写的基元数据和对象。 |
ReadUnsignedShortAsync(IDataInput) |
ObjectInputStream 反序列化以前使用 ObjectOutputStream 编写的基元数据和对象。 |
ReadUTFAsync(IDataInput) |
ObjectInputStream 反序列化以前使用 ObjectOutputStream 编写的基元数据和对象。 |
SkipBytesAsync(IDataInput, Int32) |
ObjectInputStream 反序列化以前使用 ObjectOutputStream 编写的基元数据和对象。 |
ReadAsync(IObjectInput) |
ObjectInputStream 反序列化以前使用 ObjectOutputStream 编写的基元数据和对象。 |
ReadAsync(IObjectInput, Byte[]) |
ObjectInputStream 反序列化以前使用 ObjectOutputStream 编写的基元数据和对象。 |
ReadAsync(IObjectInput, Byte[], Int32, Int32) |
ObjectInputStream 反序列化以前使用 ObjectOutputStream 编写的基元数据和对象。 |
ReadObjectAsync(IObjectInput) |
ObjectInputStream 反序列化以前使用 ObjectOutputStream 编写的基元数据和对象。 |
SkipAsync(IObjectInput, Int64) |
ObjectInputStream 反序列化以前使用 ObjectOutputStream 编写的基元数据和对象。 |