Java(五十七)对象操作流(序列化流和反序列化流)

今天来学习序列化流ObjectOutputStream,反序列化流ObjectInputStream。那什么是序列化操作?

将对象以流的形式从内存写出到本地磁盘

什么是反序列化操作?

将本地磁盘中的对象以流的形式还原成内存中的对象

       

注意:如果一个对象想要被序列化和反序列化操作的话,该对象的类一定要实现序列化接口

一:序列化流ObjectOutputStream

1:构造方法

    
public static void main(String[] args) throws Exception {
        ObjectOutputStream oss = new ObjectOutputStream(new FileOutputStream("aaa.txt"));
        System.out.println(oss);
 
    }
}

控制台输出:

java.io.ObjectOutputStream@15db9742

2:成员方法

public final void writeObject(Object obj)

public class D01 {
public class D01 {
    public static void main(String[] args) throws Exception {
        ObjectOutputStream oss = new ObjectOutputStream(new FileOutputStream("aaa.txt"));
        oss.writeObject(new person("潇寒", 18));
        System.out.println("写入成功!");
    }
}
 
/**
 * person类
 */
// 这里使用的时候需要注意一下,这个类要实现序列化父类
class person implements Serializable {
    private String name;
    private int age;
 
    public person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
 
    @Override
    public String toString() {
        return "person [name=" + name + ", age=" + age + "]";
    }
}

控制台输出:

写入成功!

这里需要注意一下,要想将对象写入文件对象需要实现序列化父类Serializable。

二:反序列化流ObjectInputStream

1:构造方法

  
  public static void main(String[] args) throws Exception {
        ObjectInputStream inp = new ObjectInputStream(new FileInputStream("aaa.txt"));
        System.out.println(inp);
    }

控制台输出:

java.io.ObjectInputStream@e9e54c2

2:成员方法

public final Object readObject()

public class D01 {
    public static void main(String[] args) throws Exception {
        ObjectInputStream inp = new ObjectInputStream(new FileInputStream("aaa.txt"));
        Object per = inp.readObject();
        System.out.println(per);
    }
}

控制台输出:

person [name=潇寒, age=18]

三:一个小问题

我们先来做一个小例子,还是用上方的代码:

public class D01 {
    public static void main(String[] args) throws Exception {
        ObjectOutputStream oss = new ObjectOutputStream(new FileOutputStream("aaa.txt"));
        oss.writeObject(new person("潇寒", 18));
        System.out.println("写入成功!");
    }
}
 
/**
 * person类
 */
// 这里使用的时候需要注意一下,这个类要实现序列化父类
class person implements Serializable {
    private String name;
    private int age;
 
    public person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
 
    @Override
    public String toString() {
        return "person [name=" + name + ", age=" + age + "]";
    }
}

执行上方的代码,我们将person类的对象就写入了aaa.txt文件。

接下来,我们修改一下person类,增加一个sex属性。然后,我们再来读取aaa.txt文件,看会发生什么情况

public class D01 {
    public static void main(String[] args) throws Exception {
        ObjectInputStream inp = new ObjectInputStream(new FileInputStream("aaa.txt"));
        Object per = inp.readObject();
        System.out.println(per);
    }
}
 
/**
 * person类
 */
// 这里使用的时候需要注意一下,这个类要实现序列化父类
class person implements Serializable {
    private String name;
    private int age;
    private int sex;
 
    public person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
 
    @Override
    public String toString() {
        return "person [name=" + name + ", age=" + age + "]";
    }
}

运行代码,控制台输出:

Exception in thread "main" java.io.InvalidClassException: D0809.person; 
local class incompatible: stream classdesc serialVersionUID = -3798699982461439593, local class serialVersionUID = 6522508725872980959

报错了,为什么会报错呢?类修改了之后,就变成了一个新类。

那么怎么解决这个问题呢?

很简单,就是制定这个类的serialVersionUID即可。代码如下:

public class D01 {
    public static void main(String[] args) throws Exception {
        ObjectOutputStream oss = new ObjectOutputStream(new FileOutputStream("aaa.txt"));
        oss.writeObject(new person("潇寒", 18));
        System.out.println("写入成功!");
 
        ObjectInputStream inp = new ObjectInputStream(new FileInputStream("aaa.txt"));
        Object per = inp.readObject();
        System.out.println(per);
    }
}
 
/**
 * person类
 */
// 这里使用的时候需要注意一下,这个类要实现序列化父类
class person implements Serializable {
    private static final long serialVersionUID = 1L;
 
    private String name;
    private int age;
    private int sex;
 
    public person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
 
    @Override
    public String toString() {
        return "person [name=" + name + ", age=" + age + "]";
    }
}

控制台输出:

写入成功!
person [name=潇寒, age=18]

至此,io流就全部学完了。知识点稍微有点多。

有好的建议,请在下方输入您的评论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值