Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java对象的序列化和反序列化

Java对象的序列化和反序列化

作者头像
阿珍
发布于 2023-04-18 09:44:39
发布于 2023-04-18 09:44:39
1.4K00
代码可运行
举报
运行总次数:0
代码可运行

Java 对象的序列化和反序列化是一种将对象转换成字节流并存储在硬盘或网络中,以及从字节流中重新加载对象的操作。Java 的序列化和反序列化提供了一种方便的方式,使得可以将对象在不同的应用程序之间进行交互。

一、什么是 Java 序列化和反序列化?

Java 对象的序列化是将 Java 对象转换成字节流的过程,可用于持久化数据,传输数据等。序列化是将 Java 对象的状态表示为字节序列的过程,可以通过网络传送,存储到文件中或者使用其他的持久化技术,如数据库等。序列化后的字节流可以被传输给远程系统,并在那里重新构造成原始对象。Java 序列化是一个将对象转化为字节流的过程。

Java 对象的反序列化是将字节流重新恢复为原始对象的过程。反序列化是将字节流转化为对象的过程。反序列化是对象序列化的逆过程,通过反序列化操作能够在接收端恢复出与发送端相同的对象。当我们需要对存储的对象进行读取操作时,就需要对序列化的字节流进行反序列化操作,将字节流转化为原始的对象信息。

二、序列化和反序列化的实现方式

Java 中的序列化和反序列化可以通过实现 Serializable 接口来完成。Serializable 是一种标记接口,它没有方法定义,但它具有一个特别的作用,就是用于在描述 java 类可序列化时做类型判断的信息。当一个类实现 Serializable 接口时,表明这个类是可序列化的。Serializable 接口只是一个标识接口,我们并不需要重载任何方法。

在实现 Serializable 接口后,就可以通过 ObjectOutputStream 来将对象序列化,并将序列化后的字节流输出到文件或网络中;同时,也可以通过 ObjectInputStream 来将序列化后的字节流反序列化成对象。 java.io.ObjectOutputStream 继承自 OutputStream 类,因此可以将序列化后的字节序列写入到文件、网络等输出流中。

来看 ObjectOutputStream 的构造方法: ObjectOutputStream(OutputStream out)

一个对象要想序列化,必须满足两个条件:

  • 该类必须实现java.io.Serializable 接口open in new window,否则会抛出NotSerializableException
  • 该类的所有字段都必须是可序列化的。如果一个字段不需要序列化,则需要使用transient 关键字open in new window进行修饰。
  • 该构造方法接收一个 OutputStream 对象作为参数,用于将序列化后的字节序列输出到指定的输出流中。

示例代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.io.*;

