02_Hadoop序列化_2.1 序列化概述

4. Java序列化(Serializable)框架 or Hadoop序列化(Writable)框架

 

 代码示例 

复制代码
package twoPk {

  import java.io._
  import java.util.Date

  import org.apache.hadoop.io.Writable

  //对比 Hadoop-Writable 和  Serializable
  object WritableVsSerializable extends App {
    private val begin: Long = new Date().getTime
    //1. 创建 FileOutputStream对象
    val outPath = "src/main/data/output/Person.data"
    private val file = new File(outPath)
    private val fileOutputStream = new FileOutputStream(file)
    //2. 创建对象
    var person = new Person
    person.id = 1
    //3. 序列化对象
    //WritableFun(person, fileOutputStream) //用时: 1  size : 143 bytes
    SerializableFun(person, fileOutputStream) //用时: 18  size : 235 bytes
    private val end: Long = new Date().getTime
    //4. 查看结果
    println(s"用时: ${end - begin}  size : ${file.length} bytes")

    // 1. Hadoop-Writable 序列化对象
    def WritableFun(per: Person, fopstream: FileOutputStream) = {
      per.write(new DataOutputStream(fopstream))
      fopstream.close
    }

    // 2. Hadoop-Writable 序列化对象
    def SerializableFun(per: Person, fopstream: FileOutputStream) = {
      val objectOutputStream = new ObjectOutputStream(fopstream)
      objectOutputStream.writeObject(per)
      objectOutputStream.close
    }


  }

  //Hadoop Writable 序列化框架(序列化&反序列化)
  object WritableWriteTest extends App {
    val outPath = "src/main/data/output/Person.data"
    //1. 创建 DataOutput流对象
    private val dataOutputStream = new DataOutputStream(new FileOutputStream(outPath))
    //2. 创建对象
    var person = new Person
    person.id = 1
    person.name = "小王"
    //3. 持久化到磁盘
    person.write(dataOutputStream)
    //4. 关闭资源
    dataOutputStream.close
  }

  //Hadoop Writable 序列化框架(反序列化)
  object WritableReadTest extends App {
    val outPath = "src/main/data/output/Person.data"
    //1. 创建 DataOutput流对象
    private val datainputStream = new DataInputStream(new FileInputStream(outPath))
    //2. 创建对象
    var person = new Person
    //3. 持久化到磁盘
    person.readFields(datainputStream)
    //4. 关闭资源
    datainputStream.close
    //5. 打印对象
    println(person)
  }

  //Java Serializable 序列化对象
  object ObjectOutputStreamTest extends App {
    // 1. 创建流对象
    val outPath = "sparkcore/src/main/data/Person.data"
    private val outputStream = new ObjectOutputStream(new FileOutputStream(outPath))

    // 2. 序列化对象 持久化到磁盘
    outputStream.writeObject(new Person)

    // 3. 关闭流
    outputStream.close
    println("序列化完成")

  }

  //Java Serializable 反列化对象
  object ObjectInputStreamTest extends App {
    // 1. 创建流对象
    val outPath = "sparkcore/src/main/data/Person.data"
    private val inputStream = new ObjectInputStream(new FileInputStream(outPath))

    // 2. 读取二进制 将对象反序列化到内存
    private val readObject = inputStream.readObject.asInstanceOf[Person]

    println(readObject)
    readObject.show


    // 3. 关闭流
    inputStream.close


  }

  // Person对象
  class Person extends Serializable with Writable {
    var id = 10
    var name = "谁谓河广?一苇杭之。谁谓宋远?跂予望之。\n谁谓河广?曾不容刀。谁谓宋远?曾不崇朝。"
    var sum = 19.8
    var serialVersionUID: Long = 888L

    def show = println("Person - show")

    override def toString = s"Person($id, $name, $sum)"

    override def write(out: DataOutput): Unit = {
      out.writeInt(id)
      out.writeUTF(name)
      out.writeDouble(sum)
      out.writeLong(serialVersionUID)
    }

    override def readFields(in: DataInput): Unit = {
      id = in.readInt
      name = in.readUTF
      sum = in.readDouble
      serialVersionUID = in.readLong

    }
  }



}
复制代码

 

posted @   学而不思则罔!  阅读(28)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界
点击右上角即可分享
微信分享提示