一、transient 是干什么的?
一句话定义:
transient用来告诉 Java:这个字段不要参与对象的序列化与反序列化。
class User implements Serializable {
String name;
transient String password;
}
序列化之后:
name会被保存password会被忽略,反序列化后为null
二、Java 默认的序列化规则
在 Java 中,只要满足以下条件:
- 类实现了
Serializable - 字段 不是
static - 字段 不是
transient
👉 那么这个字段就会被 自动序列化。
也就是说:
private ValueState<LastPoint> lastPoint;
在 Java 看来,这只是一个普通成员变量,会跟着对象一起被序列化。
三、如果不加 transient 会怎样?
1️⃣ 普通 Java 场景
ObjectOutputStream oos = new ObjectOutputStream(...);
oos.writeObject(obj);
transient字段不会被写入- 非
transient字段会被写入
这是 Java 层面的规则。
2️⃣ 在 Flink 中的隐蔽问题(重点)
Flink 在以下场景中,会涉及算子对象的序列化:
- 作业下发(JobManager → TaskManager)
- Task 重启 / failover
- checkpoint / savepoint
- 扩缩容(rescale)
如果你不加 transient:
private ValueState<LastPoint> lastPoint;
Java 会尝试序列化这个 State 句柄对象,而这通常会导致:
NotSerializableException- 作业启动失败
- checkpoint 异常


