java序列化入门

概念

将保存在内存中的对象数据转化为二进制数据流进行传输,任何对象都可以序列化

实现方法:实现java.io.Serializable接口
作用:把一个Java对象写入到硬盘或者传输到网路上面的其它计算机,这时我们就需要自己去通过java把相应的对象写成转换成字节流。对于这种通用的操作,我们为什么不使用统一的格式呢?没错,这里就出现了java的序列化的概念。在Java的OutputStream类下面的子类ObjectOutput-Stream类就有对应的WriteObject(Object object) 其中要求对应的object实现了java的序列化的接口。

在使用tomcat开发JavaEE相关项目的时候,我们关闭tomcat后,相应的session中的对象就存储在了硬盘上,如果我们想要在tomcat重启的时候能够从tomcat上面读取对应session中的内容,那么保存在session中的内容就必须实现相关的序列化操作,还有jdbc加载驱动用的就是反序列化,将字符串变为对象。

案例

方便起见,以scala语言编写,不影响内容表达

import java.io.{FileInputStream, FileOutputStream, ObjectInputStream, ObjectOutputStream}

object Test extends App {
  writeObj()
  readObj()

  def writeObj(): Unit = {
    //java.io.ObjectOutputStream是实现序列化的关键类,它可以将一个对象转换成二进制流,然后可以通过ObjectInputStream将二进制流还原成对象。
    //ObjectOutputStream只有一个public权限的构造方法:该构造方法需要传入一个OutputStream表示将对象二进制流写入到指定的OutputStream。
    val oos = new ObjectOutputStream(new FileOutputStream("./obj.txt"))
    //writeObject 方法用于将对象写入流中。所有对象(包括 String 和数组)都可以通过 writeObject 写入。
    //可将多个对象或基元写入流中。必须使用与写入对象时相同的类型和顺序从相应 ObjectInputstream 中读回对象。
    oos.writeObject(new Person("wangwu", 20))
    oos.close()
  }
  def readObj(): Unit ={
    //ObjectInputStream 反序列化流,将之前使用 ObjectOutputStream 序列化的原始数据恢复为对象,以流的方式读取对象。
    //txt文件先转为文件流对象,再转为Object流
    val ois = new ObjectInputStream(new FileInputStream("./obj.txt"))
    val person: Person = ois.readObject().asInstanceOf[Person]
    println(person)
  }
}

case class Person(name: String, age: Int)

如果不是case class,会报错,无法序列化错误,需要自行实现序列化,

Exception in thread "main" java.io.NotSerializableException

写法如下

class Person(name: String, age: Int) extends Serializable{}

就是case class默认是实现了序列化接口的,还是比较方便~

总结

  • 序列化用于把对象变成二进制字节流,反序列化反之
  • 序列化的目的是为了对象的传输
  • case class默认实现了序列化,一般的class需要自行实现序列化.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值