Java中对象操作流的序列化和反序列化-IO

一:引言

目录

一:引言

二:对象操作流

2.1对象操作流的特点:

2.2对象操作流分类:

2.3对象序列化

问题:

 解决方案:

 Serializable接口的意义:

2.4反序列化

 2.5对象操作流的两个注意点(还未完成!)


开始正文前我们需要来思考一个问题,怎么将下列的一个信息保存到本地文件中去

    public static void main(String[] args) throws IOException {
        User u = new User("涛涛","beautiful");
        BufferedWriter bw = new BufferedWriter(new FileWriter("day11//b.txt"));
        bw.write(u.getUsername());
        bw.newLine();
        bw.write(u.getPassword());
        bw.close();

    }

通过上面的代码我们可以将信息写入到本地文件上,现在我们只想要保管用户信息,现在只要谁能找到我这个b.txt文件就能查看我保存的用户信息,这样的话数据是非常的安全。所以我们引出了对象操作流。

二:对象操作流

2.1对象操作流的特点:

可以把对象以字节的形式写到本地文件,直接打开这个文件,是读不懂的,需要再次用对象操作流读到内存中。

2.2对象操作流分类:

  1. 对象操作输出流(对象序列化流):就是将对象写到本地文件中,或者在网络中传输。
  2. 对象操作输入流(对象反序列化流):把本地文件中的对象读到内存中,或者接收网络中传输的对象。

下面我们正式开始讲解对象操作流。

我们需要创建一个JavaBean对象

2.3对象序列化



public class User {
    private String username;
    private String password;

    public User() {
    }

    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}
    public static void main(String[] args) throws IOException {
        User user = new User("taotao","dahuaibi");
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("day11\\b.txt"));
        oos.writeObject(user);
        oos.close();
    }

问题:

大家觉得运行上面一段代码会不会出错呢?

在这里我告诉大家这是会报出一个NotSerializableException异常的。如下图

 通过查阅API我们知道,是因为我们这个对象没有被序列化

 解决方案:

       如果想要User类的对象能够被序列化,那么这个类必须要实现一个接口,即Serializable接口

 再来运行代码,是不会报错了,并且成功写入了b.txt中。如下图

 我们实现了这个Serializable接口是不是要重写里面的方法呢?这样我带大家看一下源码就知道是不要重写的,是因为Serializable接口里没有抽象方法。

 Serializable接口的意义:

Serializable是一个标记性的接口,里面没有任何的抽象方法。

只要一个类实现了这个Serializable接口,那么就表示这个类的对象可以被序列化。

2.4反序列化

代码实现:

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("day11\\b.txt"));
        User o = (User) ois.readObject();
        System.out.println(o);
        ois.close();
    }

将上文中的对象反序列化,打印出来,如下图。

 2.5对象操作流的两个注意点(还未完成!)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玉锵T

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值