网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.如何设计架构.
.诊断Java代码:设计轻松的代码维护.
.struts中文问题和国际化问题的终.
.使用SOAP开发Java Web服务详解.
.J2ME 2D小游戏入门之计时器.
.Rails 开发与 Java 编程的比较.
.3D编程指南第四部分:M3G内建碰撞.
.J2EE中的异常管理及错误跟踪框架.
.JBuilder2005实现重构之分布式重.
.J2ME入门专题系列之三:搭建开发.
.JavaMail的标题的中文问题最新版.
.J2SE1.5版本的新特性一览.
.JAVA教程:解析Java的多线程机制.
.Spring中Rod Johnson 与“轮子理.
.setYear 方法.
.如何在程序异常或正常退出JVM时执.
.探索J2ME:对记录进行排序.
.RemoveAll 方法.
.final方法.
.精通J2ME中的Hello World 程序.

通过Java套接字传递对象

发表日期:2008-1-5



  使用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类是可序列化的。

通过Java套接字传递对象(图一)

图 1: Date是个可序列化的类

  再说一次,不是所有的Java类都是可序列化的。举个例子,图2表明Socket类是不可序列化的。

通过Java套接字传递对象(图二)

图2: Socket是个不可序列化的类

QQread.com 推出各大专业服务器评测 Linux服务器的安全性能 SUN服务器 HP服务器 DELL服务器 IBM服务器 联想服务器 浪潮服务器 曙光服务器 同方服务器 华硕服务器 宝德服务器 序列化用户自己的类


上一篇:Java 理论与实践: 非阻塞算法简介 人气:1139
下一篇:利用JAVA API函数实现数据的压缩与解压缩 人气:1152
浏览全部Java的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