java 的对象流 对象序列化

对象流

自定义的类要序列化的话要实 Serializable接口(没有定义方法,为标识接口) 使用ObjectOutputStreamwriteObject(对象)方法将对象输出,将对象写入到文件中 序列化只有属性被序列化,方法没有被序列化 用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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值