java.time.LocalDate 序列化时不记录类型
- Dominant language
- Java
- Stars
- 4.4k
- Forks
- 613
- Avg merge
- 1d 22h
- Merged PRs (30d)
- 6
Description
**问题描述**
项目用到redis缓存,在缓存序列化和反序列化用fastjson2 2.0.37版本,但发现如果只java.time.LocalDate\java.time.LocalDateTime 进行序列化后再反序列化时不能还原他的类型(jackjson也这样),但java.util.Date序列化后再反序列化可以还原类型;在进行序列化时已开启Feature.WriteClassName
**环境信息**
OS信息: [mac os]
JDK信息: [jdk1.8]
版本信息:[Fastjson2 2.0.37]
**重现步骤**
```
FastJson2RedisSerializer fastJson2RedisSerializer = new FastJson2RedisSerializer(Object.class);
byte[] serializea = fastJson2RedisSerializer.serialize(LocalDate.now());
byte[] serializeb = fastJson2RedisSerializer.serialize(LocalDateTime.now());
byte[] serializec = fastJson2RedisSerializer.serialize(new Date());
byte[] serialized = fastJson2RedisSerializer.serialize(employeeArchive);
System.out.println(new String(serializea));
System.out.println(new String(serializeb));
System.out.println(new String(serializec));
System.out.println(new String(serialized));
Object deserializea = fastJson2RedisSerializer.deserialize(serializea);
Object deserializeb = fastJson2RedisSerializer.deserialize(serializeb);
Object deserializec = fastJson2RedisSerializer.deserialize(serializec);
Object deserialized = fastJson2RedisSerializer.deserialize(serialized);
System.out.println("===============================")
System.out.println(deserializea + "~" + deserializea.getClass());
System.out.println(deserializeb + "~" + deserializeb.getClass());
System.out.println(deserializec + "~" + deserializec.getClass());
System.out.println(deserialized + "~" + deserialized.getClass());
```
执行结果如下
```
"2024-05-10" // 为什么LocalDate 序列化时不{"@type"记录他的类型
"2024-05-10 20:53:35.739"
new Date(1715345615741)
{"@type":"com.kmp.employee.domain.EmployeeArchive","accountId":833525908831866881,"id":661731000883220............}
===============================
2024-05-10~class java.lang.String
2024-05-10 20:53:35.739~class java.lang.String
Fri May 10 20:53:35 CST 2024~class java.util.Date
EmployeeArchive(id=661731000883220480, person=PersonInfo(name=PersonName(name=........)~class com.kmp.employee.domain.EmployeeArchive
```
Contributor guide
Research direction
Start with the FastJson2RedisSerializer serialize/deserialize reproduction described in the issue, using LocalDate, LocalDateTime, Date, and Feature.WriteClassName on JDK 8. Compare fastjson2's Java time handling with the observed output, then verify that deserialization restores the LocalDate and LocalDateTime types without regressing Date or EmployeeArchive handling.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- java, redis
- Domain
- backend, databases
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 45/100