前言
序列化是将对象转换为可传输格式的过程。是一种数据的持久化手段。一般广泛应用于网络传输,RMI和RPC等场景中。几乎所有的商用编程语言都有序列化的能力,不管是数据存储到硬盘,还是通过网络的微服务传输,都需要序列化能力。
JAVA序列化
在Java的序列化机制中,如果是String,枚举或者实现了Serializable接口的类,均可以通过Java的序列化机制,将类序列化为符合编码的数据流,然后通过InputStream和OutputStream将内存中的类持久化到硬盘或者网络中;同时,也可以通过反序列化机制将磁盘中的字节码再转换成内存中的类。
如果一个类想被序列化,需要实现Serializable接口。否则将抛出NotSerializableException异常。Serializable接口没有方法或字段,仅用于标识可序列化的语义。
自定义类通过实现Serializable接口做标识,进而在I0中实现序列化和反序列化,具体的执行路径如下:
#write0bject ->#write0bject0(判断类是否是自定义类)->#write0rdinaryObject(区分Serializable和Externalizable)->writeSerialData(序列化fields)->invokewriteobject(反射调用类自己的序列化策略)
其中,在invokeWriteObject的阶段,系统就会处理自定义类的序列化方案
这是因为,在序列化操作过程中会对类型进行检查,要求被序列化的类必须属于Enum、Array和Serializable类型其中的任何一种。
Serializable 和 Externalizable 接囗有何不同?
类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此