Java对象序列化和反序列化

Java类的序列化和反序列化

序列化:指将对象转换为字节序列的过程,也就是将对象的信息转换成文件保存。

反序列化:将字节序列转换成目标对象的过程,也就是读取文件,并转换为对象。

几个关键点:

  • 必须实现Serializable接口才可以进行序列化
  • 字段属性 serialVersionUID 决定了被修改后的类(比如增加或删除了一个字段),序列化和反序列化是否成功【相当于验证版本一致性的编号】

这个字段可以自定义,也可以用IDE生成,还可以调用方法生成

自定义比如: private static final long serialVersionUID = 1L;

使用编译器生成需要设置一下:

Java对象序列化和反序列化

Java对象序列化和反序列化

Java对象序列化和反序列化

使用代码生成可以这样写:

ObjectStreamClass c = ObjectStreamClass.lookup(Student.class);
long serialID = c.getSerialVersionUID();
System.out.println(serialID);

建议自己指定一个ID,因为如果是自动生成的话,可能会存在版本不同的问题。
!!!记住这个字段的类型是static final long !!!

下面上代码:

待序列化的类 Student

package serializable;

/**
 * @author Administrator
 * @date 2022-09-26 21:47
 */
// 实现Serializable接口的学生类
import java.io.Serializable;
public class Student implements Serializable {
    private static final long serialVersionUID = -575577087488357438L;
    private int age;
    private String name;
    public Student(int age, String name) {
        this.age = age;
        this.name = name;
    }
    @Override
    public String toString() {
        return "Student{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
}

序列化和反序列化测试类 STest

package serializable;

import java.io.*;

/**
 * @author Administrator
 * @date 2022-09-26 21:48
 */
public class STest {
    public static void main(String[] args) {
        serial();
        deserial();
    }
    // 序列化方法
    private static void serial(){
        Student student = new Student(21, "John");
        try {
            // FileOutputStream流是指文件字节输出流,
            // 专用于输出原始字节流如图像数据等,其继承OutputStream类,拥有输出流的基本特性
            FileOutputStream fileOutputStream = new FileOutputStream("Student.txt");
            // 对象的序列化流,作用:把对象转成字节数据的输出到文件中保存,
            // 对象的输出过程称为序列化,可实现对象的持久存储。
            ObjectOutputStream objectOutputStream= new ObjectOutputStream(fileOutputStream);
            objectOutputStream.writeObject(student);
            objectOutputStream.flush();
        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }
    // 反序列化方法
    private static void deserial() {
        try {
            FileInputStream fis = new FileInputStream("Student.txt");
            // ObjectInputStream 反序列化流,
            // 将之前使用 ObjectOutputStream 序列化的原始数据恢复为对象,以流的方式读取对象。
            // 构造方法 ObjectInputStream(InputStream in) 创建从指定 InputStream 读取的 ObjectInputStream。
            ObjectInputStream ois = new ObjectInputStream(fis);
            Student student = (Student) ois.readObject();
            ois.close();
            System.out.println(student.toString());
        }catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

直接运行STest的main方法,可以看到生成了Student.txt字节流序列化文件,再次调用反序列化方法deserial可以看到控制台成功输出了Student对象的信息。【因为重写了toString方法,所以输出的是字段属性值】

Java对象序列化和反序列化

Java对象序列化和反序列化

Original: https://www.cnblogs.com/rainbow-1/p/16732944.html
Author: 靠谱杨
Title: Java对象序列化和反序列化

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

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

(0)

大家都在看

  • 基于接口而非实现编程

    抽象类和接口的区别 在面向对象编程当中,抽象类和接口是为抽象而生而的两个概念,在初学时特别容易搞混它们俩。 Java 既支持接口,也支持抽象类,这里主要拿 Java 的接口和抽象类…

    数据结构和算法 2023年6月8日
    0107
  • 线性DP——子序列问题浅谈

    很多人都不理解为什么可以用 f i 表示一个最长上升子序列大小? 那么我们可以看一下这个”上升”二字这才是这种类型问题的重点——上升要求的是什么? 不就是单…

    数据结构和算法 2023年6月7日
    087
  • 桶排序—明明的随机数

    桶排序 题目地址 数据范围是1到1000的随机数,每个出现的次数小于100次,且重复的数字只保留一个,所以很显然利用桶排序的知识即可轻松ac 桶排序就是开一个比给定数据范围略大的一…

    数据结构和算法 2023年6月8日
    090
  • 正奇边形可以被分割成多少个多边形

    本题需要求一个正 奇边形可以被划分成多少个区域。 一、欧拉示性数公式: V(n) + F(n) – E(n) = 2 V(n) —–> n…

    数据结构和算法 2023年6月12日
    095
  • (4)简单二叉树 插入及输出

    一、概念 二叉树(Binary tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算…

    数据结构和算法 2023年6月16日
    0119
  • Vector3.Slerp用于平滑转向

    第1种写法: Vector3.Slerp(v1, v2, percent) using UnityEngine; public class SmoothSetDirection :…

    数据结构和算法 2023年6月7日
    081
  • 相机控制, 相机跟随

    实现的功能 (1) 滚轮拉近, 推远相机(带惯性) (2) 鼠标左键左右,上下转动相机(带惯性) (3) 相机跟随角色 待实现功能 (1) 转动相机时,如果相机和跟随角色间出现了障…

    数据结构和算法 2023年6月7日
    082
  • SpringBoot多线程——排队叫号实验模拟(二)

    SpringBoot多线程——排队叫号模拟实验(二) 1. 前言 本文是前面一篇文章的续集。与之前的思路略有出入。先来做个回顾,体检中心需要模拟客户多次排队叫号的流程,现在提出如下…

    数据结构和算法 2023年6月16日
    088
  • 求最长子序列——贪心法

    维护一个数组 stk,要求这个数组里的元素在数值上是严格递增的。 遍历每一个数,如果这个数比数组里的最后一个数更大,那么就将这个数插入数组的最后;反之,替换掉数组中第一个大于等于这…

    数据结构和算法 2023年6月7日
    075
  • 并查集(UnionFind)

    并查集和其他树形结构不一样,是由孩子指向父亲,它解决了一些连接问题,怎么才能确定两个点是否相连呢?并查集可以非常快的确定两个点是否连接。 如何确定连个点是否连接呢? 我们可以用一个…

    数据结构和算法 2023年6月8日
    0101
  • [Git][基本原理与命令]

    Git是工作中最常用的版本控制工具,本文中将介绍其常用的命令。根据作用的不同,可以分为基本命令、撤销命令、合并命令与远程仓库命令,下面将依次介绍这些命令。 git 中提供了底层ap…

    数据结构和算法 2023年6月8日
    093
  • 学习随笔——洛谷题目P1636解答

    摘要:欧拉图的应用。 题目原地址如下:https://www.luogu.com.cn/problem/P1636 题目截图如下: 一笔画问题,考察欧拉回路的定义,即所有节点的入度…

    数据结构和算法 2023年6月7日
    076
  • [ubuntu18.04 python3.6] 清华源 CondaHTTPError: HTTP 000 CONNECTION

    问题 嫌官网源安装 jupyter notebook太慢,所以尝试修改为清华源,但每次在 Solving environment的时候就报错如下: 解决方法,修改conda配置信息…

    数据结构和算法 2023年6月16日
    0101
  • 变量命名 函数命名 方法 Naming cheatsheet

    Naming things is hard. This sheet attempts to make it easier. Although these suggestions c…

    数据结构和算法 2023年6月16日
    0150
  • [总结]2022/1/21

    P1心路历程 开题看到T1,又双叒叕回想起来CSP(话说最近这几天总是想起CSP不好的回忆),感觉实在是太像CSP的T4了。于是想用重载运算符和map。但问题是我忘了重载运算符!!…

    数据结构和算法 2023年6月8日
    077
  • CF1691D 题解

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    数据结构和算法 2023年6月12日
    076
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球