Java零基础进阶篇之IO流-对象流

本篇文章讲解的知识点主要围绕IO流-对象流,废话不多说,只分享Java相关的干货!

对象流

对象流可以将Java 对象转换成二进制写入磁盘,这个过程通常叫做序列化,并且还可以从磁盘读出完整的Java 对象,而这个过程叫做反序列化

对象流主要包括:ObjectInputStream 和ObjectOutputStream

​​​​​​​如何实现序列化和反序列化

如果实现序列化该类必须实现序列化接口java.io.Serializable,该接口没有任何方法,该接口只是一种标记接口,标记这个类是可以序列化的

  • 序列化

Java零基础进阶篇之IO流-对象流_第1张图片

Java零基础进阶篇之IO流-对象流_第2张图片

不能序列化,对序列化的类是有要求的,这个序列化的类必须实现一个接口 Serializable,这个接口没有任何方法声明,它是一个标识接口,如:java 中的克隆接口 Cloneable,也是起到了一种标识性的作用

  • 序列化

Java零基础进阶篇之IO流-对象流_第3张图片

以上可以完成序列化

  • 反序列化

Java零基础进阶篇之IO流-对象流_第4张图片

Java零基础进阶篇之IO流-对象流_第5张图片

关于 transient 关键字

Java零基础进阶篇之IO流-对象流_第6张图片

Java零基础进阶篇之IO流-对象流_第7张图片

Java零基础进阶篇之IO流-对象流_第8张图片

​​​​​​​关于 serialVersionUID 属性

 

【示例代码】,在person 中加入一个成员属性sex,然后在读取person.dat 文件

Java零基础进阶篇之IO流-对象流_第9张图片

Java零基础进阶篇之IO流-对象流_第10张图片

Java零基础进阶篇之IO流-对象流_第11张图片

Java零基础进阶篇之IO流-对象流_第12张图片

错误的原因: 在序列化存储 Person   时, 他会为该类生成一个 serialVersionUID=-6120276268074674235,而我们在该类中加入了一个sex属性后,那么在使用的时候他就会为该类生成一 个 新 的 serialVersionUID=1923863382018150382  , 这个两个UID

(-6120276268074674235 和 1923863382018150382)不同,所以Java 认为是不兼容的两个类。如果解决呢?

通常在实现序列化的类中增加如下定义:

static final long serialVersionUID = -111111111111111111L;

如果在序列化类中定义了成员域serialVersionUID,系统会把当前serialVersionUID 成员域的值作为类的序列号(类的版本号),这样不管你的类如何升级,那么他的序列号(版本号)都是一样的,就不会产生类的兼容问题。

 

【代码示例】,解决序列化版本冲突的问题

Java零基础进阶篇之IO流-对象流_第13张图片

Java零基础进阶篇之IO流-对象流_第14张图片

Java零基础进阶篇之IO流-对象流_第15张图片

以上不再出现序列化的版本问题,因为他们有统一的版本号:-111111111111111111L

进一步理解一下serialVersionUID

Java零基础进阶篇之IO流-对象流_第16张图片

【代码示例】,将 Person 的版本号修改为-111111111111111222L, 该客户端与服务器通信会出现序列化版本兼容问题

Java零基础进阶篇之IO流-对象流_第17张图片

Java零基础进阶篇之IO流-对象流_第18张图片

Java零基础进阶篇之IO流-对象流_第19张图片

Java零基础进阶篇之IO流-对象流_第20张图片

serialVersionUID 就和序列化有关

以上就是IO流-对象流相关的知识点,配套视频教程,正在学习Java的同学们一定要持续关注哦~~

Java零基础进阶视频教程

 

你可能感兴趣的