促销
学习
课程
任务
调查 & 测验
游戏
帮助
日程
社区
Users
论坛
聊天
文章
成功故事
动态
评价
订阅
浅色主题
课时
评论
关于我们
开始
开始学习
立即开始学习
我的进度
课程
任务地图
课程
Java 25
所有任务
所有级别
Externalizable:序列化的精细化定制
JAVA 25 SELF
等级 43,
课时 2
在 Java 中扩展基础序列化:当内置的
Serializable
不够用时,可以借助手动契约
Externalizable
及其
writeExternal
/
readExternal
方法。本讲将讲解如何完全控制数据格式、减小文件大小并保持向后兼容,对比
ObjectOutputStream
/
ObjectInputStream
流的行为,给出示例、优缺点与常见陷阱(必须提供
public
无参构造器、严格的写入/读取顺序等)。
配置序列化行为:自定义方法
JAVA 25 SELF
等级 43,
课时 3
本讲解读如何通过方法
writeReplace
和
readResolve
影响 Java 中的序列化与反序列化过程:为何要将对象替换为代理、如何保持单例、如何处理不可变对象,以及这与
writeObject
/
readObject
的关系。包含循序渐进的实操、操作流程图与典型错误解析。
序列化安全:最佳实践
JAVA 25 SELF
等级 43,
课时 4
Java 安全序列化实用指南:为何来自不可信来源的反序列化具有危险性,如何借助
ObjectInputFilter
、关键字
transient
、显式的
serialVersionUID
、通过
instanceof
的类型检查,以及替代交换格式(JSON/Proto)进行防护。其中包含直观的代码示例、允许类的白名单过滤以及对典型错误的解析。
嵌套对象的序列化:特点
JAVA 25 SELF
等级 44,
课时 0
在本讲中,我们将解析 Java 如何对对象图进行深度序列化:字段引用会发生什么、为什么所有嵌套对象都必须实现
Serializable
、如何避免
NotSerializableException
,以及在哪些情况下可以使用修饰符
transient
。我们通过示例演示带有嵌套、集合与循环引用的对象的序列化/反序列化,并分析与
serialVersionUID
以及大型对象图相关的典型错误。
嵌套与层级对象:对象图的序列化
JAVA 25 SELF
等级 44,
课时 1
Java 如何序列化复杂数据结构:从嵌套集合和继承层级到循环的对象图。我们将解释为什么序列化
Map<String, List<Book>>
可以正常工作,
List<Animal>
中如何保留子类的真实类型,循环时引用机制会做什么,以及会遇到哪些陷阱。还会讨论
ObjectOutputStream
/
ObjectInputStream
的作用、
writeObject
/
readObject
方法、
serialVersionUID
字段以及
transient
修饰符。
循环引用问题:检测与规避
JAVA 25 SELF
等级 44,
课时 2
解析对象图中的循环引用是什么、它们为何会对序列化造成风险,以及如何处理。展示了 Java 标准流 —
ObjectOutputStream
/
ObjectInputStream
— 如何自动跟踪已遇到的对象并写入引用(handles),从而避免
StackOverflowError
。还将拆解自定义序列化(
writeObject
/
readObject
、
defaultWriteObject
/
defaultReadObject
)的坑,以及在 JSON 中处理循环的策略:使用注解
@JsonIdentityInfo
、
@JsonBackReference
/
@JsonManagedReference
,通过
transient
排除字段,以及使用标识符的方式。
二进制序列化中的对象身份
JAVA 25 SELF
等级 44,
课时 3
Java 在二进制序列化中如何保存并恢复对象的身份:为何通过
a
.
equals
(
b
) 的等价性不等于身份(
a
==
b
);
ObjectOutputStream
/
ObjectInputStream
如何跟踪对象图并写入“重复引用”而非重复对象,为什么在存在循环时也能正确工作,以及
writeReplace()
和
readResolve()
方法如何影响最终的身份。配合示例进行解析:循环、共享引用、实践与常见错误。
集合序列化中的常见错误解析
JAVA 25 SELF
等级 44,
课时 4
在本讲中,我们解析在序列化集合时最常见的问题:从
java.io.NotSerializableException
(当元素未实现
Serializable
时)以及伴随
ClassCastException
的泛型陷阱,到通过
serialVersionUID
导致的类版本不兼容。我们会讨论不可变集合(
List.of()
、
Set.of()
、
Map.of()
)的细节,
transient
/
static
字段的行为,以及关于性能与文件大小的问题,此时流式写入与压缩(
GZIPOutputStream
)会有所帮助。你将获得实用建议、代码示例以及安全反序列化(
readObject
/
writeObject
)的推荐做法。
二进制序列化的问题:安全性与兼容性
JAVA 25 SELF
等级 45,
课时 0
本讲将解析 Java 中二进制序列化的风险:为什么从不受信任来源进行反序列化很危险(“gadget chain”、RCE),像
readObject
和
readResolve
这样的特殊方法会带来什么威胁,以及如何进行防护(白名单、放弃转用
JSON
/
XML
、使用诸如
Jackson
等安全库)。将详细讨论类版本兼容性与
serialVersionUID
字段的作用、遇到
InvalidClassException
时的行为、
transient
/
static
的限制、性能问题,以及最佳实践与常见错误。
泛型集合的序列化:特点
JAVA 25 SELF
等级 45,
课时 1
我们来解析类型擦除(
type erasure
)如何影响泛型集合的序列化:为什么在运行时
List<String>
与
List<Integer>
实际上都是同一个
ArrayList
,通过
ObjectOutputStream
/
ObjectInputStream
到底写入/读取了什么,
ClassCastException
与关于
unchecked
转型的警告从何而来。我们会展示嵌套集合、
Map
/
Set
的示例,提到
Gson
/
Jackson
,并给出安全反序列化的实践。
序列化中的兼容性与向后兼容性(backward compatibility)
JAVA 25 SELF
等级 45,
课时 2
讲解如何在不破坏数据的情况下演进可序列化的类:为什么要固定
serialVersionUID
,JVM 如何校验兼容性,哪些修改是安全的(添加/删除字段),哪些是致命的(更改类型、将类移动到其他包)。展示
transient
/
static
的作用,通过
writeObject
/
readObject
进行自定义序列化的技巧,二进制序列化与 XML/JSON 的区别,保障兼容性的策略以及典型错误(例如
InvalidClassException
)。
序列化数据的迁移与版本管理
JAVA 25 SELF
等级 45,
课时 3
如何在生产环境中安全演进可序列化类:当字段和类型发生变化会出现什么情况,类版本如何通过
serialVersionUID
工作,何时需要修改、何时保持不变,如何通过
readObject
/
readFields
实现“惰性”迁移与“原地”(in-place)转换,以及有哪些高级技巧,例如
ObjectInputStream.readClassDescriptor()
。我们将拆解一个包含两个类版本与典型错误的完整实战场景,包括
InvalidClassException
的陷阱。
显示更多
1
...
19
20
21
22
23
...
30
Please enable JavaScript to continue using this application.