序列化策略
大约 12 分钟约 3636 字
序列化策略
重要
序列化策略需要熟知,它决定了你的API接口的出入参形状
组件名称:blade-web-spring-boot-starter
引入依赖
Gradle(KTS)
implementation("team.aikero.blade:blade-web-spring-boot-starter:${latestVersion}")Maven
<dependency>
<groupId>team.aikero.blade</groupId>
<artifactId>blade-web-spring-boot-starter</artifactId>
<version>${latestVersion}</version>
</dependency>序列化配置
项目之前采用了一种泛化的序列化手段,这种方式对前端隐藏了后端的实际数据类型,导致大多数数据都被简化为了String 类型。具体细节可以参考:旧版序列化策略 。然而,这种处理方式并不理想,因为它需要实施许多兼容性措施。我们应当反思,编程语言之所以支持丰富的数据类型,其背后的原因是什么?
在Blade框架中,我们致力于保持简洁性,并遵循编程语言的标准规范。我们进来采用Jackson默认的序列化机制,并尽可能地返回数据的真实类型,但有一些特殊的情况会有一些特定策略。
自定义序列化策略有如下:
针对Long类型的序列化策略:转换为String类型返回前端,避免前端精度丢失
针对时间类型(
Date、LocalDate、LocalDateTime)的序列化策略:转换为时间戳返回前端禁用序列化时将时间戳转为纳秒
禁用反序列化时将时间戳转为纳秒
将null值转换为原生类型处理
其中1、2通过jackson Module的方式进行实现:DiyTimeModule、LongToStringModule 通过@Bean声明
// team.aikero.blade.web.jackson.WebJacksonAutoConfiguration
@Bean
fun diyTimeModule(): DiyTimeModule = DiyTimeModule().also { log.debug { "[web]: diyTimeModule配置生效" } }
@Bean
fun longToStringModule(): LongToStringModule =
LongToStringModule().also { log.debug { "[web]: longToStringModule配置生效" } }时间类型特别说明
警告
- 任何时候时间类型字段统一使用Java8时间类型,JDK8从2014开始就发布了,现在是2024年!不要再使用Date旧的时间类型了!!!!
- 3.0版本后将移除对Date的支持,只支持Java8时间类型
目前对于时间字段(Date、LocalDate、LocalDateTime)的输入与输出支持的格式如下:
