对象流
自定义的类要序列化的话要实 Serializable接口(没有定义方法,为标识接口) 使用ObjectOutputStream的writeObject(对象)方法将对象输出,将对象写入到文件中 序列化只有属性被序列化,方法没有被序列化 用ObjectInputStream来反序列化,通过readObject()**来读取出来,将对象从文件中读出来
这两个流的构造方法为传入一个输出流和一个输入流
FileOutputStream fos = new FileOutputStream(f);
ObjectOutputStream oos =new ObjectOutputStream(fos);
FileInputStream fis = new FileInputStream(f);
ObjectInputStream ois =new ObjectInputStream(fis);
oos.writeObject(h);//写入
Hero h2 = (Hero) ois.readObject();//读出
Externalizable接口是Serializable的子接口
Externalizable可以自定义你要序列化的属性,也就是说可以只序列化一部分的属性
它里面有两个你要重写的方法readExternal(ObjectInput对象)和writeExternal(ObjectOutput对象)
这里的ObjectOutput与ObjectInput都是 DateOutput与DateInput的子类,所以有数据流的各个方法
重写Externalzable里的两个方法就是说
1.writeExternal里调用ObjectOutput对象的写入的方法
2.readExternal里调用ObjectInput对象的读取方法
在进行对象的序列化和反序列化的时候就会自动调用你 覆写的这 两个方法来进行属性的 序列化
这样你就可以自定义你要序列化 的属性。
对比Externalizable和Serializable接口,Serializable实现更简单,性能低,占用空间大
Externalizable由程序员自己完成,实现复杂,性能可能更高,占用空间可能更小
transient关键字
用Serializable接口时,如果有些属性不想被被序列化,可以使用transient关键字
被transient关键字描述的属性不会被序列号
transient int age=10;
这里的age就不会被序列化
注意
ObjectInputStream与一般的InputStream不同,ObjectInputStream在实例化的时候会自动读取文件的头部字段
而且ObjectInputStream在读空文件时
会报异常 而 一般字节流只会返回-1
因此在应用时如果该文件是空的话要先实例化ObjectOutputStream去写入一些东西再实例化ObjectInputStream