流 ------ 对象流 即 序列化 与 反序列化

对象流:

对象流: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来接收结果