Java原生Serializable不支持注解动态控制字段序列化;Jackson用@JsonIgnore、@JsonProperty等注解实现字段级控制;Gson需@Expose配合GsonBuilder启用;自定义writeObject/readObject可手动干预;推荐优先使用Jackson或Gson。

Java 原生序列化(java.io.Serializable)不支持通过注解动态控制字段是否参与序列化——它默认序列化所有非 transient、非 static 字段,且没有内置注解机制来按需开启/关闭字段。
使用 Jackson(JSON 场景):@JsonIgnore 与 @JsonProperty
如果你实际使用的是 JSON 序列化(如 Spring Web 返回 JSON),Jackson 是主流方案,它提供丰富注解支持字段级动态控制:
- @JsonIgnore:直接忽略该字段(反序列化也跳过)
-
@JsonProperty(value = "name"):显式指定字段名,并隐含“参与序列化”;若设
@JsonProperty(access = JsonProperty.Access.READ_ONLY)可控制读写方向 -
@JsonInclude(JsonInclude.Include.NON_NULL) 或
NON_EMPTY:类级别配置,跳过 null/空值字段(非字段标记,但效果类似动态过滤) - 运行时动态控制:结合
SimpleFilterProvider+@JsonFilter,在序列化前传入白名单字段名,实现真正的“动态子集”
使用 Gson:@Expose 注解
Gson 提供 @Expose,需配合 GsonBuilder.excludeFieldsWithoutExposeAnnotation() 启用:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 只序列化/反序列化标有
@Expose的字段 - 可组合
@Expose(serialize = false, deserialize = true)精细控制方向 - 注意:Gson 默认不启用该行为,必须显式配置 builder
自定义序列化(Serializable + writeObject/readObject)
若坚持用 Java 原生 Serializable,只能手动干预字节流生成逻辑:
立即学习“Java免费学习笔记(深入)”;
- 声明
private void writeObject(ObjectOutputStream out) throws IOException - 在方法内手动调用
out.defaultWriteObject()(触发默认逻辑),或完全跳过,仅写入你想要的字段 - 对应实现
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException - 这种方式绕过注解,但可结合自定义注解(如
@SerialField)+ 反射,在writeObject中扫描并选择性写入
推荐实践:优先选序列化框架而非原生 Serializable
原生序列化设计老旧,缺乏灵活性和跨语言能力。现代应用中:
- Web API 用 Jackson(Spring 默认)或 Gson,靠注解清晰表达意图
- 需要动态字段子集时,Jackson 的
@JsonFilter+ 运行时FilterProvider是最接近“注解驱动动态控制”的方案 - 避免为兼容性妥协而强行用
Serializable控制字段——除非对接遗留 RMI 或特定二进制协议

















