我正在尝试使用Google Gson Library序列化一个类。
public class XYZ {
private String name;
private LocalDateTime timeCreated;
}
当我尝试执行return gson.toJson(this.obj);
时出现错误
Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make field private final java.time.LocalDate java.time.LocalDateTime.date accessible: module java.base does not "opens java.time" to unnamed module @1d8bd0de
使用java 18-corretto
我认为谷歌Gson lib有一个问题。
2条答案
按热度按时间lpwwtiir1#
Instant
,不是LocalDateTime
实际上,
LocalDateTime
是错误的类,不适合用于跟踪“创建时”的值。该类缺少时区或UTC偏移量的上下文,因此它不能表示时刻,时间轴上的特定点。LocalDateTime
本质上是不明确的。相反,使用
Instant
类。该类表示从UTC偏移0小时-分钟-秒的时刻。Gson适配器
我不经常使用Gson,所以我可能搞错了,但是...显然Gson仍然不支持 java.time。尽管JSR 310在几年前就被采用了,早在Java 8中。
要解决Gson中的不足,您需要导入一些提供 java.time 类型的库,或者您可以轻松地👉🏾编写自己的适配器。
让我们从一个
Person
类开始。注意两个成员字段
name
和createdAt
是如何标记为private
的,就像您的Question中的字段一样。还要注意这个类是不可变的,有getter但没有setter。Gson仍然能够通过Java Reflection的魔力重新构造这个类的对象。这也是为什么你可以把这个类定义为一个简短的单行record:
public record Person ( String name , Instant createdAt ) {}
.我们为
Instant
类型编写一个适配器。我们对序列化的值使用标准的ISO 8601。这样一个格式化字符串末尾的Z
是+00:00
的缩写,意思是从UTC偏移0小时-分钟-秒。我们写了一个应用程序来展示这些活动。
注意我们是如何为
Instant
类型注册适配器的。运行时:
wztqucjr2#
您可以尝试更改:
收件人:
我已经这样做,在我的情况下,工作很好!