概念
将保存在内存中的对象数据
转化为二进制数据流
进行传输,任何对象都可以序列化
实现方法:实现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需要自行实现序列化.