alibaba / alibaba/fastjson2

java.time.LocalDate 序列化时不记录类型

Open
#2,557 1 comment 0 reactions 0 assignees View on GitHub
enhancement question
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

Open the contributing 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.