我对java序列化的理解

我对java序列化的理解

​ 通过ObjectOutputStream输出流保存实体类所 产生的文件,每一个流都一个序列化ID,如果我们不设置UID的话,一旦我们修改代码,这个文件就会出现InvalidClassException异常,所以需要设置一个私有静态最终类的UID,这样才能保证我们的流不能被找到。

演示代码

第一步/编写Student实体类代码

/**
 * @author Mxhlin
 * @Email fuhua277@163.com
 * @Date 2022/09/24/8:17
 * @Version
 * @Description 狐狸实体类 有一个名字 年龄的属性,toString/Get/Set/有/无参构造方法
 */
public class Fox {
    private String name;
    private int age;

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

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Fox(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Fox() {
    }
}

第二步/编写序列化代码

package com.Mxhlin.io;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

/**
 * @author Mxhlin
 * @Email fuhua277@163.com
 * @Date 2022/09/24/8:21
 * @Version
 * @Description 序列化Fox
 */
public class FoxSeria {
    static String db = "db.dat";

    static {// 初始化一个空元素
        if (!new File(db).exists()) {
            try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("db"))) {
                List list = new ArrayList<>();
                oos.writeObject(list);
            } catch (FileNotFoundException e) {
                throw new RuntimeException(e);
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }

    public static void main(String[] args) {
        // 第一次查询
        System.out.println(rand());
    }

    /**
     * @Description: 读取db.dat
     * @Param: []
     * @return: java.util.List
     * @Author: Mxhlin
     * @Date: 2022/9/24
     */
    public static List rand() {
        List list = new ArrayList<>();
        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(db))) {
            list = (List) ois.readObject();
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
        return list;
    }

    /**
     * @Description: 输出文件
     * @Param: [fox]
     * @return: int
     * @Author: Mxhlin
     * @Date: 2022/9/24
     */
    public static int write(Fox fox) {
        List list = new ArrayList<>();
        list.add(fox);
        int i = 0;
        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(db))) {
            oos.writeObject(list);
            i = 1;
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return i;
    }
}

我对java序列化的理解
  • 第一次运行
  • 会一个找不到文件的异常
  • 但是也会因为静态块判断是否有文件二初始化创建一个文件

我对java序列化的理解
  • 执行序列化方法
  • 会报错Fox不能被序列化
  • 也会生成一个文件

我对java序列化的理解
  • 这里给Fox实现序列化接口
  • 再次执行wirte()方法

我对java序列化的理解
  • 返回1,代表序列化成功

我对java序列化的理解

这样就成功了

  • 那如果我把Fox的toString 去掉呢?

我对java序列化的理解
  • 对实体类进行修改
  • 再次读取

我对java序列化的理解

我对java序列化的理解
  • 会报错实现我们这两个Uid不相容
  • 每个ObjectOutputStream输出流都是有SerializableUID的
  • 所以我们要给实体类设置UID

我对java序列化的理解
  • 给他设置UID之后再次读取

我对java序列化的理解
  • 修改实体类Fox再次运行

我对java序列化的理解

我对java序列化的理解
  • IDEA有一个小功能,可以自动生成UID

我对java序列化的理解
  • 把这个勾选上后
  • 我们的实体类再次实现Serializable接口,就会提示

我对java序列化的理解
  • 点击就会生成UID

我对java序列化的理解
  • 序列化的好处就在于我们可以把数据保存在db.dat里面,不会关闭程序就重置,只要db.dat存在我们就可以保存上次我们所设置的实体类

