动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
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教程 ]的信息

本月文章推荐
.Velocity中的变量问题的解决方法.
.Java项目中连接数据库的几种方式.
.Swing入门基础知识点全接触.
.关于在Java Web中的入侵检测及简.
.杂谈:Java编程思想面向对象逻辑.
.Applet事件响应.
.利用ThreadLocal简化struts开发.
.JAVA初学者的6个问题.
.Wireless Messaging API(3).
.J2EE综合应用之——解析MVC模式.
.理解EJB的参数传递.
.Java在数字地球系统开发中的Web应.
.从 .NET 应用程序访问 Microsoft.
.Jive中的设计模式.
.Java实现SOA的标准途径.
.Subversion宣布Subversion .
.使用Java Swing 创建一个XML编辑.
.使用J2EE整合企业应用.
.如何使用AOP编程减少升级的风险(.
.关于六种Java异常处理程序的陋习.

通过套接字传递对象

发表日期:2008-1-5 |



  使用JavaTM远程方法调用(RMI),可以很方便地开发分布式的基于对象的应用程序。RMI的简单性,是由网络通信的费用作为代价的。底层的套接字可以用来开发客户/服务器系统,但是由于大多数Java I/O类和对象不太轻易匹配,如何通过套接字传递完成的对象呢?对象序列化是一个答应您以比特流方式读/写完成对象的机制。
  
  将底层的套接字和对象序列化结合在一起,您将得到一个强大的、高效的、可替代RMI的机制,通过套接字来传递对象还能克服使用RMI的高费用的问题。
  
  本文:
  简单概述对象序列化
  介绍如何应用对象序列化
  解释如何应用已经存在的对象与用户对象
  介绍如何通过套接字传递对象
  提供多线程的服务器例子
  提供一个基于对象的实现daytime协议的例子
  最后,简单比较了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类都是可序列化的。举个例子,图2表明Socket类是不可序列化的。
  
  序列化用户自己的类
  现在,让我们看看如何序列化用户自己写的类。在这个例子中,我们将建立一个用户类UserInfo,见例程3。为了让它可序列化,UserInfo类实现了Serializable接口。
  
  例程 3: UserInfo.java
  
  import java.io.*;
  import java.util.*;
  
  public class UserInfo implements Serializable {
  String name = null;
  
  public UserInfo(String name) {
  this.name = name;
  }
  
  public void printInfo() {
  System.out.println("The name is: "+name);
  }
  }
  
  下一步就是建立一个能创建UserInfo类实例的类,然后将对象写入输出流中,如例程4。本例中的输出流是一个名为"name.out"的文件。要注重的是,例程4 中的writeObject方法可以被调用任意多次,将任意多个对象写入输出流。
  
  例程 4: SaveInfo.java
  
  import java.io.*;
  import java.util.Date;
  
  public class SaveInfo {
  
  public static void main(String argv[]) throws Exception {
  FileOutputStream fos = new FileOutputStream("name.out");
  ObjectOutputStream oos = new ObjectOutputStream(fos);
  // create two objects
  UserInfo user1 = new UserInfo("Java Duke");
  UserInfo user2 = new UserInfo("Java Blue");
  // write the objects to the output stream
  oos.writeObject(user1);
  oos.writeObject(user2);
  oos.flush();
  oos.close();
  fos.close();
  }
  }
  
  最后,我们写一个将已经保存的对象读入的类,并且调用一个如例程5所示的方法。和writeObject 一样,readObject方法能被调用任意多次,从输入流中读入任意多个对象。
  
  例程 5: ReadInfo.java
  
  import java.io.*;
  import java.util.Date;
  
  public class ReadInfo {
  
  public static void main(String argv[]) throws Exception {
  FileInputStream fis = new FileInputStream("name.out");
  ObjectInputStream ois = new ObjectInputStream(fis);
  // read the objects from the input stream (the file name.out)
  UserInfo user1 = (UserInfo) ois.readObject();
  UserInfo user2 = (UserInfo) ois.readObject();
  // invoke a method on the constrUCted object
  user1.printInfo();
  user2.printInfo();
  ois.close();
  fis.close();
  }
  }
  
  要测试这个例子,请编译如下源文件:UserInfo.java, SaveInfo.java, 和 ReadInfo.java。运行 SaveInfo,然后运行ReadInfo,将看到类似下面的输出结果
上一篇:用UltraEdit打造自己的Java IDE 人气:560
下一篇:设计和优化 Microsoft Windows CE .NET 人气:566
浏览全部Java的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-9-6 Movie34电影搜索引擎 v3.0
2008-9-6 wap2.0仿帝国建站喜用 v2.0
2008-9-6 免费人才招聘网 宽屏版 v3.01
2008-9-6 喜喔喔视频采集程序 v1.0 beta
2008-9-6 ASP客户管理系统
2008-9-6 主流驿站中秋祝福程序
2008-9-6 php实现msn协议的类
2008-9-5 Coppermine Photo Gallery v1.4.
2008-9-5 清松网络日记本 v2.4
2008-8-23 Mini WinMount V0.4
2008-8-23 Vista优化大师3.11正式版
2008-8-23 Wine 1.13
2008-8-23 KlipFolio 5.0 Build 5899-80
2008-8-23 Windows Sysinternals Desktops
2008-8-23 OneTap Movies1.2破解版
2008-8-23 AnnotaterPDF阅读1.1.503 破解版
2008-8-23 SoundMeter分贝测量仪 v1.0汉化破
2008-8-23 iDrum音乐节拍1.0破解版
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | Html转换js | js/vbs加密 | md5加密 | 进制转换
实用工具:汉字翻译拼音 | 符号对照表 | 个税计算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号