应使用自定义运行时注解(如@EditorInternal、@NoSave)标记需忽略序列化的字段,结合反射扫描+递归处理继承与集合,封装统一过滤逻辑,并配合JSON序列化器配置实现精准控制。

在复杂图形编辑器中做序列化时,不导出某些属性不是靠硬编码排除字段,而是靠注解驱动 + 反射判断,核心在于“标记意图”和“运行时识别”。关键不是阻止反射读取,而是让序列化逻辑主动跳过被标记的字段。
用 @Transient 或自定义注解标记忽略字段
Java 常用 @Transient(JPA)或 @JsonIgnore(Jackson)表示不参与序列化,但图形编辑器通常需要更语义化的控制。推荐定义自己的注解,比如:
- @EditorInternal:标识仅用于运行时状态同步、UI交互响应的字段(如临时选中态、拖拽偏移量、预览缓存)
- @NoSave:明确表达该属性不应写入持久化数据(如自动计算的 boundingBox.width,或编辑器内部 ID)
- 注解需声明
@Retention(RetentionPolicy.RUNTIME),否则反射拿不到
序列化前用反射扫描并过滤字段
在导出前(如调用 saveToJSON()),遍历目标对象所有 declaredFields,检查是否含忽略注解:
- 用
field.getAnnotation(EditorInternal.class) != null判断是否跳过 - 注意处理继承字段:需递归调用
getSuperclass()并扫描父类字段 - 对集合类节点(如
List),要递归应用同一规则,不能只检查容器字段本身
结合属性访问器统一控制逻辑
避免每处都写反射判断,可封装为工具方法:
- 提供
shouldSerialize(Field field)方法,集中管理所有忽略规则(注解 + 字段名白名单/黑名单 + 类型策略) - 支持组合条件,例如:
@NoSave且非final字段才忽略;或transient关键字 + 注解双保险 - 与编辑器状态系统联动:如当前处于“预览模式”,则额外忽略所有
animationState类字段
注意 JSON 序列化器的配合配置
即使反射层已过滤,若直接用 Jackson/Gson 默认序列化整个对象,仍可能导出 unwanted 字段。因此需:
- 不直接
objectMapper.writeValueAsString(obj),而是先转为 Map 或 JsonNode,再手动剔除 - 或配置 Jackson 的
SimpleModule,注册自定义BeanSerializerModifier,在序列化前动态屏蔽字段 - 若用 Gson,可通过
ExclusionStrategy实现相同效果,且能访问注解信息










