JVM
JVM (Java Virtual Machine) is an abstract machine that enables your computer to run a Java program. When you run the Java program, Java compiler first compiles your Java code to bytecode. Then, the JVM translates bytecode into native machine code (set of instructions that a computer's CPU executes directly).
Serializable接口的理解
作者:ytKing
链接:https://juejin.cn/post/7090150041024725028
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
1.序列化介绍
序列化:对象的寿命通常随着生成该对象的程序的终止而终止,有时候需要把在内存中的各种对象的状态(也就是实例变量,不是方法)保存下来,
并且可以在需要时再将对象恢复。虽然你可以用你自己的各种各样的方法来保存对象的状态,但是Java给你提供一种应该比你自己的好的保存对象状态的机制,那就是序列化。
[格式的转变] 转变前的格式是对象状态信息,转变后的格式是“可以存储或传输的形式”
[转变的目的] 转变成字节流后的目的主要有两个:1. 存储到磁盘; 2. 通过网络进行传输
总结:Java 序列化技术可以使你将一个对象的状态写入一个Byte 流里(序列化),并且可以从其它地方把该Byte 流里的数据读出来(反序列化)。Serializable
接口是一个标记接口 ,不用实现任何方法,标记当前类对象是可以序列化的,是给JVM
看的。
序列化的作用又可以简单理解为:把内存中的数据存储到磁盘中的过程。
1.静态成员变量是不能被序列化的——序列化是针对对象属性的,而静态成员变量是属于类的。
2.当一个父类实现序列化,子类就会自动实现序列化,不需要显式实现Serializable接口。
3.当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化。
应用场景:当需要将一个对象存储起来,如数据库,文档,或在网络中传输。那么需要序列化,这样再次读取 的时候能够直接获取为对象,而不是字符串。
2.继承问题
测试:去掉父类People
的implements Serializable
,让父类不实现序列化接口,子类Worker
实现序列化接口
3.类中存在引用对象的情况
类中存在引用对象,这个类对象在什么情况下可以实现序列化?
总结:一个类里面所有的属性必须是可序列化的,这个类才能顺利的序列化。
比如,类中存在引用对象,那么这个引用对象必须是可序列化的,这个类才能序列化。
4.同一个对象多次序列化之间有属性更新,前后的序列化有什么区别?
结论:当对象第一次序列化成功后,后续这个对象属性即使有修改,也不会对后面的序列化造成成影响。
原因:是序列化算法的原因,所有要序列化的对象都有一个序列化的编码号,当试图序列化一个对象,会检查这个对象是否已经序列化过,若从未序列化过,才会序列化为字节序列去输出。若已经序列化过,则会输出一个编码符号,不会重复序列化一个对象。
5.Serializable 在序列化和反序列化过程中大量使用了反射,因此其过程会产生的大量的内存碎片
6.serialVersionUID与兼容性问题
serialVersionUID作用:这个值是用于确保类序列化与反序列化的兼容性问题的,如果序列化和反序列化过程中这两个值不一样,那么将导致序列化失败,标识serialVersionUID,是为了反序列化时能正确标识。
9.作用及意义
为什么要进行序列化?↓
9.1 一些不够完整的解释
- 跨语言:某种编程语言(Java)在磁盘上存储的数据,有可能被别的编程语言(C++)读取
- 跨平台:这个问题在网络传输时更为突出,在A机器上可能为小端序,在B机器上则为大端序
9.2 完整的解释
序列化其实主要是进行了数据格式的转换,即从内存格式转换为磁盘格式。进行该转换还有两个很重要的原因:去地址和节省空间。
9.3总结——序列化的主要目的
- 实现数据的跨语言使用
- 实现数据的跨平台使用
- 数据去内存地址
- 降低磁盘存储空间
10.为什么Java类需要实现Serializable接口?
例子: 比如在SSM或者SpringBoot开发的项目中,几乎都是基于Restful风格,HTTP+JSON格式进行数据传输,在Controller层返回数据响应到浏览器之前,会将数据转换为JSON字符串,那么你思考过为何要这么做吗,很简单,因为String字符串底层也实现了序列化,因为后端的数据想要响应给浏览器,就必须进行网络传输,也就意味着需要序列化操作。