对象流
需求
- 将int num = 100这个int类型数据保存到文件中,要求能够从文件中恢复int型的100
- 将一个类的对象保存到文件中,且能够从文件中恢复(不能只是保存对象中的属性值)
- 以上要求,要将基本类型或对象进行序列化和反序列化
序列化和反序列化
- 序列化:保存数据时,保存数据的值和数据类型
- 反序列化:恢复数据时,恢复数据的值和数据类型
- 需要让某个对象支持序列化机制,必须让该类支持可序列化,必须实现两个接口之一:
- Serializable(标记接口,即没有任何字段)
- Externalizable
ObjectOutputStream
class Dog implements Serializable{}
String filePath = "data.dat";
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath));
//序列化数据到文件中
oos.writeInt(100);//int -> Integer:自动装包,Integer实现了Serializable
oos.writeBoolean(true);//boolean -> Boolean
oos.writeChar('a');//char -> Character
oos.writeUTF("abcde");//String
oos.writeObject(new Dog(10, "mike"));
oos.close();
String filePath = "data.dat";
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath));
//读取(反序列化)的顺序需要和保存(序列化)的顺序一致
System.out.println(ois.readInt());
System.out.println(ois.readBoolean());
System.out.println(ois.readChar());
......
Object o = ois.readObject();
System.out.println(o.getClass());
ois.close();
注意事项和相关细节
- 读写顺序要一致
- 要求实现序列化或反序列化对象,需要实现Serializable
- 序列化的类中建议添加SerialVersionUID,为了提高版本兼容性:
private static final long serialVersionUID = 1L;
//如果使用序列号,在你添加一个属性时,会认为是修改,而不是新的类
- 序列化对象时,默认将里面所有属性都进行序列化,但除了static或transient(直接标记为不需要被序列化)修饰的成员
- 序列化对象时,要求里面属性的类型也需要实现序列化接口
- 序列化具备可继承性,如果某类实现了序列化,则所有子类也默认实现了序列化