-
ObjectInputStream 类的常用方法
1. 写入字符串
public void writeUTF(String str) throws IOException
参数:str - 要写入的字符串
2. 序列化一个对象
public final void writeObject(Object obj) throws IOException
参数:obj - 要写入的对象
说明:此对象应实现 Serializable 或 Externalizable 接口
3. 关闭流
public void close() throws IOException
说明:必须 close 关闭或者 flush 刷新,否则写入不到指定文件
public class ObjectOutputStream01 {public static void main(String[] args) throws IOException {String filePath = "d:\\data.dat";ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath));// 存放数据, 序列化数据到文件中oos.writeInt(100);oos.writeBoolean(true);oos.writeChar('a');oos.writeDouble(12.5);oos.writeUTF("韩顺平教育");// 保存对象oos.writeObject(new Dog("小黄", 2));// 关闭流oos.close();System.out.println("序列化完成");}
}class Dog implements Serializable {private String name;private int age;public Dog(String name, int age) {this.name = name;this.age = age;}
}
-
ObjectOutputStream 类的常用方法
1. 读取对象
public final Object readObject() throws IOException, ClassNotFoundException
返回值:返回读取到的 Object 对象
异常:ClassNotFoundException - 无法找到序列化对象的类
InvalidClassException - 类的序列化版本与从流中读取的类描述符的类型不匹配,或者在加载序列化类的过程中找不到该类
OptionalDataException - 没有读取完前面的元素,或者前面的元素使用的readXXX方法读错了原始数据
说明:反序列化读取顺序,必须和序列化顺序一致,如果要调用该类的特有方法需要获得该类的定义,并向下转型。(要么引入包,要么将该类设置为 public 公有的)
2. 关闭流
public void close() throws IOException
public class ObjectInputStream01 {public static void main(String[] args) throws IOException, ClassNotFoundException {String filePath = "d:\\data.dat";ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath));// 反序列化的顺序 必须和序列化的顺序一致// 存放数据, 序列化数据到文件中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());// 读取保存对象System.out.println(ois.readObject());// 关闭流ois.close();System.out.println("反序列化完成");}
}
-
对处理流的细节
1. 序列化对象必须要实现 Serializable 或者 externalizable
2. 文件读写顺序要一致,若不一致会报 OptionalDataException 异常
3. 序列化的类中建议添加一个 SerialVersionUID,可以提高版本兼容性
4. static 和 transient 关键字修饰的方法和属性不会被序列化,用于保护一些敏感的信息
5. 序列化对象时,该对象的所有属性也都必须实现序列化接口,除了static 和 transient
6. 序列化具有可继承性,如果父类实现了序列化接口,其所有子类也默认实现了序列化接口