Hibernate 有二级缓存,缓存会将对象写进硬盘,就必须实例化,以及兼容对象在网络中的传输等。
Java 中常见的 String 也实现了 java.io.Serializable 接口。
实现 java.io.Serializable 接口的类是可序列化的,没有实现此接口的类将不能使他们的任一状态被序列化或者逆序列化,序列化类的所有子类和其本身都是可序列化的,这个序列化接口没有任何方法和域,仅用于标识序列化的语义。
确切的说应该是对象的序列化,一般程序在运行时,产生对象,这些对象随着程序的停止而消失,但如果我们想把某些对象保存下来,在程序终止运行后,这些对象依旧存在,可以在程序再次运行时可以读取这些对象的值,或者在其他程序中利用这些保存下来的对象,这种情况就要用到序列化。
只有序列化的对象才能保存到存储设备上,为了对象的序列化而需要实现的接口也只是一个象征性的接口而已。也就是说实现这个接口说明这个对象可以被序列化了,没有其他作用。之所以需要对象序列化,是因为有时候对象需要再网络上传输,传输的时候需要这种序列化处理,从服务器硬盘上把这些序列化的类取出,然后通过网络传输到客户端,再有客户端把这些序列化的对象读入内存,进行相应处理。
将二级缓存的内容持久的保存下来,便于恢复缓存的信息,Hibernate 的缓存机制通过使用序列化,断定应该是基于序列化的缓存,如果没有 java.io.Serializable 接口,在序列化时,使用 Object OutputStream 的write(Object) 方法将对象保存到文件时会出现异常。
Hibernate 并不需要持久化类一定实现 java.io.Serializable 接口,但对于采用分布式结构的Java应用,当Java 对象在不同的进程节点之间传输时,这个对象所属的类必须实现 java.io.Serializable 接口,此外,在 Java Web 应用中,如果希望对 HttpSession 中存放的Java对象进行持久化,那么这个 Java 对象所属的类也必须实现 java.io.Serializable 接口。