解决 Spring Boot 在 JDK8 中 LocalDateTime (反)序列化问题

本文介绍Java 8中LocalDateTime默认不支持的问题,如何通过添加com.fasterxml.jackson.datatype:jackson-datatype-jsr310依赖并配置序列化器和反序列化器来解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题复现

Java 8 date/time type `java.time.LocalDateTime` not supported by default:
 add Module "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" to enable handling....

在默认情况下Java 8不支持LocalDateTime需要添加com.fasterxml.jackson.datatype:jackson-datatype-jsr310依赖

原因:没有添加序列化和反序列化器

解决方案

添加依赖

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    <version>2.13.0</version>
</dependency>

指定LocalDateTime的序列化以及反序列化器

@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@JsonSerialize(using = LocalDateTimeSerializer.class)

例如:

事例代码

### Spring Boot 中实现字节数组的序列化序列化 在处理Spring Boot应用程序中的对象持久性和网络传输时,经常需要将Java对象转换为字节流以便存储或发送,并能够从这些字节流重新创建原始的对象实例。对于`SerializationFailedException`错误消息表明存在无法完成序列化的状况[^1]。 当遇到此类问题时,可以考虑调整使用的序列化器来匹配数据源的实际编码形式。例如,在Redis缓存场景下,默认情况下可能采用的是JDK自带的方式来进行序列化操作;如果目标对象未遵循特定规则(比如缺少无参构造函数或是继承自非可序列化父类),则可能导致失败[^2]。 为了确保Kotlin定义下的实体能被正确地序列化/序列化到Redis中,除了要让该类实现了`java.io.Serializable`接口外,还需要注意一些细节: - 如果是非data class类型的普通class,则需加上`open`修饰符; - 对于通过主构造器声明属性的情况,应给定默认值以满足编译需求[^3]。 下面给出一段简单的例子展示怎样编写支持上述特性的Book实体以及相应的测试用例验证其功能正常工作: ```kotlin import java.io.* import org.springframework.data.annotation.Id import org.springframework.data.redis.core.RedisHash @RedisHash("books") open class Book : Serializable { @Id var id: Int? = null var name: String = "" get() = field.trim() var price: Double = 0.0 companion object { private const val serialVersionUID = 1L fun serialize(book: Book): ByteArray = ByteArrayOutputStream().use { bos -> ObjectOutputStream(bos).writeObject(book) bos.toByteArray() } inline fun <reified T> deserialize(bytes: ByteArray): T = ByteArrayInputStream(bytes).use { bis -> ObjectInputStream(bis).readObject() as T } } } fun main(args: Array<String>) { // 创建一个新的书籍记录 val book = Book().apply { this.id = 1 this.name = "Effective Java" this.price = 49.99 } println("Original Book: $book") // 序列化过程 val serializedData = Book.serialize(book) // 序列化过程 try { val restoredBook = Book.deserialize<Book>(serializedData) println("Restored Book after Deserialization: ${restoredBook}") } catch (e: Exception) { e.printStackTrace() } } ``` 这段程序展示了如何利用标准库提供的工具类手动执行序列化序列化流程。需要注意的是,在实际应用环境中应当谨慎评估性能影响并采取适当措施保护敏感信息的安全性。此外,考虑到跨版本兼容性等问题,建议优先选用JSON或其他轻量级格式作为交换媒介而非依赖于平台特有的二进制表示法[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

人人都在发奋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值