欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

Hadoop序列化和Java序列化的示例分析

小編給大家分享一下Hadoop序列化和Java序列化的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

創(chuàng)新互聯(lián)公司是工信部頒發(fā)資質(zhì)IDC服務(wù)器商,為用戶提供優(yōu)質(zhì)的達(dá)州托管服務(wù)器服務(wù)

Java序列化機(jī)制將對(duì)象裝換為連續(xù)的byte數(shù)據(jù), 這些數(shù)據(jù)可以在以后還原(反序列化)成原來的對(duì)象
Java中, 要想一個(gè)類的實(shí)例可被序列化, 該類須實(shí)現(xiàn)Serializable接口. Serializable接口是一個(gè)標(biāo)志, 沒有任何方法, 其定義如下

 public interface Serializable {
 }

定義一個(gè)類Block1, 該類實(shí)現(xiàn)了Serializable接口

 class Block1 implements Serializable {
 private int one = 1;
 private int two = 2;
 private int three = 3;
 @Override
 public String toString() {
  return "Block1 [one=" + one + ", two=" + two + ", three=" + three + "]";
 }
}

定義一個(gè)類JavaSerializeTest, 測(cè)試Java序列化機(jī)制

 public class JavaSerializeTest {
 public static void main(String[] args) throws IOException, ClassNotFoundException {
  Block1 block = new Block1();
  ByteArrayOutputStream baos = null;
  ObjectOutputStream oos = null;
  ObjectInputStream ois = null;
  try {
   // 創(chuàng)建一個(gè)ByteArrayOutputStream對(duì)象baos
   baos = new ByteArrayOutputStream();
   // 裝飾ByteArrayOutputStream對(duì)象baos, 得到ObjectOutputStream對(duì)象oos
   oos = new ObjectOutputStream(baos);
   // 對(duì)block進(jìn)行序列化, 序列化到baos中
   oos.writeObject(block);
   // 從字節(jié)數(shù)組輸出流baos中得到字節(jié)數(shù)組
   byte[] bytes = baos.toByteArray();
   System.out.println("序列化Block1對(duì)象為byte數(shù)組, byte數(shù)組長(zhǎng)度為:" + bytes.length);
   // 以字節(jié)數(shù)組bytes創(chuàng)建ByteArrayInputStream對(duì)象, 再把這個(gè)對(duì)象裝飾成ObjectInputStream對(duì)象ois
   ois = new ObjectInputStream(new ByteArrayInputStream(bytes));
   // 調(diào)用ObjectInputStream對(duì)象ois的readObject()方法, 實(shí)現(xiàn)反序列化, 返回一個(gè)Block1對(duì)象block1
   Block1 block1 = (Block1) ois.readObject();
   System.out.println("byte數(shù)組反序列化, 還原成Block1對(duì)象: " + block1);
  } finally {
   //關(guān)閉流
  }
 }
}

Console輸出:
序列化Block1對(duì)象為byte數(shù)組, byte數(shù)組長(zhǎng)度: 72
byte數(shù)組反序列化, 還原成Block1對(duì)象: Block1 [one=1, two=2, three=3]


ObjectOutputStream提供了一些writeX()方法, 包括writeInt(), writeLong(), writeFloat(), writeUTF()...
JavaAPI:
public final void writeObject(Object obj) throws IOException
將指定的對(duì)象寫入ObjectOutputStream。對(duì)象的類、類的簽名,以及類及其所有父類型的非瞬態(tài)和非靜態(tài)字段的值都將被寫入

由于Java的序列化機(jī)制太過強(qiáng)大, 可以看出只有3個(gè)屬性(都為int類型,一共12個(gè)字節(jié))的Block1對(duì)象block, 序列化后生成的字節(jié)數(shù)組卻有72個(gè)字節(jié), 因此對(duì)于Hadoop來說, 需要一個(gè)新的序列化機(jī)制

