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

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

RMS 從入門到精通系列連載之二

2019-11-18 12:47:42
字體:
供稿:網(wǎng)友

  在系列連載之一中,我們著重講述了Record Management System的基礎(chǔ)知識。在介紹如何使用Record Management System之前,我想首先介紹一下java IO以及在J2ME平臺實(shí)現(xiàn)序列化的內(nèi)容,無論對Record Management System還是MIDP中的通用聯(lián)網(wǎng)框架來說,上述內(nèi)容都是非常重要的。
  
  在CLDC中定義的Java IO是非常短小精悍的,但是也提供了足夠的類來完成我們的IO操作。由于和J2SE的實(shí)現(xiàn)是通用的,因此你可以使用J2ME和J2SE或者J2EE平臺進(jìn)行通信。比如通過聯(lián)網(wǎng)和servlet進(jìn)行通信。在Record Management System中我們主要使用的類是ByteArrayInputStream、ByteArrayOutputStream、DataInputStream和DataOutputStream。前面兩個是基于字節(jié)的,ByteArrayInputStream的作用是把字節(jié)數(shù)組轉(zhuǎn)換成流而ByteArrayOutputStream的作用是把內(nèi)存緩沖區(qū)內(nèi)的數(shù)據(jù)轉(zhuǎn)換成字節(jié)。后面兩個類是基于java基本數(shù)據(jù)類型和String操作的。通常他們把前面兩個類作為參數(shù)傳送給構(gòu)造器,這樣他們就可以對基本數(shù)據(jù)類型以及String進(jìn)行讀寫操作了。
  
  值得注重的一點(diǎn)是ByteArrayOutputStream的toByteArray()方法是把內(nèi)存中的數(shù)據(jù)進(jìn)行復(fù)制返回,這樣的話多浪費(fèi)了一份內(nèi)存,為了更有效的使用有限的存儲空間你可以擴(kuò)展ByteArrayOutputSteam類然后提供getByteArray()方法,下面是例子:
  
  public class MyByteArrayOutputStream extends ByteArrayOutputStream
  {
   public byte[] getByteArray()
   {
    return buf;
   }
  }
  
  在J2ME中并沒有提供對象序列化的機(jī)制,但是我們可以自己實(shí)現(xiàn)它。請考慮下面這個類:
  
  public class Bank
  {
   PRivate String bankName;
   private String phone;
   private int employeeNum;
  
   public Bank(){}
  
   public Bank(String aBankName,String aPhone,int aEmployeeNum)
   {
   this.bankName = aBankName;
   this.phone = aPhone;
   this.employeeNum = aEmployeeNum;
   }
  
   public String getBankName()
   {
   return bankName !=null?bankName:"";
   }
  
   public String getPhone()
   {
   return phone!=null?phone:"";
   }
  
   public int getEmployeeNum()
   {
   return employeeNum;
   }
  
  }
  
  我們添加兩個方法到這個類來實(shí)現(xiàn)對象序列化。如下所示:
  
  public class Bank
  {
   private String bankName;
   private String phone;
   private int employeeNum;
  
   public Bank(){}
  
   public Bank(String aBankName,String aPhone,int aEmployeeNum)
   {
   this.bankName = aBankName;
   this.phone = aPhone;
   this.employeeNum = aEmployeeNum;
   }
  
   public String getBankName()
   {
   return bankName !=null?bankName:"";
   }
  
   public String getPhone()
   {
   return phone!=null?phone:"";
   }
  
   public int getEmployeeNum()
   {
   return employeeNum;
   }
  
   public byte[] serialize() throws IOException
   {
   ByteArrayOutputStream bos = new ByteArrayOutputStream();
   DataOutputStream dos = new DataOutputStream(bos);
  
   dos.writeUTF(getBankName());
   dos.writeUTF(getPhone());
   dos.writeInt(getEmployeeNum());
   dos.flush();
  
   return bos.toByteArray();
   }
  
   public Bank deserialize(byte[] data) throws IOException
   {
   ByteArrayInputStream bis = new ByteArrayInputStream(data);
   DataInputStream dis = new DataInputStream(bis);
  
   Bank myBank = new Bank();
   myBank.bankName = dis.readUTF();
   myBank.phone = dis.readUTF();
   myBank.employeeNum = dis.readInt();
  
   return myBank;
   }
  }
  
  這樣我們就實(shí)現(xiàn)了對象的序列化,使用起來也非常簡單。序列化和反序列化的操作分別如下面所示:
  
  Bank aBank = .....;
  RecordStore rs = .....;
  try
  {
   byte[] data = aBank.serialize();
   rs.addRecord(data,0,data.length);
  }
  
  catch(IOException e)
  {
   //do something
  }
  
  catch(RecordStoreException e)
  {
   //do something
  }
  
  byte[] data = ..........;
  Bank aBank = null;
  try
  {
   aBank = Bank.deserialize(data);
  }
  catch(IOException e)
  {
  
  }
  
  值得注重的一點(diǎn)是在Bank類中我們的成員都是基本數(shù)據(jù)類型以及String類型,并不存在指向其他對象的引用,這是最理想也是最簡單的情況,事實(shí)上我們在J2ME中設(shè)計序列化的類的時候也應(yīng)該盡量這樣做,避免不必要得麻煩。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 南澳县| 灌阳县| 克东县| 龙江县| 浪卡子县| 鸡东县| 会宁县| 九江市| 巴南区| 宜宾县| 朔州市| 青河县| 平果县| 灵宝市| 乡城县| 绍兴县| 新绛县| 施甸县| 新巴尔虎左旗| 射洪县| 泸水县| 襄樊市| 区。| 天台县| 广宁县| 鄯善县| 博爱县| 分宜县| 亚东县| 金塔县| 乐陵市| 静海县| 任丘市| 武安市| 蒲城县| 东山县| 波密县| 永胜县| 云阳县| 华亭县| 阳东县|