Java对象序列化和反序列化
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对象序列化和反序列化的更多相关文章
- java 对象序列化与反序列化
Java序列化与反序列化是什么? 为什么需要序列化与反序列化? 如何实现Java序列化与反序列化? 本文围绕这些问题进行了探讨. 1.Java序列化与反序列化 Java序列化是指把Java对象转换为 ...
- Java对象序列化与反序列化一 JSON
Java对象序列化与反序列化一 JSON 1. 依赖库 jackson-all-1.6.1.jar 2. 代码 public class Student { private String nam ...
- Java对象序列化和反序列化的工具方法
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import ja ...
- Java 对象序列化和反序列化
之前的文章中我们介绍过有关字节流字符流的使用,当时我们对于将一个对象输出到流中的操作,使用DataOutputStream流将该对象中的每个属性值逐个输出到流中,读出时相反.在我们看来这种行 ...
- Java对象序列化与反序列化
对象序列化的目标是将对象保存在磁盘中或者在网络中进行传输.实现的机制是允许将对象转为与平台无关的二进制流. java中对象的序列化机制是将允许对象转为字节序列.这些字节序列可以使Java对象脱离程序存 ...
- java对象序列化、反序列化
平时我们在Java内存中的对象,是无法进行IO操作或者网络通信的,因为在进行IO操作或者网络通信的时候,人家根本不知道内存中的对象是个什么东西,因此必须将对象以某种方式表示出来,即存储对象中的状态.一 ...
- java对象序列化和反序列化,redis存入和获取对象
最近使用redis发现直接存储序列化后的对象更方便,现提供java序列化和反序列化的代码 1.序列化代码: public static byte[] serialize(Object object) ...
- Java 对象序列化和反序列化 (实现 Serializable 接口)
序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化. 把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存放 ...
- JAVA对象序列化和反序列化学习
JAVA序列化就是将JAVA对象转化为字节序列的过程,而JAVA反序列化就是将字节序列转化为JAVA对象的过程. 这一过程是通过JAVA虚拟机独立完成,所以一个对象序列化后可以在任意时间和任意机器上反 ...
- Java基础—序列化与反序列化(转载)
转载自: Java序列化与反序列化 1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列的过程:而Java反序列化是指把字节序列恢复为Java对象的过程. 2.为什么需要序列化 ...
随机推荐
- letcode-Z字抖动
题目 将一个给定字符串 s 根据给定的行数 numRows ,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下 ...
- Android里使用AspectJ实现AOP
前言 Aspectj提供一种在字符串里编程的模式,即在字符串里写函数,然后程序启动的时候会动态的把字符串里的函数给执行了. 例如: "execution(* *(..))" 这里 ...
- virtualapp启动流程源码分析
virtualapp启动流程分析 1. 首先是启动本身,执行Vpp 的attachBaseContext @Override protected void attachBaseContext(Cont ...
- pikachu sql inject 宽字节注入
宽字节注入原理 什么是宽字节? 如果一个字符的大小是一个字节的,称为窄字节: 如果一个字符的大小是两个字节的,成为宽字节: 像GB2312.GBK.GB18030.BIG5.Shift_JIS等这些编 ...
- 教你如何判断Java代码中异步操作是否完成
本文分享自华为云社区<java代码实现异步返回结果如何判断异步执行完成>,作者: 皮牙子抓饭. 在许多应用程序中,我们经常使用异步操作来提高性能和响应度.在Java中,我们可以使用多线程或 ...
- Java 使用 itext 向PDF插入数据和图片
Java 使用 itext 向PDF插入数据和图片 一.下载Adobe Acrobat DC 二.制作模板 1.准备一个word模板,并转换成PDF格式 2.使用Adobe Acrobat DC打开P ...
- KPTP 汇报模板
1.什么是KPTP 它是由4个单词:Keep.Problem.Try.Plan的首字母组成的. K:keep,今天做了哪些工作: P:problem,遇到了哪些问题: T:try,计划尝试如何解决这些 ...
- 优雅使用前端枚举Enum,符合国标的那种!
01.什么是枚举Enum? 枚举Enum是在多种语言中都有的一种数据类型,用于表示一组特定相关的常量数据集合,如性别(男.女).数据状态(可用.禁用).垂直对齐(顶端.居中.底部).星期等.特点是数据 ...
- 【LeetCode回溯算法#12】二叉树的直径,树形dp的前置内容(使用dfs)
二叉树的直径 给你一棵二叉树的根节点,返回该树的 直径 . 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 .这条路径可能经过也可能不经过根节点 root . 两节点之间路径的 长度 由它们 ...
- redis-cluster 性能调优
关闭RDB防止fork进程的内存溢出问题 save "" appendonly=yes 防止某个节点挂掉,整个cluster挂掉的问题 cluster-require-full-c ...