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/611551/

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

(0)

大家都在看

  • php连接mysql数据库大批量执行sql语句出现“Mysql server has gong away”错误

    php代码中加入以下代码 set_time_limit(3600); ini_set(‘memory_limit’, ‘1024M’); mysql客户端执行以下命令 set gl…

    Linux 2023年6月13日
    0108
  • vue3中iview框架初始值赋值问题

    问题:今天有个小伙伴说我们前端有个页面异常奇怪,没有显示数据。 开发小伙伴进行查询之后(非专业前端),明明进行了绑定,页面死活无法渲染,归属于灵异事件了,对于这种灵异事件,我总会想…

    Linux 2023年6月7日
    0104
  • 机器学习学习笔记之一:K最近邻算法(KNN)

    假定数据有M个特征,则这些数据相当于在M维空间内的点 [X = \begin{pmatrix} x_{11} & x_{12} & … & x_…

    Linux 2023年6月14日
    092
  • 以STM32和FPGA为核心的多组件协调工作系统

    posted @2019-06-09 22:04 xutopia 阅读(709 ) 评论() 编辑 Original: https://www.cnblogs.com/xutopi…

    Linux 2023年6月14日
    0145
  • 在Windows平台用Visual C++ 2022 (v143)编译PDCurses

    综述 PDCurses是一个开源的跨平台curses库,它提供了一组函数,开发者可以用这组函数在终端(Console、Terminal)上设置光标的位置和字符的显示样式。本文介绍在…

    Linux 2023年6月8日
    0134
  • JavaScript编程基础(一)

    目的: 熟练掌握JavaScript的语言基础,包括数据类型、常量和变量、运算符和表达式、基本语句和函数。 理解JavaScript如何动态产生HTML代码,以及控制CSS。 要求…

    Linux 2023年6月13日
    0107
  • Redis-cli连接

    原文:https://support.huaweicloud.com/usermanual-dcs/dcs-ug-0713004.html 介绍使用同一VPC内弹性云服务器ECS上…

    Linux 2023年5月28日
    0126
  • Ajax

    前戏 概念 异步提交,局部刷新 最大的优点是在页面不刷新的情况下可以与后端进行数据交互 用户注册无需点击按钮内部也可完成数据交互 同步交互:客户端发出一个请求后,需要等待服务器响应…

    Linux 2023年6月7日
    0105
  • 远程小工具PuTTY

    镜像下载、域名解析、时间同步请点击阿里云开源镜像站 PuTTY是一个Telnet、SSH、rlogin、纯TCP以及串行接口连接软件。我们连接服务器一般用ssh或者telnet,这…

    Linux 2023年5月27日
    0121
  • Linux备份之远程同步—rsync

    一、备份 1.1 什么是备份? 备份就是把重要的数据或者文件复制一份保存到另一个地方,实现不同主机之间的数据同步 1.2 为什么做备份? 数据在公司中是很重要的!!!备份就是为了恢…

    Linux 2023年5月27日
    0122
  • Linux Ubuntu 添加新用户

    1. 了解配置文件 Linux下与用户信息相关的配置文件有 /etc/passwd、 /etc/group、 /etc/shadow等,其权限分别如下: /etc/passwd:保…

    Linux 2023年5月27日
    0155
  • ip、ifconfig 和 route命令介绍与网络配置

    linux的ip命令和ifconfig类似,但前者功能更强大,并旨在取代后者。使用ip命令,只需一个命令,你就能很轻松地执行一些网络管理任务。ifconfig是net-tools中…

    Linux 2023年6月6日
    0107
  • 白话TCP/IP原理

    TCP/IP(Transmission-Control-Protocol/Internet-Protocol),中文译名为传输控制协议/因特网互联协议,又名网络通讯协议,是Inte…

    Linux 2023年5月27日
    0112
  • Linux之Nginx模块扩展

    404. 抱歉,您访问的资源不存在。 可能是URL不正确,或者对应的内容已经被删除,或者处于隐私状态。 [En] It may be that the URL is incorre…

    Linux 2023年5月27日
    089
  • Gumbel_Softmax 概要

    解决argmax不可导,无法进行反向传播的问题 出现的原因: argmax(x,y)不可导的根本原因是其向量空间不是光滑的,有尖锐的点和面;而是某些任务中,argmax会被插入到反…

    Linux 2023年6月7日
    0129
  • 出现 Expected 0 arguments but found 1 的bug原因

    问题:在给FileInputStream传入参数时报错 原以为是导错了包,结果试了几次都不行,最后才发现是项目名和这个方法名重复了,修改项目名就可以了! 红线处只是异常,抛出即可解…

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