序列化和反序列化是计算机中的一个重点内容,因最近遇到了相关问题,遂想总结一篇关于Java中序列化相关的文章。
一、什么是序列化?
序列化指的是将对象状态转换为可保持或传输的格式(字节序列:字节序列可以被完全存储以备以后重新生成原来的对象。)的过程。与序列化相对的是反序列化,指的是将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。
二、为什么要序列化?
把对象转换为字节序列的过程称为对象的序列化;
把字节序列恢复为对象的过程称为对象的反序列化。
字节序列:包含对象的数据和对象,一个序列化后的对象可以被写到数据库或文件中,也可用于网络传输。字节序列可以被完全存储以备以后重新生成原来的对象。
序列化不但可以在本机做,而且可以经由网络操作,也就是RMI(remote method invocation)。这个好处很大,它自动屏蔽了操作系统的差异,字节顺序等。比如,在Window平台生成一个对象并序列化之,然后通过网络传到一台Unix机器上,然后可以在这台Unix机器上正确地重构这个对象。
注意:
对象1=>字节序列=>对象2
对象1和对象2是不同的对象。
三、什么情况下需要序列化?
当我们需要将对象的状态信息通过网络进行传输,或者需要将对象的状态信息持久化,以便将来使用时都需要把对象进行序列化。
四、什么是Serializable接口?
一个对象序列化的接口,一个类只有实现了Serializable接口,它的对象才能被序列化。
注意:
transient:让某些被修饰的成员属性变量不被序列化,这样做主要是为了节省存储空间。
五、为什么要实现Serializable?
那是存储对象在存储介质中,以便在下次使用的时候可以很快捷的重建一个副本。
六、为什么Serializable接口是空的?
进入Serializable接口中,我们会发现该接口是个空接口,可以理解成标识接口(举手回答问题)。通知JVM帮你序列化这个类,Java提供用来进行高效率的异地共享实例对象的机制,实现这个接口即可。
七、序列化的特性
对象序列化主要用来支持2种主要的特性:
(1)Java的RMI(remote method invocation)。RMI允许像在本机上一样操作远程机器上的对象。当发送消息给远程对象时,就需要用到serializaiton机制来发送参数和接收返回值。
(2)Java的JavaBeans。Bean的状态信息通常是在设计时配置的。Bean的状态信息必须被存起来,以便当程序运行时能恢复这些状态信息。这也需要serializaiton机制。
八、序列化实现轻量级的持久性?
Java语言里现在只支持lightweight persistence,就是轻量级持久化,这是通过serialization机制来实现的。
persistence是指一个对象的生命周期不由程序是否执行来决定,即使是在程序终止时这个对象也存在。它把一个serializable的对象写到磁盘(本机或其他机器上的非RAM存储器),并在程序重新调用时再读取对象到通常的RAM存储器。
九、为什么说Java的serialization机制实现的是lightweight?
persistence?因为你必须显式的序列化和反序列化程序里的对象;而不是直接由一个关键词来定义一个对象是序列化的然后由系统做相应的处理。
十、父类实现了Serializable接口,子类还要是实现吗?
不用,子类继承父类的所有功能和属性,所以父类实现接口会重写接口的方法,即实现了该功能,则子类也会继承下来。这里的Serializable接口虽然是空接口,也可以这样理解。
十一、序列化和反序列化的原理?
其实分别就是通过ObjectOutputStream.writeObject()和ObjectInputStream.readObject()来实现的。
附我最近遇到的问题:
我用的dubbo框架,web服务和event服务在不同服务器上,controller在web上,service在event上,调用接口提示无法找到service?
原因:controller调用service时,传递了对象参数,而该对象的实体类没有序列化,所以照成这个结果。
处理:对应实体类做序列化处理。
越大气越幸运,越努力越成功!