我开发了一个存储来自设备的数据的小应用程序:我选择以 Json 格式存储数据,数据的序列化/反序列化工作得很好,即使它涉及我创建的一些自定义类型......但只有我在IDE(Eclipse,就此而言)中工作。
但是当我导出一个可运行的 jar 时,数据的反序列化遇到了某种问题,因为软件总是抛出这个异常:
Caused by: java.lang.UnsupportedOperationException: Cannot allocate class LocalDateTime
at com.google.gson.internal.UnsafeAllocator$4.newInstance(UnsafeAllocator.java:104)
at com.google.gson.internal.ConstructorConstructor$14.construct(ConstructorConstructor.java:225)
... 88 common frames omitted
Run Code Online (Sandbox Code Playgroud)
我以为我会遇到自定义类型的问题,而不是内置类型。此时,我发现了两件事:
在这一点上,我想我可以简单地为导致问题的每种数据类型添加一个反序列化器,但我想知道为什么这个问题不会在完整的 JRE 中发生,以及为什么较小的 JRE 会导致这个问题,即使所有模块必需的都包括在内。也许值得一提的是,我没有向保存数据的 Gson 对象添加自定义序列化程序,它全部按照 GSON 默认进行序列化。
LocalDateTime 解串器:
@Override
public LocalDateTime deserialize(JsonElement json, java.lang.reflect.Type type,
JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {
JsonObject joDate = json.getAsJsonObject().get("date").getAsJsonObject();
JsonObject joTime = json.getAsJsonObject().get("time").getAsJsonObject();
//JSON example: {"date":{"year":2019,"month":1,"day":9},"time":{"hour":6,"minute":14,"second":1,"nano":0}
return LocalDateTime.of(joDate.get("year").getAsInt(),
joDate.get("month").getAsInt(), …Run Code Online (Sandbox Code Playgroud)