Java 序列化技术和反序列化技术基础篇

序列化技术和反序列化技术

一、序列化
序列化:将对象存储到文件的过程。

举个例子: 今天我编写了图书类,因为任务量比较大,需要存很多书。存进去后,如果当时程序关闭,那么我存的书也就会丢失、消失。序列化,就是把我存进的那些 书,保存成文件。即使程序关闭,在我下一次打开程序,通过反序列化可以将那么数据读取出来。 保证了数据的安全,不会被丢失。

反序列化:将文件数据变成对象的过程。

一点关于序列化技术的看法:

        自97年序列化技术出现之后,受到广大开发人员、企业的喜爱。在2018年之前,大量的程序员在使用这项技术,包括Java 官方后来推出的一些功能里面也都有它的身影,因为太方便了。

        但是尴尬的事情是,18年后,Java官方发布了一个公告,大概意思就是:

        “兄弟们呐,这个东西咱们别用了。为啥不让用呢?从97年推出这个东西之后,后来程序员在写东西的时候,也包括官方在调试bug的时候。发现,有至少1/3的bug,是因为使用了序列化和反序列化产生的。产生一系列化安全问题,包括一系列其他问题,很多的bug。我会在近几个版本,把序列化和反序列化从JDK中拿掉。”

        因为它简单、太好用了,收到广泛的使用,但是后来出现bug导致很尴尬。就好比,房子都盖好了,住了两年,结果你说别住了,砖头有问题容易塌。。。。。

---- 不过,个人看来,在没有新的可替代技术出现的话,序列化和反序列化暂时不会退出Java 的舞台。

下面是序列化的简单代码:
package 序列化;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;

/**
 * @program: IO 流
 * @description: 序列化
 * @author: 白嫖怪AE
 * @create: 2021-11-21 11:47
 **/
public class Demo1 {
    public static void main(String[] args) throws IOException {
        //序列化
        Book b1 = new Book("JavaScript百炼成仙","一本关于修仙的学习资料.");
        // E盘 1 文件夹下,建立一个 文档保持数据
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("E:\\1\\序列化后Book.txt"));
        // 写入 b1 图书
        oos.writeObject(b1);
        oos.close();
    }

    //创建一个静态 图书类
    //  必须加一个 序列化标记接口,这个类才能被序列化
    //  需要注意,Book类 下,如果有其他的 类,这个类也需要被 序列化接口标识
    static class Book implements Serializable {
        private String name;
        private String info;

        public Book() {
        }

        public Book(String name, String info) {
            this.name = name;
            this.info = info;
        }

        @Override
        public String toString() {
            return "Book{" +
                    "name='" + name + '\'' +
                    ", info='" + info + '\'' +
                    '}';
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getInfo() {
            return info;
        }

        public void setInfo(String info) {
            this.info = info;
        }
    }
}

请添加图片描述


二、反序列化
序列化:将对象存储到文件的过程。

举个例子: 今天我编写了图书类,因为任务量比较大,需要存很多书。存进去后,如果当时程序关闭,那么我存的书也就会丢失、消失。序列化,就是把我存进的那些 书,保存成文件。即使程序关闭,在我下一次打开程序,通过反序列化可以将那么数据读取出来。 保证了数据的安全,不会被丢失。

反序列化:将文件数据变成对象的过程。
// 反序列化
package 序列化和反序列化;

import java.io.*;

/**
 * @program: IO 流
 * @description: 序列化
 * @author: 白嫖怪AE
 * @create: 2021-11-21 11:47
 **/
public class Demo1 {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        //序列化
        Book b1 = new Book("JavaScript百炼成仙","一本关于修仙的学习资料.");
        // E盘 1 文件夹下,建立一个 文档保持数据
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("E:\\1\\序列化后Book.txt"));
        // 写入 b1 图书
        oos.writeObject(b1);
        oos.close();

        //反序列化
        ObjectInputStream  ois = new ObjectInputStream(new FileInputStream("E:\\1\\序列化后Book.txt"));

        // ------------
//        Object o = ois.readObject();
//        System.out.println(o);
//        System.out.println("反序列化完成");
        //
        // 或者 --------强转book类-----
        Book book =(Book) ois.readObject();
        System.out.println(book.name+":"+book.info);
        System.out.println("反序列化完成");

    }

    //创建一个静态 图书类
    //  必须加一个 序列化标记接口,这个类才能被序列化
    //  需要注意,Book类 下,如果有其他的 类,这个类也需要被 序列化接口标识
    static class Book implements Serializable {
        private String name;
        private String info;

        public Book() {
        }

        public Book(String name, String info) {
            this.name = name;
            this.info = info;
        }

        @Override
        public String toString() {
            return "Book{" +
                    "name='" + name + '\'' +
                    ", info='" + info + '\'' +
                    '}';
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getInfo() {
            return info;
        }

        public void setInfo(String info) {
            this.info = info;
        }
    }
}

请添加图片描述

强转 book类,显示内容

请添加图片描述


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值