在Java中序列化是什么_JavaSerializable接口应用说明

发布时间 - 2026-01-29 00:00:00    点击率:
Java序列化是将对象转为字节流以存储或传输,需显式实现Serializable接口作为JVM安全检查的硬性门槛;transient和static字段不参与序列化,反序列化不调用构造函数;因体积大、性能差、语言绑定强及安全风险,生产环境推荐Jackson等替代方案。

Java序列化就是把内存里的对象“拍扁”成一串字节,以便存文件、走网络或跨JVM传递;Serializable接口

本身不干任何事,它只是个标签——告诉JVM“这个类允许被自动序列化”。

为什么必须实现 Serializable 接口?

不实现它,调用 ObjectOutputStream.writeObject() 会直接抛 NotSerializableException。JVM靠这个接口做安全检查,不是语法糖,是硬性准入门槛。

  • 接口无方法,纯标记作用,但必须显式声明:class Person implements Serializable
  • 若父类没实现,子类实现也没用——父类字段不会被序列化(除非父类也实现了或字段是 transient
  • 推荐显式声明 private static final long serialVersionUID,否则JVM自动生成,类结构稍有变动(如加个字段)就可能反序列化失败

ObjectOutputStreamObjectInputStream 怎么用?

这是序列化/反序列化的“搬运工”,底层依赖 FileOutputStream/FileInputStream 等流,但你只管对象,不用操心字节怎么拼。

  • 写入时:用 FileOutputStream 包一层,再套 ObjectOutputStream,然后调 writeObject(obj)
  • 读取时:顺序必须严格对应,先开 FileInputStream,再套 ObjectInputStream,再调 readObject() 并强制转型
  • 注意捕获两个异常:IOException(流问题)和 ClassNotFoundException(反序列化时找不到类定义)
try (FileOutputStream fos = new FileOutputStream("user.ser");
     ObjectOutputStream oos = new ObjectOutputStream(fos)) {
    oos.writeObject(new User("Alice", 28));
} catch (IOException e) {
    e.printStackTrace();
}

哪些字段不会被序列化?常见陷阱有哪些?

默认只序列化非 static、非 transient 的实例字段。但真正踩坑的往往不是规则,而是隐含行为。

  • transient 字段跳过序列化,但反序列化后为默认值(null0false),不会调构造函数重置
  • 如果类里有不可序列化的成员(比如 ThreadSocket),又没标 transient,运行时才报错
  • 集合类如 ArrayList 可序列化,但里面存了自定义对象,那些对象也得实现 Serializable,否则链路断在中间
  • 反序列化不走构造函数(包括无参构造),所以初始化逻辑(如字段赋默认值、资源预加载)不会执行

什么时候该换别的序列化方式?

原生 Java 序列化适合开发调试、RMI、老系统内部通信,但生产环境要谨慎:

  • 字节体积大、性能慢,比 JSON 或 Protobuf 大 3–5 倍,序列化/反序列化耗时高
  • 完全 Java 生态绑定,无法被 Go/Python 等语言解析
  • 存在严重反序列化漏洞风险(如 InvokerTransformer 链),除非你完全信任数据来源,否则别用在 HTTP 请求体或 MQ 消息中
  • 类结构变更兼容性差——删字段、改类型、改访问修饰符都可能让旧数据无法读取

真正需要跨服务、高性能或安全可控时,Serializable 就该让位给 Jackson(JSON)、Kryo 或 Protobuf。


# python  # java  # js  # json  # go  # 字节  # stream  # 为什么  # jvm  # Static  # NULL  # 父类  # 子类  # 构造函数  # 接口  # class  # private  # Thread  # 对象  # http  # 序列化  # 绑定  # 安全检查  # 默认值  # 这是  # 是个  # 什么时候  # 找不到  # 能让 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何操作JSON类型的数据库字段?(Eloquent示例)  香港服务器租用每月最低只需15元?  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  高性能网站服务器配置指南:安全稳定与高效建站核心方案  昵图网官方站入口 昵图网素材图库官网入口  Laravel storage目录权限问题_Laravel文件写入权限设置  如何打造高效商业网站?建站目的决定转化率  UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】  Bootstrap整体框架之CSS12栅格系统  Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】  Laravel如何使用模型观察者?(Observer代码示例)  Laravel如何使用.env文件管理环境变量?(最佳实践)  JavaScript Ajax实现异步通信  Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言  Java垃圾回收器的方法和原理总结  Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程  Python自然语言搜索引擎项目教程_倒排索引查询优化案例  Laravel DB事务怎么使用_Laravel数据库事务回滚操作  Swift开发中switch语句值绑定模式  Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】  Claude怎样写约束型提示词_Claude约束提示词写法【教程】  如何在IIS7中新建站点?详细步骤解析  如何在Ubuntu系统下快速搭建WordPress个人网站?  Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  网站制作价目表怎么做,珍爱网婚介费用多少?  html5audio标签播放结束怎么触发事件_onended回调方法【教程】  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  个人网站制作流程图片大全,个人网站如何注销?  怎么用AI帮你为初创公司进行市场定位分析?  三星、SK海力士获美批准:可向中国出口芯片制造设备  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  如何在 Pandas 中基于一列条件计算另一列的分组均值  Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验  Laravel如何实现模型的全局作用域?(Global Scope示例)  Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作  如何用美橙互联一键搭建多站合一网站?  Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO)  phpredis提高消息队列的实时性方法(推荐)  php增删改查怎么学_零基础入门php数据库操作必知基础【教程】  免费网站制作appp,免费制作app哪个平台好?  Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程  大连 网站制作,大连天途有线官网?  Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】  如何利用DOS批处理实现定时关机操作详解  Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤  微信小程序 HTTPS报错整理常见问题及解决方案  高防服务器租用首荐平台,企业级优惠套餐快速部署  如何用狗爹虚拟主机快速搭建网站?