使用JavaTM远程方法调用(RMI),可以很方便地开发分布式的基于对象的应用程序。RMI的简单性,是由网络通信的费用作为代价的。底层的套接字可以用来开发客户/服务器系统,但是由于大多数Java
I/O类和对象不太容易匹配,如何通过套接字传递完成的对象呢?对象序列化是一个允许您以比特流方式读/写完成对象的机制。
将底层的套接字和对象序列化结合在一起,您将得到一个强大的、高效的、可替代RMI的机制,通过套接字来传递对象还能克服使用RMI的高费用的问题。
对象序列化概述
对象序列化机制对于需要将对象的状态保存到文件中,而后能够通过读入对象状态来重新构造对象,恢复程序状态,或者使用套接字在网络上传送对象的程序来说,是很有用的。通过让类实现java.io.Serializable
接口可以将类序列化。这个接口是一个制造者(marker)接口。也就是说,对于要实现它的类来说,该接口不需要实现任何方法。它主要用来通知Java虚拟机(JVM),需要将一个对象序列化。
将对象读出或者写入流的主要类有两个: ObjectOutputStream与ObjectInputStream 。ObjectOutputStream
提供用来将对象写入输出流的writeObject方法,
ObjectInputStream提供从输入流中读出对象的readObject方法。注意使用这些方法的对象必须被序列化,这非常重要。也就是说,这些类必须实现Serializable接口。
序列化已经存在的类
了解了对象序列化的基础知识之后,我们来看看如何对流读/写对象或现有的已序列化类实例。要将一个对象写入输出流,先建立一个输出流,然后使用writeObject对象保存到文件中。
注意: Date类是可序列化的。换句话说,它实现 Serializable接口。
例程 1: SaveDate.java
import java.io.*; import java.util.Date;
public class SaveDate {
public static void main(String argv[]) throws Exception
{ FileOutputStream fos = new
FileOutputStream("date.out"); ObjectOutputStream oos = new
ObjectOutputStream(fos); Date date = new
Date(); oos.writeObject(date); oos.flush(); oos.close(); fos.close(); } }
读入对象,然后重新构造它的状态都很容易。例程2中的代码向您展示了如何读一个已经序列化的对象并且打印它的信息。
例程 2: ReadDate.java
import java.io.*; import java.util.Date;
public class ReadDate {
public static void main(String argv[]) throws Exception
{ FileInputStream fis = new
FileInputStream("date.out"); ObjectInputStream ois = new
ObjectInputStream(fis); Date date = (Date)
ois.readObject(); System.out.println("The date is:
"+date); ois.close(); fis.close(); } }
在上面的例子中我们使用了Date类的一个实例,这是一个现成的已序列化的Java类。也许您会问这样的问题:是不是所有现成的Java类都是可序列化的?答案是否定的。这不仅因为这样做没必要,而且将某些类序列化是毫无意义的。使用JDK中的serialver工具,可以判断一个类是不是可序列化的。您可以在命令行模式下使用如下命令:
c:\> serialver java.util.Date java.util.Date: static final long
serialVersionUID = 7523967970034938905L;
(这个例子测试Date类是不是可序列化。输出结果表示Date类是可序列化的,并且打印出了这个类的版本唯一标识符。)
或者,您也可以使用如下命令启动图形界面下的serialver工具:
c:\> serialver -show
这个命令将弹出一个如图1所示的窗口,在这个窗口中写入您想检查的类的名字(包括路径)。图1显示的结果表示 Date类是可序列化的。
图 1: Date是个可序列化的类
再说一次,不是所有的Java类都是可序列化的。举个例子,图2表明Socket类是不可序列化的。
图2: Socket是个不可序列化的类
[网页制作]JavaScript的三种消息框:警告框、确认框、提示框 [网页制作]JavaScript运算符介绍 [网页制作]JavaScript比较和逻辑运算符介绍 [网页制作]script中的language=javascript和type=text/javas… [JAVA开发]Java连接各种数据库的实例 [办公软件]浅谈Linux 下Java 1.5 汉字方块问题解决方法 [系统软件]Regular Expression 正则表达式-2 (Java) [C语言系列]sqlserver在JAVA中的应用 [网页制作]Dreamweaver MX实例:构建Java插入模块 [网页制作]使用Dreamweaver轻松构建Java插入模块
|