1.序列化和反序列化
-
序列化:将对象转换成字节序列,可以加方便存储在磁盘或在网络上传输。
//1.创建一个文件流,参数为要保存对象的文件名 FileOutputStream fos = new FileOutputStream("MyObejext.dat"); //2.创建对象流,将文件流的引用作为参数传进去 ObjectOutputStream os = new ObjectOutputStream(fos); //3.写入对象,传入一个对象作为参数 oos.writeObject(); //4.关闭流 oos.close(); //为了方便观看,省略了捕获异常
-
反序列化:恢复对象的原状态,将字节序列还原成对象。
//1.创建一个文件流,参数为要保存对象的文件名 FileInputStream fis = new FileInputStream("MyObejext.dat"); //2.创建对象流,将文件流的引用作为参数传进去 ObjectInputStream os = new ObjectInputStream(fis); //3.读入对象,读入的对象返回值类型是Object,还要根据实际对象类型转换类型 Object o = ois.readObject(); //4.关闭流 ois.close(); //为了方便观看,省略了捕获异常
2.Serializable
Serializable是一个接口,是一个标记接口。此接口没有任何方法需要实现,唯一目的就是声明有实现它的类可以进行序列化。
3.transient
如果某实例变量不能或不应该被序列化,就用此关键字。
4.使用serialVersionUID
当对象被序列化的同时,该对象都会被标记上一个类的版本识别ID,这个ID就是serialVersionUID,是一个静态常量。serialVersionUID是根据类的结构信息计算出来的。**如果类没有显示定义这个静态常量,它的值是Java运行时根据类的内部结构自动生成。如果类的实例变量做出来修改,serialVersionUID可能会发生变化。**当Java要还原对象时,会对比对象与Java虚拟机上类的serialVersionUID。如果不相符,Java虚拟机就会抛出异常,还原操作会失败。
解决方案:把serialVersionUID定义在类中。
想知道某个类的serialVersionUID,可以采用可以用JDK的bin目录下的serialver.exe产生SerialVersionUID。