java 对象序列化与反序列化

1 序列化的定义

  1. 当我们想要将一个对象存储在文件中的时候,我们不仅要存储这个对象的值还要存储它的数据类型,这个过程就称为序列化。
  2. 反序列化是指从文件中将一个对象恢复到程序中。

2. ObjectOutputStream 与 ObjectInputStream

  1. ObjectOutputStream 提供序列化功能
  2. ObjectInputStream提供反序列化功能
  3. 一个对象要想进行序列化,必须实现Serializable接口或者是Externalizable接口之一,因为前者不需要实现方法,我们通常实现后者

3. 示例

  1. ObjectOutputStream
public class ObjectOutStream_ {
    public static void main(String[] args) throws Exception {
        //序列化后,保存的文件格式,不是存文本,而是按照他的格式来保存
        String filePath = "e:\\data.dat";

        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath));

        //序列化数据到 e:\data.dat
        oos.writeInt(100);// int -> Integer (实现了 Serializable)
        oos.writeBoolean(true);// boolean -> Boolean (实现了 Serializable)
        oos.writeChar('a');// char -> Character (实现了 Serializable)
        oos.writeDouble(9.5);// double -> Double (实现了 Serializable)
        oos.writeUTF("韩顺平教育");//String
        //保存一个dog对象
        oos.writeObject(new Dog("旺财", 10, "日本", "白色"));
        oos.close();
        System.out.println("数据保存完毕(序列化形式)");


    }
}
  1. ObjectInputStream
public class ObjectInputStream_ {
    public static void main(String[] args) throws IOException, ClassNotFoundException {

        //指定反序列化的文件
        String filePath = "e:\\data.dat";

        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath));

        //读取
        //老师解读
        //1. 读取(反序列化)的顺序需要和你保存数据(序列化)的顺序一致
        //2. 否则会出现异常

        System.out.println(ois.readInt());
        System.out.println(ois.readBoolean());

        System.out.println(ois.readChar());
        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);//底层 Object -> Dog

        //这里是特别重要的细节:

        //1. 如果我们希望调用Dog的方法, 需要向下转型
        //2. 需要我们将Dog类的定义,放在到可以引用的位置
        Dog dog2 = (Dog)dog;
        System.out.println(dog2.getName()); //旺财..

        //关闭流, 关闭外层流即可,底层会关闭 FileInputStream 流
        ois.close();


    }
}
  1. 需要注意的点
    java 对象序列化与反序列化_第1张图片
    进阶知识
    可以自己在需要序列化的类中定义的writeObject和readObject方法,进行用户自定义的序列化和反序列化,有时候这样可以实现一些解解密过程。

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