最近对序列化进行了一下深入的思考,以前一直没怎么在意这个点,发现还是有一些收获,写篇简单的笔记记录一下。
建议先看这篇文章
1、什么是序列化
在程序中怎么获取对象某个字段的值:
对象在JVM中的存储布局可以分为对象头,实例数据,字节对齐三部分,我们知道Java万物皆引用,所以可以通过这个引用去jvm里找到对象的实际位置,然后再计算出字段偏移量,根据字段的大小,读取对应大小的字节,就可以取到字段值了,详细见Java对象内存布局
那么如果要将这一对象持久化到磁盘或者通过网络传输,就需要把jvm中这部分数据转化成一个可传输的字节流,还有另外一个要求,转化后的结果当然还得转化回来,那就需要建立一个协议,比如保存对象的元数据,这一过程就是序列化与反序列化。
2、序列化的最终结果都是二进制比特流吗
不是,比如xml,json等序列化的结果就是普通文本,但是比如protobuf序列化的结果直接就是二进制,这二者没有本质区别,到达物理层后都会变成比特流,然后在网络上传输。
3、我们知道Java有默认的序列化方案,那么如何理解String的getBytes方