流 ------ 对象流 即 序列化 与 反序列化
对象流:
对象流:ObjectOutputStream / ObjectInputStream
读写对象的功能:readObject()从流中读取一个对象。 writeObject(Object object)向流中写入一个对象
使用流传输对象的过程称为序列化、反序列化
向流中写入对象称为序列化,从流中读取对象称为反序列化
序列化的例子:
我们先创建一个学生对象,然后在主函数中我创建一个学生对象 zhangsan ,然后我们调用对象流写入文件操作
、
我们创建的对象流 和之前的 缓冲流一样的,也需要借助于文件流,因为文件流是基础,要有基础才能盖高楼
这里我们没有写flush方法,因为close会自动执行flush操作。
另外一个重要的是,student类还必须实现序列化的接口Serializable,否则运行报错:类不能序列化的错误
反序列化的例子
补充:关于序列化的版本ID
发现student类中多了这么一行代码,因为不写这行代码,eclipse会发出一个警告,然后加上这行版本号之后,作用就是:保证序列化的类和反序列化的类是同一个类。
我们现在在没加这行代码之前,已经完成了序列化,我们再来试试反序列化
Exception in thread "main" java.io.InvalidClassException: InputStream.Student; local class incompatible: stream classdesc serialVersionUID = -484201850836634802, local class serialVersionUID = 100
at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:621)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1623)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1518)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1774)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)
at InputStream.Demo7.main(Demo7.java:19)
意思就是说,现在我们反序列化的版本和之前序列化的版本不一致了。
我们可以修改100L为484201850836634802L就可以了,或者我们重新序列化,然后再反序列化
如果我们想类中的某个属性不被序列化怎么办?
使用transient 这个关键字,
反序列化结果:age就是0啦
静态属性不能够被序列化
序列化多个对象的时候,我们可以借助ArrayList集合实现
具体就是在 序列化的时候创建ArrayList集合,然后使用add往集合里面添加数据。反序列化的时候我们使用ArrayList来接收结果