JavaNote_1.0.4_对象序列化

定义

Java中的序列化是指将一个Java对象“转换”为一串连续的byte字节(字节数组或者流),以便写入文件或者通过socket(套接字)发送出去。这一串字节码包括了对象的数据,以及其成员变量的类型信息(元信息)等。
反序列化:将文件或者socket中读取字节,还原回Java对象。

我们可以设计一种对象序列化的ObjectSerializer接口。链接

Java序列化

Java自带序列化函数,其优点是安全可靠,兼容性好,缺点是无法跨语言,序列化后的流太大,性能很差。

基本用法
  1. Java序列化要求被序列化的对象的类必须直接或者间接实现java.io.Serializable接口,也就是序列化接口的继承树上的某一个接口,或者扩展了此接口的接口。否则就会报NoSerializableException异常。
  2. 静态成员变量(static)无法被序列化,因为静态成员变量属于类。
  3. 瞬时成员变量(transient)不会被序列化。
  4. 其他普通的成员变量都会被序列化,无论是私有的,还是final的。
  5. 被序列化的对象是否遵循bean规范没有影响,可以遵循,也可以不遵循。
  6. 不管是不是属性,有没有getter/setter,都会被序列化。
  7. 内部类也必须实现Serializable接口(即使它位于一个实现了Serializable接口的外部类的内部)
  8. 反序列化不依赖于构造函数,即使构造函数是私有的,也不会影响反序列化进程。
  9. 跨虚拟机反序列化时,要求当前JVM已经装载了反序列化对象的类,否则将抛出ClassNotFoundException异常。
  10. 跨虚拟机反序列化时,如果Jvm中装载的类的版本不一致,则会导致反序列化时抛出InvalidCastException异常。

Java序列化分别使用ObjectOutputStream和ObjectInputStream两个流来实现序列化和反序列化操作。ObjectOutputStream类的writeObject(obj)方法用来将对象序列化后写入输出流。ObjectInputStream类的readObject()方法则是从输入流中反序列化出对象。
样例

关于SerialVersionUID

目的是判断反序列化的文件和之前保存的文件是否一致。如果不指定的话会将当前类的hashCode赋值给它。如果不一致的话会报InvalidCastException异常。

自定义序列化方法

所有的类就继承自,Object类,Object类中有两个特殊方法,writeObject()和readObject()如果我们的类重写了两个方法,序列化当前类的对象的时候,java虚拟机就会调用他们,而不是默认的序列化或者反序列化动作。这样做可以实现例写入文件加密等特殊用法。
样例

对Java序列化代码进行封装

你可能感兴趣的:(JAVA,jvm,java,开发语言)