讲这个之前先来描述一段异常:向后台数据库视图(实体含文件)发起一个查询请求,前台带了个条件和分页就兴高采烈的向业务层扬帆起航了。但是谁曾想,本来顺风顺水的一段请求响应,发生了一件让我对电脑它全家都大不敬了的悬案。明明给了数据库6笔数据,本着有来有回、公平交易的原则它给我返回6条数据这天经地义,当看到list.size=6时,我兴奋滴喝了一口水故作平静继续检查着数据,随后发现系统返回的6条数据是一样的,好比你借人600RMB,别人还了一张100的还有五张连编号都一样的100给你,试问谁敢要。要多反思,于是我找遍了所有相关函数以及处理过程Demo,不断的Debug,查Baidu,执行SQL直到失去耐心。最后才知道,是没有序列化的缘故。
序列化能解决什么样的业务需求?
在java中,我们可以通过多种方式来创建一个对象,并且只要该对象没有被GC回收我们是可以复用这个对象。但是我们创建出来的java对象都存在于JVM的堆内存中,只有当JVM处于运行状态的时候这个对象才能存在,一旦JVM停止运行,该对象也会随之而丢失。
但是在实际开发场景中,我们需要将这些对象持久化下来,让它的存在不再局限于JVM的运行,在需要的时候读出所要的对象。换而言之就是java对象通过持久层框架存入数据库中,这就是序列化的使用场景。
那么,什么是序列化?
专业度娘:序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。就是把对象转换为字节序列的过程。
通俗点讲:在代码运行的时候,我们可以看到很多的对象(可以是一个),也可以是一类对象的集合,很多的对象、数据、文件,他们存在的格式各不相同,这样就很难被统一保存和传输,经过序列化以后就都是字节流了,无论原来是什么东西,都能变成一样的流,就可以进行通用的格式传输或保存,传输结束以后,要再次使用,就进行反序列化还原,这样对象还是对象,文件还是文件。
如何序列化?
将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。
java提供了一系列的API实现对象的序列化与反序列化;具体接口和类包括;
1、java.io.Serializable
2、java.io.Externalizable
3、ObjectOutput
4、ObjectInput
5、ObejctOutputStream
6、ObjectInputStream
其中常用的为Serializable接口。
未完成。。。。。待续!