public class SerializationDemo {
    public static void main(String[] args) {
        // 序列化对象
        Person person = new Person("Tom", 20);
        try {
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("person.txt"));
            objectOutputStream.writeObject(person);
            objectOutputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 反序列化对象
        try {
            ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("person.txt"));
            Person restoredPerson = (Person) objectInputStream.readObject();
            System.out.println(restoredPerson);
            objectInputStream.close();
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

class Person implements Serializable {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
复制代码

在上述代码中,我们定义了一个 Person 类,该类实现了 Serializable 接口。在序列化过程中,我们使用 ObjectOutputStream 类将 person 对象写出到文件中;在反序列化过程中,我们使用 ObjectInputStream 类读取文件中的字节流,并将其转换为 Person 对象。

三、序列化和反序列化的注意事项

  1. 私有化序列号属性

序列化和反序列化需要使用对象的序列号属性(serialVersionUID)来判断版本号是否一致,从而防止在新版本和旧版本之间发生不兼容的情况。如果没有显式地声明 serialVersionUID,则编译器会自动生成一个 serialVersionUID,但这种方式是不可靠的,因为在修改过程中可能会产生 serialVersionUID 的变化,从而导致不兼容问题。

因此,在 Java 序列化中,最好显式地声明 serialVersionUID 属性,并进行私有化,避免意外的修改。例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private static final long serialVersionUID = 1L;
复制代码
  1. 实现 readObject 和 writeObject 方法

readObject 和 writeObject 是在序列化和反序列化过程中用于自定义序列化的方法。通常情况下,我们可以直接使用默认的序列化方法,但是有时我们需要对序列化内容进行一些处理,这时就需要实现 readObject 和 writeObject 方法。例如,对于对象中敏感数据的处理,我们可以在 writeObject 方法中对数据进行加密处理,在 readObject 方法中解密处理。

需要注意的是,在实现 readObject 和 writeObject 方法时,必须要调用默认方法,默认方法可以通过 ObjectInputStream 和 ObjectOutputStream 类的 defaultReadObject 和 defaultWriteObject 方法调用。

四、序列化和反序列化的优点和缺点

序列化和反序列化的优点是:

  1. 对象的序列化方便了对象在不同应用之间的传递、存储和恢复。
  2. 通过序列化可以实现分布式计算,在不同的机器上对同一对象进行操作和协作。
  3. 序列化提供了数据持久化的能力,即将对象的状态保存在硬盘等介质中,下次可以直接从硬盘中读取数据,避免了频繁地进行数据库读写操作。

序列化和反序列化的缺点是:

  1. 在进行序列化和反序列化操作时,需要消耗额外的时间和开销,特别是当对象比较大或者嵌套较深的时候,可能会导致严重的性能问题。
  2. 序列化和反序列化可能存在安全性问题,如果被攻击者篡改了序列化后的字节流数据,那么反序列化后的对象可能会出现意外行为,如获得不应该获得的权限。

五、总结

Java 对象的序列化和反序列化是一种将对象转换成字节流并存储在硬盘或网络中,以及从字节流中重新加载对象的操作。序列化和反序列化均需要实现 Serializable 接口,并使用 ObjectOutputStream 和 ObjectInputStream 类来完成。序列化和反序列化可以方便地实现对象在不同应用之间的传递、存储和恢复等功能,但也存在一些缺点,如可能会导致严重的性能问题和安全性问题。在使用过程中,需要根据具体的业务场景和需求进行选择和优化,以达到最佳的效果。

在实际的 Java 开发中,序列化和反序列化是一个非常常见的操作,例如在分布式系统中,需要将对象序列化后通过网络传输,在不同的机器上进行反序列化以得到原始对象。

以下是一些使用序列化和反序列化的示例场景:

  1. 缓存

在实际的开发中,我们经常需要对一些数据进行缓存,使用序列化可以将对象序列化为字节数组,然后将字节数组存储到文件或者缓存中。当需要使用缓存中的对象时,再进行反序列化操作,重新获得原始对象。

  1. 远程调用

在分布式系统中,需要将对象序列化后通过网络传输,在不同的机器上进行反序列化以得到原始对象。例如在 Dubbo 框架中,就使用了对象序列化和反序列化机制。

  1. 持久化数据

在实际的开发中,我们需要将某些对象的状态保存到数据库或者文件中,使用序列化可以将对象序列化为字节数组,然后将字节数组存储到数据库或者文件中。当需要读取数据时,再进行反序列化操作,获得原始对象。

一般使用 Java 序列化和反序列化只需要实现 Serializable 接口即可,但是也可以使用一些工具依赖来简化操作。以下是一些常用的序列化和反序列化工具依赖:

1. Jackson

Jackson 是一个非常常用的序列化和反序列化工具,在 Spring Boot 等框架中也被广泛使用。Jackson 可以将对象序列化为 JSON 或者 XML 格式,同时也可以将 JSON 或者 XML 反序列化为对象。

2. Gson

Gson 是另一个常用的序列化和反序列化工具,同样可以将对象序列化为 JSON 格式,也可以将 JSON 反序列化为对象。

3. Protobuf

Protobuf 是 Google 开源的一种轻量级、高效、可扩展的序列化框架,支持多种编程语言。与 Java 序列化相比,Protobuf 使用效率更高,序列化后的字节流更小,但需要预定义消息格式。

4. Kyro

Kryo 是一个高性能的 Java 序列化和反序列化工具,可以将 Java 对象序列化为字节数组,适合于网络通信和数据持久化等场景。Kryo 能够快速地序列化和反序列化 Java 对象,相对于 Java 自带的序列化机制,它的速度更快,序列化后的字节数组也更小。

以上是一些常用的序列化和反序列化工具依赖,根据不同的业务需求和场景需要选择适合的工具。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
序列化/反序列化,我忍你很久了,淦!
上次不知道是哪个小伙伴留言说,关于对象 「序列化和反序列化」 这一块有点糊,能不能像之前梳理一样整理一波。
Java技术江湖
2020/06/16
8340
序列化/反序列化,我忍你很久了,淦!
从零开始:Java对象序列化和反序列化的简明指南
咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~
bug菌
2023/12/07
1.5K0
从零开始:Java对象序列化和反序列化的简明指南
【Java 基础篇】Java序列化与反序列化详解
在Java中,序列化和反序列化是一种将对象转换为字节流和将字节流转换为对象的机制。通过序列化,可以将对象存储到文件中、传输到网络上,或者在分布式系统中进行对象的传递。本文将详细介绍Java序列化和反序列化的原理、使用方法和常见应用场景,并提供一些示例代码。
繁依Fanyi
2023/10/12
7050
Java对象的序列化(Serialization)和反序列化详解
####1.序列化和反序列化 序列化(Serialization)是将对象的状态信息转化为可以存储或者传输的形式的过程,一般将一个对象存储到一个储存媒介,例如档案或记忆体缓冲等,在网络传输过程中,可以是字节或者XML等格式;而字节或者XML格式的可以还原成完全相等的对象,这个相反的过程又称为反序列化;
全栈程序员站长
2022/07/04
7720
为什么Bean类要序列化?
在Java编程中,我们经常需要使用Bean类来表示数据对象。而将Bean类进行序列化是一个非常重要的概念。下面将详细说明为什么需要对Bean类进行序列化,并提供具体的例子和方法。
GeekLiHua
2025/01/21
390
面试题:请解释Java中序列化和反序列化,提供使用序列化实际案例
Java中的序列化和反序列化是一种将对象转换为字节流,以便在网络上传输或在本地存储的机制。序列化将对象转换为字节流,而反序列化将字节流还原为原始对象。这个过程可以让我们在不同的Java应用程序之间共享对象,并且可以轻松地将对象存储到文件或数据库中。
用户1289394
2024/06/25
1300
面试题:请解释Java中序列化和反序列化,提供使用序列化实际案例
Java对象序列化:流式存储对象的高级技巧
咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~
bug菌
2024/09/25
1690
Java对象序列化:流式存储对象的高级技巧
深入探究Java中的序列化和反序列化过程
在Java开发中,序列化(Serialization)和反序列化(Deserialization)是一对重要的概念和操作。它们为我们提供了一种方便的方式来将对象转换为字节流,并在需要时重新构造对象。本文将深入探究Java中的序列化和反序列化过程,详细介绍其原理、应用场景以及示例代码,并邀请读者在评论区与我们互动,一起探讨这个话题。
疯狂的KK
2023/12/05
4580
深入探究Java中的序列化和反序列化过程
【Java】Java序列化和反序列化
在Java中,序列化是将对象的状态写入字节流的机制。它主要用于Hibernate、RMI、JPA、EJB和JMS技术中。
人不走空
2024/06/28
1490
【Java】Java序列化和反序列化
每日一博 - Java序列化一二事儿
把Java对象转换为字节序列的过程,-----------> 序列化 把字节序列恢复为Java对象的过程,-----------> 反序列化
小小工匠
2021/09/14
2700
每日一博 - Java序列化一二事儿
【JavaSE专栏21】序列化和反序列化,学会Java的编解码方法
序列化:将 Java 对象以一连串的字节保存在磁盘文件中的过程,也可以说是保存 Java 对象状态的过程,序列化可以将数据永久保存在磁盘上。
Designer 小郑
2023/08/01
2450
【JavaSE专栏21】序列化和反序列化,学会Java的编解码方法
【Java基本功】深入浅出Java中的序列化与反序列化
本文介绍了Java序列化的基本概念,序列化和反序列化的使用方法,以及实现原理等,比较全面地总结序列化相关知识点,并且使用具体例子来加以佐证。
Java技术江湖
2019/09/25
4600
Java程序员必备:序列化全方位解析
如果想在JVM停止后,把这些对象保存到磁盘或者通过网络传输到另一远程机器,怎么办呢?磁盘这些硬件可不认识Java对象,它们只认识二进制这些机器语言,所以我们就要把这些对象转化为字节数组,这个过程就是序列化啦~
捡田螺的小男孩
2020/05/01
1.5K0
Java对象的序列化和反序列化是什么?
Java对象的序列化和反序列化是Java中常用的一种数据持久化方式。简单地说,序列化是将一个Java对象转换为字节流的过程,而反序列化则是将字节流转换回Java对象的过程。 Java对象序列化的主要目的是将对象转换为字节流,以便在网络上传输或将对象持久化到本地磁盘上。当一个Java对象被序列化后,它的所有属性和成员变量的值都被转换成字节流,并可以通过网络或者存储到本地磁盘上。由于Java对象序列化后可以被传输和存储,因此它在分布式系统和网络编程中扮演着非常重要的角色。
用户1289394
2023/08/22
2460
Java对象的序列化和反序列化是什么?
Java序列化与反序列化:如何实现高效的序列化?JDK 8、17与21中有哪些最佳实践?
本文将深入解析 Java 序列化与反序列化的基本原理、常见实现方式以及 JDK 8、17 和 21 的优化技巧,结合代码案例提供最佳实践,帮助你构建高效、可靠的序列化方案。
猫头虎
2024/12/24
4610
java序列化和反序列化
Java序列化和反序列化是将Java对象转换为字节流和将字节流转换为Java对象的过程。Java提供了一种机制,称为Java对象序列化,可将Java对象转换为字节流,以便将其保存在文件中或通过网络传输。反序列化是将字节流转换回Java对象的过程。在本文中,我们将探讨Java序列化和反序列化的基本原理以及如何使用Java进行序列化和反序列化。
堕落飞鸟
2023/03/31
9600
Java对象序列化
  对于一个存在Java虚拟机中的对象来说,其内部的状态只是保存在内存中。JVM退出之后,内存资源也就被释放,Java对象的内部状态也就丢失了。而在很多情况下,对象内部状态是需要被持久化的,将运行中的对象状态保存下来(最直接的方式就是保存到文件系统中),在需要的时候可以还原,即使是在Java虚拟机退出的情况下。
卡尔曼和玻尔兹曼谁曼
2019/01/25
1.3K0
将对象序列化和反序列化
对象在java中是以堆的方式存储。有时候需要复制对象或者存储对象,而不是对象的引用,这时候就需要用的对象的序列化和反序列化。 1.序列化 Java序列化是指把Java对象转换为字节序列的过程;而Java反序列化是指把字节序列恢复为Java对象的过程。 很详细的博客Java中的序列化Serialable高级详解。 简单的来说大概有几点注意事项: 对象要实现了Serializable 接口 如果序列化和反序列化的serialVersionUID不同则反序列化失败,因为java是通过这个来进行序列化验证的。因此
Ryan-Miao
2018/03/13
1.2K0
对象序列化流与反序列化流
=java序列化,就是指吧java对象转换为字节序列的过程。而反序列自然就是将字节对象恢复为java对象。==
兰舟千帆
2022/07/16
5750
对象序列化流与反序列化流
Java 序列化
序列化分为两大部分:序列化和反序列化。序列化是这个过程的第一部分,将数据分解成字节流,以便存储在文件中或在网络上传输。反序列化就是打开字节流并重构对象。对象序列化不仅要将基本数据类型转换成字节表示,有时还要恢复数据。恢复数据要求有恢复数据的对象实例。
HLee
2021/05/08
1.2K0
Java 序列化
推荐阅读
相关推荐
序列化/反序列化,我忍你很久了,淦!
更多 >
LV.0
这个人很懒,什么都没有留下~
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验