讲师中心 微信公众号

工具推荐

视频效率加速
立刻MV
立刻MV

低成本歌曲 MV、视频生成

剧云
剧云

中文短剧剧本制作平台

AniShort
AniShort

AI短剧协同制作平台

Seko
Seko

AI短剧一键生成成片

Java中序列化的用法_Java中对象持久化的技巧

雨雪小哥_3434

雨雪小哥_3434

发布时间:2025-06-23 17:48:02

|

983人浏览过

|

来源于php中文网

原创

java序列化是将对象转换为字节流以便存储或传输的过程,反序列化则是将其还原。1. 实现serializable接口的类可被序列化;2. 静态和transient字段默认不被序列化;3. 可通过writeobject/readobject自定义序列化逻辑;4. serialversionuid用于标识版本,避免类修改导致反序列化失败;5. 常见应用场景包括数据持久化、分布式系统通信、缓存及会话管理;6. 序列化需注意性能与安全问题,建议使用高效框架并减少对象大小。

Java中序列化的用法_Java中对象持久化的技巧

Java序列化,简单来说,就是把Java对象转换成字节流,方便存储到硬盘上或者通过网络传输。反序列化则是反过来,把字节流还原成Java对象。这对于持久化数据,或者在分布式系统中传递对象非常有用。

Java中序列化的用法_Java中对象持久化的技巧

序列化就像给对象拍了个快照,然后把快照保存下来,以后可以随时还原成原来的样子。

Java中序列化的用法_Java中对象持久化的技巧

序列化的核心在于java.io.Serializable接口。一个类只要实现了这个接口,它的对象就可以被序列化。

立即学习“Java免费学习笔记(深入)”;

Java中序列化的用法_Java中对象持久化的技巧
import java.io.*;

public class MyObject implements Serializable {
    private String name;
    private int age;

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

    @Override
    public String toString() {
        return "MyObject{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public static void main(String[] args) {
        MyObject obj = new MyObject("Alice", 30);

        // 序列化
        try (FileOutputStream fileOut = new FileOutputStream("myobject.ser");
             ObjectOutputStream out = new ObjectOutputStream(fileOut)) {
            out.writeObject(obj);
            System.out.println("Serialized data is saved in myobject.ser");
        } catch (IOException i) {
            i.printStackTrace();
        }

        // 反序列化
        try (FileInputStream fileIn = new FileInputStream("myobject.ser");
             ObjectInputStream in = new ObjectInputStream(fileIn)) {
            MyObject obj2 = (MyObject) in.readObject();
            System.out.println("Deserialized MyObject: " + obj2);
        } catch (IOException i) {
            i.printStackTrace();
        } catch (ClassNotFoundException c) {
            System.out.println("MyObject class not found");
            c.printStackTrace();
        }
    }
}

这段代码展示了序列化和反序列化的基本流程。注意,ObjectOutputStream和ObjectInputStream是核心类,负责读写对象流。

序列化时,哪些字段会被忽略?

并非所有字段都适合序列化。例如,静态变量(static)和瞬态变量(transient)默认情况下不会被序列化。静态变量属于类级别,而不是对象状态的一部分,而瞬态变量则被标记为不需要持久化。

JavaScript 测试模式
JavaScript 测试模式

使用 Jest、Vitest 和 Testing Library 实施全面的测试策略,包括单元测试、集成测试和端到端测试,涵盖模拟、测试夹具和测试驱动开发。在编

下载

如果你想自定义序列化过程,可以使用writeObject和readObject方法。这允许你控制哪些字段被序列化,以及如何序列化它们。例如,你可以加密敏感数据后再进行序列化。

import java.io.*;

public class MyObject implements Serializable {
    private String name;
    private transient String sensitiveData; // 不会被序列化

    public MyObject(String name, String sensitiveData) {
        this.name = name;
        this.sensitiveData = sensitiveData;
    }

    private void writeObject(ObjectOutputStream out) throws IOException {
        // 自定义序列化逻辑
        out.defaultWriteObject(); // 先序列化默认字段
        // 可以加密 sensitiveData 后再写入
        // 例如:String encryptedData = encrypt(sensitiveData);
        // out.writeObject(encryptedData);
    }

    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
        // 自定义反序列化逻辑
        in.defaultReadObject(); // 先反序列化默认字段
        // 可以解密 sensitiveData
        // 例如:String encryptedData = (String) in.readObject();
        // sensitiveData = decrypt(encryptedData);
    }

    // 省略 getter/setter 和 main 方法
}

序列化版本号的作用是什么?

serialVersionUID是一个长整型常量,用于标识类的序列化版本。如果类的结构发生改变(例如,添加或删除字段),而你又想反序列化旧版本的数据,那么就需要考虑serialVersionUID。

如果类的serialVersionUID与序列化数据中的serialVersionUID不匹配,反序列化会失败,抛出InvalidClassException。

建议显式声明serialVersionUID,避免因为类的细微修改导致反序列化失败。可以使用IDE自动生成。

import java.io.Serializable;

public class MyObject implements Serializable {
    private static final long serialVersionUID = 1L; // 显式声明版本号
    private String name;
    private int age;

    // ...
}

序列化在实际项目中有哪些应用场景?

序列化在很多场景下都非常有用。

  • 持久化数据: 将对象保存到硬盘上,例如保存用户配置、游戏存档等。
  • 分布式系统: 在不同的JVM之间传递对象,例如RMI、RPC等。
  • 缓存: 将对象序列化后存储到缓存中,提高性能。例如,使用Redis缓存对象。
  • 会话管理: 在Web应用中,将Session对象序列化后存储到硬盘上,实现Session持久化。

序列化和反序列化在实际应用中,需要注意性能问题。频繁的序列化和反序列化操作会消耗大量的CPU和内存资源。可以使用一些优化策略,例如使用高效的序列化框架(如Protobuf、Kryo)或者减少序列化的对象大小。另外,需要注意安全性问题,避免反序列化漏洞。

热门AI工具

更多
讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
什么是分布式
什么是分布式

分布式是一种计算和数据处理的方式,将计算任务或数据分散到多个计算机或节点中进行处理。本专题为大家提供分布式相关的文章、下载、课程内容,供大家免费下载体验。

2213

2023.08.11

分布式和微服务的区别
分布式和微服务的区别

分布式和微服务的区别在定义和概念、设计思想、粒度和复杂性、服务边界和自治性、技术栈和部署方式等。本专题为大家提供分布式和微服务相关的文章、下载、课程内容,供大家免费下载体验。

3734

2023.10.07

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6404

2023.10.24

session失效的原因
session失效的原因

session失效的原因有会话超时、会话数量限制、会话完整性检查、服务器重启、浏览器或设备问题等等。详细介绍:1、会话超时:服务器为Session设置了一个默认的超时时间,当用户在一段时间内没有与服务器交互时,Session将自动失效;2、会话数量限制:服务器为每个用户的Session数量设置了一个限制,当用户创建的Session数量超过这个限制时,最新的会覆盖最早的等等。

580

2023.10.17

session失效解决方法
session失效解决方法

session失效通常是由于 session 的生存时间过期或者服务器关闭导致的。其解决办法:1、延长session的生存时间;2、使用持久化存储;3、使用cookie;4、异步更新session;5、使用会话管理中间件。

876

2023.10.18

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

1986

2025.08.19

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

3248

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

5509

2025.10.17

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

100

2026.11.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn