Java中实现按需序列化部分字段的核心方法是使用transient关键字配合自定义writeObject和readObject方法,或借助Jackson、Gson等框架的注解控制;原生Serializable不支持选择性序列化,但可通过组合机制精准控制。

Java 中实现按需序列化部分字段,核心方法是使用 transient 关键字 + 自定义 writeObject 和 readObject 方法,或借助外部序列化框架(如 Jackson、Gson)的注解控制。原生 Serializable 接口本身不支持“选择性序列化”,但可通过组合机制精准控制哪些字段参与序列化。
用 transient + 自定义序列化方法
这是最标准、不依赖第三方库的方式。将不想序列化的字段声明为 transient,再在类中显式重写 private void writeObject(ObjectOutputStream out) 和 private void readObject(ObjectInputStream in),只对需要的字段调用 out.defaultWriteObject() 或手动 out.writeXXX() 写入。
-
transient字段默认跳过 JVM 默认序列化流程 -
defaultWriteObject()会序列化所有**非 transient 非 static** 字段 —— 所以要先确保只需保留的字段没被标记为transient - 若需更细粒度(比如某些非 transient 字段也想跳过),就完全绕过
defaultWriteObject(),改用out.writeInt()、out.writeObject()等逐个写入目标字段 - 对应地,
readObject()必须严格按相同顺序和类型读取,否则反序列化失败
用 Jackson 的 @JsonIgnore / @JsonInclude / @JsonProperty
如果项目已用 Jackson(常见于 Spring Web 应用),推荐用注解方式,更灵活且语义清晰:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
@JsonIgnore:标注在字段或 getter 上,该字段不参与 JSON 序列化/反序列化 -
@JsonIgnoreProperties({"field1", "field2"}):类级别批量忽略 -
@JsonInclude(JsonInclude.Include.NON_NULL):仅序列化非 null 值字段(适合空值过滤场景) -
@JsonProperty("name")配合access = JsonProperty.Access.WRITE_ONLY可实现“只反序列化不序列化”
用 Gson 的 @Expose 注解
Gson 默认序列化所有 public 字段,但可通过 @Expose 显式标记“可序列化字段”,再配置 GsonBuilder().excludeFieldsWithoutExposeAnnotation() 启用白名单模式:
立即学习“Java免费学习笔记(深入)”;
- 只给需要序列化的字段加
@Expose - 未标注的字段(包括 private 字段)一律不参与序列化
- 注意:必须主动构建 Gson 实例并启用该选项,否则注解无效
避免踩坑的关键细节
自定义序列化时容易忽略几个关键点:
- 序列化/反序列化方法必须是
private,且签名严格匹配(参数类型、顺序不能错) - 若父类也实现了自定义序列化,子类中需显式调用
super.writeObject(out)或自行处理继承字段 - 使用
transient后,若字段需在反序列化后重建(如缓存、连接对象),应在readObject()末尾补充初始化逻辑 - 序列化 ID(
serialVersionUID)建议显式声明,避免因字段增减导致版本不兼容

