Original: https://www.cnblogs.com/xhlin/p/16724924.html
Author: 舍橘而取橙也
Title: 我对java序列化的理解

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/584988/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • PHP生成图形验证码

    在建站过程中,很多时候都会需要用户验证验证码等操作,比如:注册、登录、发表评论、获取资源等等,一方面可以验证当前用户的行为是否是爬虫、机器人等情况,给网站数据统计产生影响;另一方面…

    Java 2023年6月10日
    079
  • JPA自定义实体的id

    背景:继上一篇文章,已经实现客户端数据库数据,存入服务器,但是,两张表的id不一样,应该是id设置自增了,所以虽然从客户端查出的实体带id,但是存入服务器时id被抹掉,按照服务端表…

    Java 2023年6月8日
    085
  • Java编程思想重点笔记(Java开发必看)

    Java编程思想,Java学习必读经典,不管是初学者还是大牛都值得一读,这里总结书中的重点知识,这些知识不仅经常出现在各大知名公司的笔试面试过程中,而且在大型项目开发中也是常用的知…

    Java 2023年5月29日
    063
  • 消息队列rabbitmq

    为什么用消息队列 举例 &#x6BD4;&#x5982;&#x5728;&#x4E00;&#x4E2A;&#x4F01;&#…

    Java 2023年5月30日
    083
  • Mybaitis入门基础(一)MyBatis的概念引入及工作原理

    一:框架前言的那些事 良将难求 胜铁骑三千 益友知遇 领人间无数,三国鼎立中魏、蜀,吴三国的三位皇帝曹操、刘备、刘权他们都有很多谋士(出谋划策的人)。这些谋士其实就是他们出攻城略地…

    Java 2023年6月14日
    078
  • 朱晔和你聊Spring系列S1E5:Spring WebFlux小探

    阅读PDF版本 本文会来做一些应用对比Spring MVC和Spring WebFlux,观察线程模型的区别,然后做一下简单的压力测试。 创建一个传统的Spring MVC应用 先…

    Java 2023年5月30日
    095
  • JAVA 多线程基础

    引言 现代操作系统(Windows,macOS,Linux)都可以执行多任务,多任务就是同时运行多个任务。CPU执行代码都是一条一条顺序执行的,但是,即使是单核cpu,也可以同时运…

    Java 2023年5月29日
    077
  • 如何入门一个开源软件

    查看 conf下的默认配置,根据个人的需求尝试自定义配置 Original: https://www.cnblogs.com/kwanwoo/p/14702843.htmlAuth…

    Java 2023年6月8日
    071
  • Spring Security实现统一登录与权限控制

    1 项目介绍 最开始是一个单体应用,所有功能模块都写在一个项目里,后来觉得项目越来越大,于是决定把一些功能拆分出去,形成一个一个独立的微服务,于是就有个问题了,登录、退出、权限控制…

    Java 2023年6月7日
    084
  • 软件测试 对前一日函数的基本路径测试

    基本路径测试 实验要求: 请采用基本路径方法对前一日函数进行测试用例设计。 根据互换所得代码,画出流程图,流图,计算圈复杂度,给出独立路径,设计测试用例,执行测试。 比较预期结果和…

    Java 2023年6月5日
    070
  • Vue学习之——–深入理解Vuex之getters、mapState、mapGetters(2022/9/3)

    这一篇博客的内容是在上一篇博客的基础上进行:深入理解Vuex、原理详解、实战应用 @ 1、getters的使用 1.1 概念 1.2 用法 1.3 如何读取数据 2、getters…

    Java 2023年6月14日
    085
  • Gbase 8t安全技术

    概论: &#x6570;&#x636E;&#x5E93;&#x7CFB;&#x7EDF;&#x5B89;&#x5168;&a…

    Java 2023年6月9日
    088
  • 单个文件上传和批量文件上传,pdf,docx文件的下载

    一、 &#x5355;&#x4E2A;&#x6587;&#x4EF6;&#x4E0A;&#x4F20; 前端代码可参考element…

    Java 2023年6月16日
    089
  • 从服务器上拷贝代码到虚拟机上编译不过

    去掉application/tools/tcon_bin_generator/panel_bootbin_gen.c文件中 if (GNUC >= 4) &&…

    Java 2023年5月30日
    057
  • 日常白痴_Date的比较及增减操作

    一直以来,获取日期都是用new Date(),再不然,顶多用个SimpleDateFormat规范一下格式忽然遇到需求,需要对日期增加和比较大小的时候,就又懵住了,唉,每天都为自己…

    Java 2023年6月7日
    075
  • redis集群详解

    所谓的集群,就是通过增加服务器的数量,提供相同的服务,从而让服务器达到一个稳定、高效的状态。 单个redis存在不稳定性。当redis服务宕机了,就没有可用的服务了。而且单个red…

    Java 2023年6月7日
    089
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球