Java类的序列化和反序列化

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

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

几个关键点:

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

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

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

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

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

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对象序列化和反序列化的更多相关文章

  1. java 对象序列化与反序列化

    Java序列化与反序列化是什么? 为什么需要序列化与反序列化? 如何实现Java序列化与反序列化? 本文围绕这些问题进行了探讨. 1.Java序列化与反序列化  Java序列化是指把Java对象转换为 ...

  2. Java对象序列化与反序列化一 JSON

    Java对象序列化与反序列化一 JSON 1. 依赖库 jackson-all-1.6.1.jar 2. 代码 public class Student {    private String nam ...

  3. Java对象序列化和反序列化的工具方法

    import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import ja ...

  4. Java 对象序列化和反序列化

         之前的文章中我们介绍过有关字节流字符流的使用,当时我们对于将一个对象输出到流中的操作,使用DataOutputStream流将该对象中的每个属性值逐个输出到流中,读出时相反.在我们看来这种行 ...

  5. Java对象序列化与反序列化

    对象序列化的目标是将对象保存在磁盘中或者在网络中进行传输.实现的机制是允许将对象转为与平台无关的二进制流. java中对象的序列化机制是将允许对象转为字节序列.这些字节序列可以使Java对象脱离程序存 ...

  6. java对象序列化、反序列化

    平时我们在Java内存中的对象,是无法进行IO操作或者网络通信的,因为在进行IO操作或者网络通信的时候,人家根本不知道内存中的对象是个什么东西,因此必须将对象以某种方式表示出来,即存储对象中的状态.一 ...

  7. java对象序列化和反序列化,redis存入和获取对象

    最近使用redis发现直接存储序列化后的对象更方便,现提供java序列化和反序列化的代码 1.序列化代码: public static byte[] serialize(Object object) ...

  8. Java 对象序列化和反序列化 (实现 Serializable 接口)

    序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化.  把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存放 ...

  9. JAVA对象序列化和反序列化学习

    JAVA序列化就是将JAVA对象转化为字节序列的过程,而JAVA反序列化就是将字节序列转化为JAVA对象的过程. 这一过程是通过JAVA虚拟机独立完成,所以一个对象序列化后可以在任意时间和任意机器上反 ...

  10. Java基础—序列化与反序列化(转载)

    转载自: Java序列化与反序列化 1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列的过程:而Java反序列化是指把字节序列恢复为Java对象的过程. 2.为什么需要序列化 ...

随机推荐

  1. spring boot2.0集成mybatis-plus实战

    说明: 本例演示spring boot2.0如何集成mybatis-plus 如何使用代码生成器 项目源码: https://gitee.com/indexman/mybatis-plus-demo ...

  2. 美团面试:Kafka如何处理百万级消息队列?

    美团面试:Kafka如何处理百万级消息队列? 在今天的大数据时代,处理海量数据已成为各行各业的标配.特别是在消息队列领域,Apache Kafka 作为一个分布式流处理平台,因其高吞吐量.可扩展性.容 ...

  3. 《系列二》-- 5、单例bean缓存的获取

    目录 1 判断bean是否完成整个加载流程 2 判断当前bean是否被加载过,是否已作为提前暴露的bean 关于循环依赖 阅读之前要注意的东西:本文就是主打流水账式的源码阅读,主导的是一个参考,主要内 ...

  4. std::shared_ptr 和 std::vector 的结合使用

    #include <iostream> #include <string> #include <vector> std::shared_ptr<std::ve ...

  5. win32 - 控制台聊天

    仅适用于同一台电脑的两个进程聊天,对于不同电脑之前的聊天需要依靠tcp/ip协议. 两个进程是通过发送WM_COPYDATA 消息来传输字节的. 代码如下: Server.cpp #include & ...

  6. Redis搭建Sentinel实验环境

    环境准备 在物理机上启动3台虚拟机,IP地址分别为:192.168.56.4,192.168.56.5,192.168.56.6. 1.确保3台虚拟机的网络是相互联通的. 2.确保已经在3台虚拟机上安 ...

  7. django之manage.py migrate无效的问题

    问题 已有的model,迁移之后,想重新设置字段,于是将migrations文件夹中除__init__.py之外其他文件都删掉,并且把数据库中的表删除,再次执行以下步骤python manage.py ...

  8. 你不得不知道的 MySQL 优化原理

    目录 MySQL逻辑架构 MySQL查询过程 客户端/服务端通信协议 查询缓存 查询优化 查询执行引擎 返回结果给客户端 总结 性能优化建议 Scheme设计与数据类型优化 创建高性能索引 索引相关的 ...

  9. linux系统信息命令笔记

    1,时间和日期 2,磁盘信息 4,进程概念介绍 4.1,ps 基本命令使用 ps aux 显示内容太多了.一般用ps a 或 ps au 4.2, top命令的基本使用 top 可以动态的显示运行中的 ...

  10. Java 属性赋值的先后顺序

    1 package com.bytezero.circle; 2 /** 3 * 4 * @Description 5 * @author Bytezero·zhenglei! Email:42049 ...