仅此记录,如果雷同,纯属巧合
java序列化顺序:
(1)类元数据(类的相关描述)
1、STREAM_MAGIC. 声明使用了序列化协议.
2、STREAM_VERSION. 序列化协议版本
3、TC_OBJECT. 声明这是一个新的对象.
4、Class名字的长度.
5、Class类名
6、序列化ID
7、标记号. 该值声明该对象支持序列化
8、该类所包含的域个数
(2)递归地输出父类描述
(3)从顶层开始输出对象实例的实际数值
下面我们来剖析看看这些东西是什么时候写入的,首先
是1和2
protected void writeStreamHeader() throws IOException {
bout.writeShort(STREAM_MAGIC);
bout.writeShort(STREAM_VERSION);
}
在new一个ObjectInputStream的时候,在其构造函数里面就调用了writeStreamHeader()
第3步在writeObject方法里面的
if (obj instanceof Serializable) {
writeOrdinaryObject(obj, desc, unshared);
}
里面写入bout.writeByte(TC_OBJECT);
然后是第4步,第5步是写类描述,第六步写对象数据
如此,就可以完全知道其序列化的顺序(即序列化的算法)
java反序列化
1、读STREAM_MAGIC和STREAM_VERSION----》readStreamHeader();
2、读TC_OBJECT
3、