Hadoop中, 要想一個(gè)類的實(shí)例可被序列化, 該類須實(shí)現(xiàn)Writable接口.
Writable接口有兩個(gè)方法, write()序列化和readFields()反序列化, 其定義如下:

 public interface Writable {
  /*
   * 將對(duì)象(this)的屬性字段序列化到輸出流DataOuput out中。
   */
  void write(DataOutput out) throws IOException;
  /*
   * 從輸入流DataInput in中讀取屬性字段信息,重組為(this)對(duì)象,這是一個(gè)反序列化操作。
   */
  void readFields(DataInput in) throws IOException;
}

定義一個(gè)類Block2, 該類實(shí)現(xiàn)了Writable接口

 class Block2 implements Writable {
 private int one = 1;
 private int two = 2;
 private int three = 3;
 /*
  * 將對(duì)象(this)的屬性字段序列化到輸出流DataOuput out中。
  */
 @Override
 public void write(DataOutput out) throws IOException {
  out.writeInt(one);
  out.writeInt(two);
  out.writeInt(three);
 }
 /*
  * 從輸入流DataInput in中讀取屬性字段信息,重組為(this)對(duì)象,這是一個(gè)反序列化操作。
  */
 @Override
 public void readFields(DataInput in) throws IOException {
  one = in.readInt();
  // 為了看出來反序列化效果, 交換第two和three,
  three = in.readInt();    // two=3
  two = in.readInt();    // three=2
 }
 @Override
 public String toString() {
  return "Block2 [one=" + one + ", two=" + two + ", three=" + three + "]";
 }
}

PS: write()方法中out.writeX(x)和readFields()方法中x = in.readX()順序必須一致, 否則無法保證數(shù)據(jù)的正確性

定義一個(gè)類HadoopSerializeTest, 測(cè)試Hadoop序列化機(jī)

 public class HadoopSerializeTest {
 public static void main(String[] args) throws IOException, ClassNotFoundException {
  Block2 block = new Block2();
  ByteArrayOutputStream baos = null;
  DataOutputStream dos = null;
  DataInputStream dis = null;
  try {
   // 創(chuàng)建一個(gè)ByteArrayOutputStream對(duì)象baos
   baos = new ByteArrayOutputStream();
   // 裝飾ByteArrayOutputStream對(duì)象baos, 得到DataOutputStream對(duì)象dos
   dos = new DataOutputStream(baos);
   // 對(duì)block進(jìn)行序列化, 序列化到baos中
   block.write(dos);
   // 從baos中得到字節(jié)數(shù)組
   byte[] bytes = baos.toByteArray();
   System.out.println("序列化Block2對(duì)象為byte數(shù)組, byte數(shù)組長(zhǎng)度為: " + bytes.length);
   // 以字節(jié)數(shù)組bytes創(chuàng)建ByteArrayInputStream對(duì)象, 再把這個(gè)對(duì)象裝飾成DataInputStream對(duì)象dis
   dis = new DataInputStream(new ByteArrayInputStream(bytes));
   Block2 block1 = new Block2();
   System.out.println("未反序列化的Block2對(duì)象: " + block1);
   // 調(diào)用block1的readFields(DataInput)方法, 實(shí)現(xiàn)反序列化, 交換two和three的值
   block1.readFields(dis);
   System.out.println("byte數(shù)組反序列化, 還原成Block2對(duì)象:" + block1);
  } finally {
   //關(guān)閉流
  }
 }
}

Console輸出:
序列化Block2對(duì)象為byte數(shù)組, byte數(shù)組長(zhǎng)度: 12
未反序列化的Block2對(duì)象: Block2 [one=1, two=2, three=3]
byte數(shù)組反序列化, 還原成Block2對(duì)象: Block2 [one=1, two=3, three=2]

由于Block2對(duì)象block序列化時(shí)只輸出3個(gè)int, 序列化后生成的字節(jié)數(shù)組只有12個(gè)字節(jié), 和Java的序列化機(jī)制的輸出結(jié)果(72個(gè)字節(jié))對(duì)比, Hadoop的序列化結(jié)果緊湊而快速

以上是“Hadoop序列化和Java序列化的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

本文名稱:Hadoop序列化和Java序列化的示例分析
網(wǎng)頁(yè)URL:http://chinadenli.net/article36/ihdisg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗(yàn)標(biāo)簽優(yōu)化網(wǎng)站維護(hù)動(dòng)態(tài)網(wǎng)站軟件開發(fā)App設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)