抽象类可作为序列化模板基座,封装通用流程(初始化、预处理、主流程、后置处理),强制子类实现核心转换方法doserialize()和dodeserialize(),并提供可选钩子、工具方法及策略扩展能力。

抽象类可以作为序列化模板的基座,把通用逻辑(如字段校验、时间格式统一、空值处理)抽离出来,同时通过抽象方法或钩子函数,留给子类实现特定数据结构的转换规则。
定义抽象序列化基类,封装通用流程
在基类中完成初始化、预处理、序列化主流程和后置处理,只把“对象 → 原始数据”和“原始数据 → 对象”这两个核心步骤声明为抽象方法。这样既保证调用链一致,又不约束具体实现方式。
- 构造时可传入配置(如日期格式、是否忽略 null),供整个流程复用
- 提供 serialize() 和 deserialize() 公共方法,内部按固定顺序调用钩子:preSerialize → doSerialize → postSerialize
- 预留 beforeConvert() 和 afterConvert() 等受保护的空方法,子类可选择性重写
用抽象方法强制子类实现关键转换逻辑
比起接口,抽象类更适合此处——它既能定义契约,又能自带可复用的工具方法(比如 JSON 工具类封装、Base64 编解码、字段映射表生成等)。
-
doSerialize(T obj):接收业务对象,返回 Map
或 byte[] 等标准中间格式 -
doDeserialize(Map
data) :接收标准化数据,构造并返回具体类型实例 - 这两个方法不暴露底层库细节(如 Jackson/Gson),子类可用任意方式实现,甚至混合多种协议
通过泛型+反射支持多类型复用
把抽象类声明为 AbstractSerializer
- 基类可内置 getFieldValue(obj, fieldName) 和 setFieldValue(obj, fieldName, value),屏蔽反射异常和访问控制
- 子类只需关注“哪个字段怎么转”,例如:LocalDateTime → "2024-03-15T10:30:00",或 BigDecimal → 字符串截断精度
- 若需兼容非 JavaBean(如 Record、Map 结构),可在子类中直接绕过反射,走自定义逻辑
结合策略模式扩展特殊场景
当某类数据需要不同序列化行为(如加密字段、分片 ID、敏感信息脱敏),可在抽象类中定义 protected 的策略容器,子类注册对应处理器。
- 例如:addConverter("phone", value -> "***" + value.toString().substring(7))
- 基类在 doSerialize 中自动识别字段名并委托给对应 converter,无需每个子类重复 if-else
- 策略可动态替换,便于测试 Mock 或运行时切换规则











