IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Java序列化与反序列化(实战应用与小坑) -> 正文阅读

[Java知识库]Java序列化与反序列化(实战应用与小坑)

前言:杜绝八股取士,活学活用从我做起,本文将会从简单的维度入手,分析序列化到底是什么?为什么要用?怎么用?有什么坑?希望能帮助到更多学习道路上的同学

1:是什么?

简单来说,序列化就是把内存中的对象通过一定的规则转换成字节序列,然后保存到磁盘,反序列化就是从磁盘中读取对应的字节序列出来恢复成原来那个对象,也可以说是根据字节序列“创建”出原来那个对象,我们都记得创建对象的几种方式:new,clone,reflect,序列化与反序列化。

2:为什么要用?

首先很明显就是保存某个对象在某一时期的某种状态,又或者为了保存某个对象的信息,你把它序列化后,可以保存在mysql数据库,也可以通过Socket进行传输,也可以保存到txt文件中,反正随便放,到时候读取出来再反序列化就可以,好处就是节约内存,如果有大量的对象,不能丢弃回收内存,但是内存空间又不足,这个时候可以考虑把一部分序列化保存到磁盘上,要用的时候再通过反序列化找回来。

3:怎么用?

(1)定义一个Student类
public class Student implements Serializable {
    private static final long serialVersionUID = -5809782578272943999L;

    String name;
    int 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;
    }
}

(2)创建序列化的main方法
public static void main(String[] args) throws IOException {
    /*创建student对象,设置姓名和年龄*/
    Student student = new Student();
    student.setAge(19);
    student.setName("jojo");

	/*通过writeObject序列化*/
    ObjectOutputStream outputStream = new ObjectOutputStream(
            new FileOutputStream(new File("D:\\Git\\demo\\src\\main\\java\\com\\jojo\\service\\Student.txt")));
    outputStream.writeObject(student);
    System.out.println("对象序列化成功!");
    outputStream.close();
}

(3)执行结果

在这里插入图片描述

(4)查看序列化文件(也就是保存在磁盘上的对象长什么样)

在这里插入图片描述

(5)在另外一个main方法中通过读取该文件反序列化拿到当时的对象状态
public static void main(String[] args) throws Exception {
    ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(
                             new File("D:\\Git\\demo\\src\\main\\java\\com\\jojo\\service\\Student.txt")));
             Student student = (Student) inputStream.readObject();
             System.out.println("age:"+student.getAge());
}

在这里插入图片描述
成功~!

4:有什么坑?

(1) 静态变量不能被序列化?

假设年龄我设置为static的,并且初始值为18;序列化之前我把该静态变量改成19,那么反序列化后,我拿到的是18还是19?
在这里插入图片描述
在这里插入图片描述
输出结果:
在这里插入图片描述
为什么呢?因为序列化是保存对象当时的状态,而静态变量属于类,所以它的改变不能被序列化保存。

(2) 静态类创建出来的对象能否序列化?

答案是可以;而且反序列后取值也正常。

在这里插入图片描述
在这里插入图片描述
为什么呢?因为还是那句话,序列化是针对对象的,关类什么事?类是一种模板,一种定义,它是不是静态跟我创建出来的对象没有半毛钱关系

(3) 静态对象能否被序列化和反序列化?

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
答案还是可以,为什么呢?因为,序列化的是对象,对象里面的属性只要不是静态的,就都属于该对象!是对象的东西,肯定反序列化就能拿出来啊~我又不关心该对象是否static

(4) 序列化id的作用?

SerialVersionUID它是序列化版本号,是维护序列化和反序列化的对象的版本一致的。
没加SerialVersionUID:
A1对象序列化保存为A1.txt,然后A类被修改了某些属性,再通过A1.txt反序列化回来的时候就会反序列化失败。

Exception in thread "main" java.io.InvalidClassException: com.jojo.service.JoJoTest$Student; local class incompatible: stream classdesc serialVersionUID = -5809782578272943999, local class serialVersionUID = 5647668197525336519
	at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:616)
	at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1843)
	at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1713)
	at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2000)
	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1535)
	at java.io.ObjectInputStream.readObject(ObjectInputStream.java:422)
	at com.jojo.service.JoJoTest.main(JoJoTest.java:9)

在这里插入图片描述

如果加了序列号id,不管你对它属性做了什么修改,反序列化都会成功~!

目前先记录到这里,后续会持续补充~~~欢迎有其它新发现的小伙伴留言沟通交流~

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-07-10 14:24:43  更:2021-07-10 14:25:58 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/17 20:33:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码