序列化和反序列化的定义:
Java序列化就是指把Java对象转换为字节序列的过程
Java反序列化就是指把字节序列恢复为Java对象的过程。
序列化最重要的作用:在传递和保存对象时.保证对象的完整性和可传递性。对象转换为有序字节流,以便在网络上传输或者保存在本地文件中。
反序列化的最重要的作用:根据字节流中保存的对象状态及描述信息,通过反序列化重建对象。
将对象转为字节流存储到硬盘上,当JVM停机的话,字节流还会在硬盘上默默等待,等待下一次JVM的启动,把序列化的对象,通过反序列化为原来的对象。
众所周知对象在堆中储存,堆是内存空间断电消失,所以序列化是储存对象的很好的方式。
过程实现序列化的必备要求
只有实现了Serializable或者Externalizable接口的类的对象才能被序列化为字节序列。(不是则会抛出异常)
附:Serializable接口简析
Serializable是一个空接口
serialVersionUID(序列化版本号)
标识序列化后的版本号,若在反序列回Java对象时,其相应Java类的SerialVersionUID不同(对象的类被修改之后其未显示定义的SerialVersionUID会自动改变),则无法反序列化,报InvalidCastException(序列化版本不一致)
serialVersionUID生成,可以是显式指定,也可以是隐式自动生成(JVM生成)
注意在类中的内部类也需要实现Serializable或者Externalizable接口不然会报错
如下:
并且可以通过第二张图片可以看出他报错并不会报错到相应的类上,只会报到序列化的那一行
大致操作过程:
private Mapmap = new TreeMap (); FileOutputStream fos = null; ObjectOutputStream oos = null; try { fos = new FileOutputStream ("C:\Users\杨骜捷\IdeaProjects\ProjectFinal\src\com\Change\Student"); oos = new ObjectOutputStream (fos); oos.writeObject (map); oos.flush (); } catch (IOException e){ e.printStackTrace (); } finally { if (null != fos) { try { fos.close (); }catch (IOException e) { e.printStackTrace (); } } if (null != oos) { try { oos.close (); }catch (IOException e) { e.printStackTrace (); } } }
用到的类
1.java.io.ObjectInputStream–对象输入流
该类的readObject()方法从输入流中读取字节序列,然后将字节序列反序列化为一个对象并返回。
构造方法的api
2.java.io.ObjectOutputStream–对象输出流
该类的writeObject(Object obj)方法将将传入的obj对象进行序列化,把得到的字节序列写入到目标输出流中进行输出。
构造方法的api
注意:
序列化时,只对对象的状态进行保存,而不管对象的方法。
当一个父类实现序列化,子类自动实现序列化,不需要显式实现Serializable接口。
当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化。



