Java – IO流 – 序列化流

简介

序列化与反序列化,是指,把程序中的【对象】,【类型】等程序化的数据,转为文件数据的形式,并保存到硬盘中。反序列化时,可以通过读取文件,还原回【对象】或【类型】数据,供程序直接调用。

 

序列化

序列化,是指把【对象】等一些程序上的数据,转为文件数据并保存,需要序列化的类必须实现 Serializable 接口,接口没有抽象方法,所以只需要实现接口就可以了,Java这一做法只是作为一个标记。

 

创建序列化

// 当写出对象时,会被把对象数据写出到指定文件位置
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("path")));

 

序列化对象

需要序列化的类必须实现 Serializable 接口,否则会报异常。接口没有抽象方法,所以只需要实现接口就可以了,Java这一做法只是作为一个标记。

// 创建一个对象
Student s = new Student("张三", 23);
// 写出一个对象序列化
oos.writeObject(s);

// 关闭流
oos.close();

 

反序列化

反序列化是指把已保存在硬盘当中的对象文件,读取并还原回对象实例。

创建反序列化

// 读取一个带有反序列化的文件
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("path")));

 

反序列化为对象

// 对文件进行反序列化,并转回对象
ois.readObject();

// 关闭流
oos.close();

 

注意:Java允许在一个文件中序列化多个对象,每调用一次 readObject() 方法,将读取并反序列化下一个对象,指针会指向下一个对象,但是如果没有下一个对象可序列化时,Java会报 EOFException 异常.因此,建议使用序列化时,都应该把多个对象包装成ArrayList,再对ArrayList进行序列化,并且一个文件只存储一个序列化对象。

 

SerialVersionUID

对于可以序列化的类(实现了Serializable 接口的类),当经过修改后,再重新反序列化时,会可能报出 InvalidClassException 异常。

这是因为,Java 会对序列化类中的成员进行计算,得出一个【版本号】SerialVersionUID,当类中的成员或方法被修改后,Java会重新计算SerialVersionUID【版本号】,如果序列化文件中的版本号和JavaBean类中的版本号不一至,则会报异常。

 

解决方法是,在类中,设定一个常量 SerialVersionUID,类型为 long

private static final long SerialVersionUID = 123456777L;

 

也可以在IDEA中,设定自动创建 SerialVersionUID

 

 

transient 关键字

在序列化中,如果某些对象成员,我不想参与到序列化中时,可以在成员声明时,增加transient关键字,那么这个成员变量将不参与序列化过程。

private transient String address;

 

释放序列化流

涉及文件输出的流操作,都应该关闭流文件操作

close();

 

如果您喜欢本站,点击这儿不花一分钱捐赠本站

这些信息可能会帮助到你: 下载帮助 | 报毒说明 | 进站必看

修改版本安卓软件,加群提示为修改者自留,非本站信息,注意鉴别

THE END
分享
二维码
打赏
海报
Java – IO流 – 序列化流
简介 序列化与反序列化,是指,把程序中的【对象】,【类型】等程序化的数据,转为文件数据的形式,并保存到硬盘中。反序列化时,可以通过读取文件,还原回【对象】或【类型】数据,供程序直……
<<上一篇
下一篇>>