ObjectInputStream与ObjectOutputStream直接操作对象的流,可以将对象持久化(序列化),被操作的对象需要实现Serializable接口,该接口没有抽象方法,是一种标记接口。假设定义了一个Person类,有如下代码:
Person p=new Person(......);
ObjectInputStream ois=new ObjectInputStream(new FileOutputStream("obj.txt"));
ObjectOutputStream oos=new ObjectOutputStream (new FileInputStream("obj.txt"));
oos.writeObject(p);ois.readObject(p);
以上代码分别写入和读取一个Person对象,前提是Person必须实现Serializable接口。凡是实现了Serializable接口的类在内存中都有一个唯一的序列号,序列号由代表各个成员的数字标签生成,writeObject(p)和readObject(p)都是根据类Person类的序列号来确定要读取的内容,如果Person类的某个成员改变,比如由public变成private,那么该类的序列号就会改变,readObject()按照新的序列号去读取原有的内容,将出现错误,提高了安全性。如果想避免因修改类,造成再次读取原有对象失败,可以自己手动修改类的序列号,确保其始终唯一,这样新类仍然可以访问曾经被序列化的旧类。
静态数据不能被序列化,也就是说如果从文件中读取一对象,该对象中的静态成员将始终保持第一次写入的值,如果某非静态成员不想序列化用关键字transient ,保证该成员在堆内存中存在,而不存在于文件中,如果读取返回的是默认初始化值,比如int型返回0。一般编程时真正存储Object用文件名:类名.object。
ObjectOutputStream对象的write(int)读取数据的低8位,write(Int)读取数据的全部32位。
|
|