对象序列化机制:
允许把内存中的java对象转换成平台无关的二进制流,从而允许把这种二进制流永久的保存到磁盘上,或通过网络将这种二进制流传输到另一个网络节点。(序列化)
当其他程序获取了这种二进制流,就可以恢复成原来的java对象。(反序列化)
序列化的理解:
- 序列化就是在保存数据时,保存数据的值和数据类型。
- 用ObjectOutputStream类保存基本数据类型或对象的机制。
- ObjectOutputStream提供了序列化的功能。
反序列化的理解:
- 反序列化就是在恢复数据时,恢复数据的值和数据类型。
- 用ObjectInputStream类读取基本数据类型或对象的机制。
- ObjectInputStream提供反序列化的功能。
一、对象流的使用一:ObjectOutputStream和ObjectInputStream
1.使用ObjectOutputStream进行序列化操作,具体代码如下:
/** * 演示ObjectOutputStream的使用,完成数据的序列化 */ public class ObjectOutputStream_ { public static void main(String[] args) { //序列化后,保存的文件格式,不是存文本,而是按照它的格式来保存 String filePath = "D:\\data.dat"; ObjectOutputStream objectOutputStream = null; try { objectOutputStream = new ObjectOutputStream(new FileOutputStream(filePath)); //序列化数据到D:\\data.dat objectOutputStream.writeInt(100); //int ->Integer(实现了Serializable接口) objectOutputStream.writeBoolean(true); //boolean->Boolean(实现了Serializable接口) objectOutputStream.writeDouble(90.5); //double->Double(实现了Serializable接口) objectOutputStream.writeUTF("筱路"); //保存一个Dog对象 objectOutputStream.writeObject(new Dog("小黄", 3)); System.out.println("数据保存完毕(序列化形式)"); } catch (IOException e) { e.printStackTrace(); } finally { try { if (objectOutputStream != null) { objectOutputStream.close(); } } catch (IOException e) { e.printStackTrace(); } } } }
2.使用ObjectInputStream进行反序列化操作,具体代码如下:
public class ObjectInputStream_ { public static void main(String[] args) { //指定反序列化的文件 String filePath = "D:\\data.dat"; ObjectInputStream ois = null; try { ois = new ObjectInputStream(new FileInputStream(filePath)); //读取 //1.读取(序列化)的顺序需要和你保存(序列化)的顺序一致 //2.否则会出异常 System.out.println(ois.readInt()); System.out.println(ois.readBoolean()); System.out.println(ois.readDouble()); System.out.println(ois.readUTF()); //dog的编译类型是Object,dog的运行类型是Dog Object dog = ois.readObject(); System.out.println("运行类型=" + dog.getClass()); System.out.println("dog信息=" + dog); //注意细节 //1.如果我们希望调用Dog的方法,需要向下转型 //2.需要我们将Dog类的定义,放在可以引用的位置 Dog dog2 = (Dog) dog; System.out.println(dog2.getName()); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } finally { try { if (ois != null) {//关闭流,关闭外层流即可,底层会关闭FileInputStream流 ois.close(); } } catch (IOException e) { e.printStackTrace(); } } } }
具体日志输出信息为:
100 true 90.5 筱路 运行类型=class file.outputStream_.Dog dog信息=Dog{name='小黄', age=3} 小黄
二、对象流的使用二:ObjectOutputStream和ObjectInputStream
/** * 序列化过程:将内存中的java对象保存到磁盘中或通过网络传输出去 * 使用ObjectOutputStream实现 */ @Test public void test1(){ ObjectOutputStream oos = null; try { //造文件和处理流 oos = new ObjectOutputStream(new FileOutputStream("object.dat")); //把数据写出到磁盘中 oos.writeObject("程序员"); oos.flush();//刷新操作 }catch (Exception e){ e.printStackTrace(); }finally { if (oos!=null){ //关闭资源 try { oos.close(); } catch (IOException e) { e.printStackTrace(); } } } } /** * 反序列化过程:将磁盘文件中的对象还原为内存中的一个java对象 * 使用ObjectInputStream实现 */ @Test public void test2(){ ObjectInputStream ois=null; try { //造文件和对象流 ois = new ObjectInputStream(new FileInputStream("object.dat")); //把数据读入到内存中 Object oj = ois.readObject(); String s = (String) oj; System.out.println(s); }catch (Exception e){ e.printStackTrace(); }finally { if (ois!=null){ try { ois.close(); } catch (IOException e) { e.printStackTrace(); } } } }