`

Java I/O中的对象序列化

    博客分类:
  • j2se
阅读更多

  Java对象序列化将那些实现了Serializable接口的对象转换成一个字节序列,并能够以后将这个字节序列完全恢复为原来的对象。利用对象的序列化,可以实现轻量级持久性,这意味着一个对象的生存周期并不取决于程序是否正在执行,它可以生存于程序的调用之间。通过将一个序列化对象写入磁盘,然后在重新调用程序时恢复该对象,就能够实现持久性的效果。JDOHibernate等中间件为我们提供了更规范、完善的持久化机制,这里所述只是最基本的基于文件I/O的持久化。

对象序列化主要是为了支持两种主要的特性,一是Java远程方法调用(RMI),另外一个是序列化Java Beans

1.        实现了Serializable接口的对象的序列化

要序列化一个对象,首先要创建OutputStream对象,然后将其封装在一个ObjectOutputStream对象内。此时,调用writeObject()方法将对象序列化并发送给OutputStream。在反序列化时,需要将一个InputStream封装在ObjectInputStream内,然后调用readObject(),得到的结果是一个Object对象,需要进行转型得到最后所需的对象。需要注意的是,在对一个Serializable对象进行反序列化的过程中,没有调用任何构造器,包括缺省的构造器,整个对象都是通过从InputStream中取得数据恢复过来的。对象序列化是面向字节的,因此采用InputStreamOutputStream层次结构。

2.        实现了Externalizable接口的对象的序列化

Externalizable接口继承了Serializable接口,同时添加了writeExternal()readExternal(),它们在序列化和反序列化过程中会被自动调用。出于安全的考虑,可以将需要序列化的对象在上述方法中显式处理,否则不用在上述两个方法内考虑。注意,对于实现了Serializable接口的对象,对象完全以它存储的二进制位为基础来构造,不调用构造器。而对于一个Externalizable对象,所有普通的缺省构造器都会被调用,然后调用readExternal()

3.        transient关键字

在某些情况下,有些特定的子对象不希望Java序列化机制自动保存与恢复,即使对象中的这些信息是private的,经过序列化处理,就可以通过读取文件或者拦截网络传输的方式来访问到它。实现了Externalizable接口的对象的writeExternal()方法可以对需要的对象进行显式的序列化,但是如果我们操作的是一个实现了Serializable接口的对象,就只能用transient关键字逐个字段的关闭序列化,只需要在字段定义前加上该关键字即可。

4.        实现了Serializable接口的同时,提供两个方法

private void writeObject(ObjectOutputStream stream) throws IOException

private void readObject(ObjectInputStream stream)

throws IOException, ClassNotFoundException

这种方法使用起来比较混乱,仅仅提供了这样的一种功能,绝大多数情况下,使用前面三种方法就能满足需求。

分享到:
评论

相关推荐

    Java I/O, 2nd Edition

    通过《Java I/O, 2nd Edition》这本著作,读者将能够深入理解Java的I/O系统,掌握高效、安全的I/O编程技巧,无论是处理文件、网络通信还是序列化,都能游刃有余。对于Java开发者来说,这是一本不可多得的参考资料。

    Java I/O编程 java

    `ObjectInputStream`和`ObjectOutputStream`用于序列化和反序列化Java对象,使对象可以保存到文件或在网络上传输。对象流继承自字节流,因此可以处理非原始数据类型。 8. 数据流小结: 在Java I/O编程中,理解不同...

    深入分析 Java I/O 的工作机制(转载)

    6. **对象序列化与反序列化** Java提供了Serializable接口,使得对象可以被序列化成字节流,便于存储或通过网络传输。ObjectInputStream和ObjectOutputStream负责对象的序列化和反序列化操作。 7. **NIO(非阻塞I/...

    Java I/O系统

    除了基本的读写操作,Java I/O还提供了对象序列化和反序列化的功能。`ObjectOutputStream`和`ObjectInputStream`可以将Java对象转换为字节流并存储到磁盘或网络中,反之亦然。这对于持久化数据和远程通信非常有用。 ...

    java i/0习题

    4. 对象序列化:ObjectOutputStream允许我们将Java对象转换为字节流,以便存储或网络传输。 三、文件操作 1. RandomAccessFile:提供随机访问文件的功能,可以跳过某些字节,直接读写指定位置的数据。 2. 文件的...

    Java I/O层次结构详解

    6. **对象序列化** - **ObjectInputStream和ObjectOutputStream**:支持Java对象的序列化和反序列化,使对象能保存到磁盘或在网络间传输。 7. **内存I/O** - **ByteArrayInputStream和ByteArrayOutputStream**:...

    java基础之I/O流

    Java提供了ObjectInputStream和ObjectOutputStream,用于序列化和反序列化对象,实现对象的持久化存储或网络传输。 5. 转换流(Wrapper Streams): InputStreamReader和OutputStreamWriter将字节流转换为字符流...

    Java I/O 使用和最佳实践

    `ObjectInputStream`和`ObjectOutputStream`则用于对象的序列化和反序列化,实现对象的持久化存储。 9. **分词(Tokenizing)** `Scanner`类是进行简单分词和格式化输入的工具,它可以解析文本并提取数字、字符串...

    java中I/O的t经典ppt

    8. **对象序列化与反序列化**: - Java提供了ObjectOutputStream和ObjectInputStream,可以将Java对象转换为字节流(序列化),并从字节流中恢复对象(反序列化)。 9. **转换流**: - InputStreamReader和...

    accii码表(包括扩展)以及Java I/O

    Java I/O系统还包含过滤流(Filter Stream)、对象流(Object Stream)以及管道流(Piped Stream)等,它们提供了更高级的功能,如数据压缩、错误检测和校验、对象序列化等。了解并熟练掌握这些概念对于任何Java...

    Java输入与输出(I、O).

    Java输入与输出(I/O)是Java编程语言中不可或缺的一部分,它允许程序与外部资源进行数据交换,如文件系统、网络、硬件设备等。在Java中,I/O操作被封装在许多类和接口中,形成了丰富的API。以下将详细介绍几个重要...

    Javaio流思维导图

    除此之外,Java I/O还提供了对象序列化和反序列化的功能。Serializable接口标记一个类可以被序列化,ObjectInputStream和ObjectOutputStream则负责将对象转换为字节流并还原。 在处理大量数据时,流的连接是必不可...

    java_I/O流的教程

    本教程涵盖了从基础到高级的Java流知识,包括文件读写、缓冲流、对象序列化等多个方面。 1. **文件的编码**:在处理文本文件时,了解字符编码至关重要。Java中的`FileReader`和`FileWriter`类默认使用平台的默认...

    java i/o包流式输入输出和文件操作

    这些类可以确保数据的正确序列化和反序列化。 总的来说,Java的I/O包提供了强大且灵活的工具来处理文件和数据流,无论是在简单文本操作还是复杂的二进制数据交换中,都能找到相应的解决方案。通过熟练掌握这些类和...

    Java.I.O.2nd.Edition

    5. **对象序列化**: - 序列化和反序列化:将Java对象转换为字节流,以便存储或在网络上传输。 - ObjectInputStream和ObjectOutputStream:实现对象的序列化和反序列化。 6. **字符编码**: -字符编码的理解,如...

    java序列化和反序列化

    - **对象状态保存:** 序列化不仅可以保存对象本身的数据成员,还能跟踪并保存对象中的引用关系,即所谓的“对象图”。 - **自动化处理:** Java序列化过程大部分是由JVM自动完成的,开发者只需关注对象的设计和实现...

    克隆和序列化(Java )

    在网络传输中,可以将对象序列化后发送,接收端再进行反序列化。 5. **示例**:`序列化.txt`可能包含以下代码: ```java import java.io.*; class SerializableClass implements Serializable { private ...

    Java IO.pdf

    - **IOException**:Java 中用于表示 I/O 错误的异常类,几乎所有 I/O 操作都可能会抛出此异常。 #### 四、系统流 - **System.out**:标准输出流,通常用于向控制台输出信息。 - **System.in**:标准输入流,用于...

    Java语言程序设计基础篇课后题答案-Chapter18BinaryI_O.pdf

    以及 `ObjectInputStream` 和 `ObjectOutputStream` 支持对象的序列化和反序列化。 掌握Java的二进制I/O对于开发高效、可靠的文件处理程序至关重要,尤其是在需要处理大量非文本数据或跨平台传输时。了解这些概念和...

Global site tag (gtag.js) - Google Analytics