讲师中心 微信公众号

工具推荐

视频效率加速
Seko
Seko

AI短剧一键生成成片

Laper
Laper

剧本策划到成片协作

AniShort
AniShort

AI短剧协同制作平台

updream

一键生成高质量推广成片

在Java中如何实现对象数据持久化_Java序列化项目讲解

梦墨吖_8341

梦墨吖_8341

发布时间:2026-01-21 10:26:03

|

460人浏览过

|

来源于php中文网

原创

Java原生序列化仅适用于同构Java环境的临时状态快照,存在跨语言不支持、安全风险(如敏感字段泄露)、性能差及反序列化失败等问题,不适合业务对象持久化。

在java中如何实现对象数据持久化_java序列化项目讲解

Java原生序列化(Serializable)能快速实现对象持久化,但仅适用于同构Java环境、不跨语言、且存在安全与性能隐患——它不是通用数据存储方案,而是JVM内部的临时状态快照机制。

为什么不能直接用ObjectOutputStream存业务对象到文件就完事?

看似简单,实际踩坑密集:

  • serialVersionUID缺失会导致类结构微调后反序列化直接抛InvalidClassException
  • 未声明为transient的敏感字段(如密码、连接池)会被一并序列化,造成泄露
  • 包含Thread、Socket、InputStream等非序列化类型字段时,运行时报NotSerializableException
  • 序列化后的二进制格式不可读、不可调试、无法被其他语言解析

如何安全地让一个类支持序列化?

必须显式控制可序列化边界,而非仅加implements Serializable:

Java Development Man
Java Development Man

Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。

下载
  • 始终手动定义private static final long serialVersionUID = 1L;(建议用IDE生成唯一值)
  • 用transient标记不应持久化的字段,例如private transient String authToken;
  • 若需自定义序列化逻辑(如加密/解密字段),重写private void writeObject(ObjectOutputStream out)和private void readObject(ObjectInputStream in)
  • 避免序列化持有外部资源的对象(如数据库连接、线程句柄),它们在反序列化后必然失效
public class User implements Serializable {
    private static final long serialVersionUID = -329847123456789L;
    private String name;
    private transient String password; // 不参与序列化
    private int age;

    private void writeObject(ObjectOutputStream out) throws IOException {
        out.defaultWriteObject(); // 先序列化非transient字段
        out.writeUTF(encrypt(password)); // 手动加密写入
    }

    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
        in.defaultReadObject();
        this.password = decrypt(in.readUTF()); // 手动解密读取
    }
}

ObjectOutputStream写文件和ObjectInputStream读文件的典型陷阱

底层是字节流操作,路径、流关闭、异常处理稍有疏忽就会静默失败或文件损坏:

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

  • 必须用try-with-resources确保ObjectOutputStream和FileOutputStream都被关闭,否则可能只写入部分头信息,导致后续读取报StreamCorruptedException
  • 多次writeObject()写入同一ObjectOutputStream实例,对象引用会被缓存;若想重复写相同对象且希望每次都是独立副本,需调用reset()
  • 反序列化时类路径必须与序列化时完全一致(包括包名、类名、serialVersionUID),否则ClassNotFoundException或InvalidClassException无法绕过
  • 不要把序列化文件当数据库用——没有并发控制、无事务、无索引,多线程同时读写大概率损坏

真正需要跨进程/跨语言/长期存储时,应转向JSON(Jackson)、Protobuf(protobuf-java)或数据库。Java序列化只适合极短生命周期的场景:RMI参数传递、单机缓存临时快照、测试中模拟对象状态保存。

热门AI工具

更多
讯飞智作

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

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

豆包大模型

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

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

DeepSeek

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

WorkBuddy

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

花生AI
花生AI Hot

一款AI视频创作工具,主要用于B站推出的AI视频创作工具,适合需要提升相关任务效率的用户。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2355

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

3882

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

1296

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

4519

2025.09.10

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

7579

2023.08.02

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

636

2023.11.23

java中void的含义
java中void的含义

本专题整合了Java中void的相关内容,阅读专题下面的文章了解更多详细内容。

391

2025.11.27

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

4898

2023.08.10

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