国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

通過套接字傳遞對象

2019-11-18 12:03:24
字體:
來源:轉載
供稿:網友

  使用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.  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,將看到類似下面的輸出結果

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 奈曼旗| 寿光市| 东乌珠穆沁旗| 两当县| 柳林县| 宁南县| 司法| 彰化县| 哈巴河县| 邵阳县| 鄂托克前旗| 阿勒泰市| 东乡县| 宜州市| 师宗县| 凤山市| 岳池县| 惠州市| 花垣县| 云霄县| 巴林右旗| 西和县| 葫芦岛市| 霸州市| 普安县| 临安市| 旬阳县| 上虞市| 黄龙县| 大庆市| 兖州市| 山东| 寿宁县| 保山市| 连州市| 哈尔滨市| 司法| 眉山市| 宜春市| 元氏县| 长宁县|