Java IO流-序列化流和反序列化流
发布日期:2022-04-02 18:15:46 浏览次数:12 分类:博客文章

本文共 2339 字,大约阅读时间需要 7 分钟。

2017-11-05 20:42:06

序列化流:把对象按照流的方式存入文本文件或者在网络中传输。 对象 -- 流数据(ObjectOutputStream

反序列化流:把文本文件中的流对象数据或者网络中的流对象数据还原成对象。 流数据 -- 对象(ObjectInputStream)

  • ObjectOutputStream

ObjectOutputStreamObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream。可以使用 ObjectInputStream(反序列化) 读取(重构)对象。通过在流中使用文件可以实现对象的持久存储。如果流是网络套接字流,则可以在另一台主机上或另一个进程中重构对象。

注意:要被序列化的类需要实现Serializable接口,否则就不能进行序列化,但是这个类是个标记接口,就是没有需要重写的方法。

*构造方法

*常用方法

 

  • ObjectInputStream

ObjectInputStreamObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化。

ObjectOutputStream 和 ObjectInputStream 分别与 FileOutputStream 和 FileInputStream 一起使用时,可以为应用程序提供对对象图形的持久存储。ObjectInputStream 用于恢复那些以前序列化的对象。其他用途包括使用套接字流在主机之间传递对象,或者用于编组和解组远程通信系统中的实参和形参。

*构造方法

*常用方法

import java.io.*;public class Demo5 {    public static void main(String[] args) throws IOException, ClassNotFoundException {        //write();        read();    }    public static void write()throws IOException{        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("E:/test.txt"));        // 类需要有序列化接口才能被序列化        Student st = new Student("张三",20);        // 序列化        oos.writeObject(st);        oos.close();    }    public static void read() throws IOException, ClassNotFoundException {        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("E:/test.txt"));        //反序列化        Object obj = ois.readObject();        ois.close();        //输出对象        System.out.println(obj);    }}import java.io.Serializable;public class Student implements Serializable{    private String name;    private Integer age;    Student(String name,int age)    {        this.name=name;        this.age=age;    }}

问题一、如果在读取之前修改了Student类那么在read()函数的执行过程中会产生一个错误:

Exception in thread "main" java.io.InvalidClassException:DemoFile.Student; local class incompatible:stream classdesc serialVersionUID = -8639914051049964771, local class serialVersionUID = -7579084536321238113

原因是:由于Student类实现了序列化接口,所以会生成一个序列化的标记值,但是如果你修改了Student类,那么这个序列化值就会发生变化。在读取的时候会发现序列化值不匹配的问题,就会报错。

解决方法就是是这个序列号变成常量,这样的化,我们在修改类后,它的数据读取就不会产生上述的问题。

public class Student implements Serializable{    private static final long serialVersionUID = -7579084536321238113L;    private String name;    private int age;    // int age;    Student(String name,int age)    {        this.name=name;        this.age=age;    }}

问题二:类中的成员变量不被序列化的方法 : 加上 transient 关键字。

 

转载地址:https://www.cnblogs.com/hyserendipity/p/7788915.html 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Java IO流-合并流
下一篇:Java IO流-Properties

发表评论

最新留言

关注你微信了!
[***.104.42.241]2024年07月19日 05时34分45秒