[2025.1.18 JavaSE学习]对象流

对象流

需求

  • 将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();

ObjectInputStream

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(直接标记为不需要被序列化)修饰的成员
  • 序列化对象时,要求里面属性的类型也需要实现序列化接口
  • 序列化具备可继承性,如果某类实现了序列化,则所有子类也默认实现了序列化
posted @ 2025-01-18 02:51  Luna-Evelyn  阅读(11)  评论(0)    收藏  举报