泛型java.time属性的Jackson序列化在Android API 21上不起作用(但在29上起作用)
我正在使用新的Android Studio 4.0 desugaring功能来使用泛型java.time属性的Jackson序列化在Android API 21上不起作用(但在29上起作用),java,android,jackson,Java,Android,Jackson,我正在使用新的Android Studio 4.0 desugaring功能来使用java.time库,直到API 21。可悲的是,我有一个奇怪的错误,我并不真正理解。它发生在序列化具有类型为LocalDate的属性的对象时(这与LocalDateTime相同,我假设它适用于所有java.time类) 据我所知,我可以序列化单个LocalDate对象,我可以序列化具有LocalDate类型属性的对象,但我不能序列化具有LocalDate泛型类型的对象 这是我的测试代码: 公共静态抽象类Where
java.time
库,直到API 21。可悲的是,我有一个奇怪的错误,我并不真正理解。它发生在序列化具有类型为LocalDate
的属性的对象时(这与LocalDateTime
相同,我假设它适用于所有java.time
类)
据我所知,我可以序列化单个LocalDate
对象,我可以序列化具有LocalDate
类型属性的对象,但我不能序列化具有LocalDate
泛型类型的对象
这是我的测试代码:
公共静态抽象类WhereTest{
公共V V;
}
公共静态类T1扩展测试{
}
公共静态类T2{
public LocalDate l=LocalDate.now();
}
ObjectMapper ObjectMapper=new ObjectMapper();
字符串json=objectMapper.writeValueAsString(LocalDate.now());
System.out.println(“--test--json字符串:“+json”);
json=objectMapper.writeValueAsString(新的T2());
System.out.println(“--test--json字符串:“+json”);
json=objectMapper.writeValueAsString(新的T1());
System.out.println(“--test--json字符串:“+json”);
在我的API 29仿真器上,它工作正常,输出如下内容:
--test-- json string: {"chronology":{"calendarType":"iso8601","id":"ISO"},"dayOfMonth":22,"dayOfWeek":"MONDAY","dayOfYear":174,"era":"CE","month":"JUNE","monthValue":6,"year":2020,"leapYear":true}
--test-- json string: {"l":{"chronology":{"calendarType":"iso8601","id":"ISO"},"dayOfMonth":22,"dayOfWeek":"MONDAY","dayOfYear":174,"era":"CE","month":"JUNE","monthValue":6,"year":2020,"leapYear":true}}
--test-- json string: {"v":null}
但是,在我的API 21 emulator上,会发生以下情况:
--test-- json string: {"month":"JUNE","year":2020,"chronology":{"calendarType":"iso8601","id":"ISO"},"dayOfMonth":22,"dayOfWeek":"MONDAY","dayOfYear":174,"era":"CE","monthValue":6,"leapYear":true}
--test-- json string: {"l":{"month":"JUNE","year":2020,"chronology":{"calendarType":"iso8601","id":"ISO"},"dayOfMonth":22,"dayOfWeek":"MONDAY","dayOfYear":174,"era":"CE","monthValue":6,"leapYear":true}}
Shutting down VM
FATAL EXCEPTION: main
Process: ..., PID: 6125
java.lang.RuntimeException: Unable to start activity ComponentInfo{.../....MainActivity}: java.lang.TypeNotPresentException: Type java.time.LocalDateTime not present
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
at android.app.ActivityThread.access$800(ActivityThread.java:144)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5221)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
Caused by: java.lang.TypeNotPresentException: Type java.time.LocalDateTime not present
at libcore.reflect.ParameterizedTypeImpl.getRawType(ParameterizedTypeImpl.java:67)
at libcore.reflect.ParameterizedTypeImpl.getResolvedType(ParameterizedTypeImpl.java:76)
at libcore.reflect.ListOfTypes.resolveTypes(ListOfTypes.java:70)
at libcore.reflect.ListOfTypes.getResolvedTypes(ListOfTypes.java:55)
at libcore.reflect.ParameterizedTypeImpl.getResolvedType(ParameterizedTypeImpl.java:75)
at libcore.reflect.Types.getType(Types.java:56)
at java.lang.Class.getGenericSuperclass(Class.java:1161)
at com.fasterxml.jackson.databind.util.ClassUtil.getGenericSuperclass(ClassUtil.java:1204)
at com.fasterxml.jackson.databind.type.TypeFactory._resolveSuperClass(TypeFactory.java:1416)
at com.fasterxml.jackson.databind.type.TypeFactory._fromClass(TypeFactory.java:1379)
at com.fasterxml.jackson.databind.type.TypeFactory._fromAny(TypeFactory.java:1284)
at com.fasterxml.jackson.databind.type.TypeFactory.constructType(TypeFactory.java:698)
at com.fasterxml.jackson.databind.cfg.MapperConfig.constructType(MapperConfig.java:306)
at com.fasterxml.jackson.databind.SerializerProvider.findValueSerializer(SerializerProvider.java:518)
at com.fasterxml.jackson.databind.SerializerProvider.findTypedValueSerializer(SerializerProvider.java:799)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:308)
at com.fasterxml.jackson.databind.ObjectMapper._configAndWriteValue(ObjectMapper.java:4374)
at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(ObjectMapper.java:3629)
at ....MainActivity.onCreate(MainActivity.java:47)
at android.app.Activity.performCreate(Activity.java:5937)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
at android.app.ActivityThread.access$800(ActivityThread.java:144)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5221)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
Caused by: java.lang.ClassNotFoundException: java.time.LocalDateTime
at java.lang.Class.classForName(Native Method)
at java.lang.Class.forName(Class.java:308)
at libcore.reflect.ParameterizedTypeImpl.getRawType(ParameterizedTypeImpl.java:65)
at libcore.reflect.ParameterizedTypeImpl.getResolvedType(ParameterizedTypeImpl.java:76)
at libcore.reflect.ListOfTypes.resolveTypes(ListOfTypes.java:70)
at libcore.reflect.ListOfTypes.getResolvedTypes(ListOfTypes.java:55)
at libcore.reflect.ParameterizedTypeImpl.getResolvedType(ParameterizedTypeImpl.java:75)
at libcore.reflect.Types.getType(Types.java:56)
at java.lang.Class.getGenericSuperclass(Class.java:1161)
at com.fasterxml.jackson.databind.util.ClassUtil.getGenericSuperclass(ClassUtil.java:1204)
at com.fasterxml.jackson.databind.type.TypeFactory._resolveSuperClass(TypeFactory.java:1416)
at com.fasterxml.jackson.databind.type.TypeFactory._fromClass(TypeFactory.java:1379)
at com.fasterxml.jackson.databind.type.TypeFactory._fromAny(TypeFactory.java:1284)
at com.fasterxml.jackson.databind.type.TypeFactory.constructType(TypeFactory.java:698)
at com.fasterxml.jackson.databind.cfg.MapperConfig.constructType(MapperConfig.java:306)
at com.fasterxml.jackson.databind.SerializerProvider.findValueSerializer(SerializerProvider.java:518)
at com.fasterxml.jackson.databind.SerializerProvider.findTypedValueSerializer(SerializerProvider.java:799)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:308)
at com.fasterxml.jackson.databind.ObjectMapper._configAndWriteValue(ObjectMapper.java:4374)
at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(ObjectMapper.java:3629)
at ....MainActivity.onCreate(MainActivity.java:47)
at android.app.Activity.performCreate(Activity.java:5937)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
at android.app.ActivityThread.access$800(ActivityThread.java:144)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5221)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
Caused by: java.lang.ClassNotFoundException: Didn't find class "java.time.LocalDateTime" on path: DexPathList[[zip file "/data/app/...-1/base.apk"],nativeLibraryDirectories=[/vendor/lib64, /system/lib64]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
at java.lang.Class.classForName(Native Method)
at java.lang.Class.forName(Class.java:308)
at libcore.reflect.ParameterizedTypeImpl.getRawType(ParameterizedTypeImpl.java:65)
at libcore.reflect.ParameterizedTypeImpl.getResolvedType(ParameterizedTypeImpl.java:76)
at libcore.reflect.ListOfTypes.resolveTypes(ListOfTypes.java:70)
at libcore.reflect.ListOfTypes.getResolvedTypes(ListOfTypes.java:55)
at libcore.reflect.ParameterizedTypeImpl.getResolvedType(ParameterizedTypeImpl.java:75)
at libcore.reflect.Types.getType(Types.java:56)
at java.lang.Class.getGenericSuperclass(Class.java:1161)
at com.fasterxml.jackson.databind.util.ClassUtil.getGenericSuperclass(ClassUtil.java:1204)
at com.fasterxml.jackson.databind.type.TypeFactory._resolveSuperClass(TypeFactory.java:1416)
at com.fasterxml.jackson.databind.type.TypeFactory._fromClass(TypeFactory.java:1379)
at com.fasterxml.jackson.databind.type.TypeFactory._fromAny(TypeFactory.java:1284)
at com.fasterxml.jackson.databind.type.TypeFactory.constructType(TypeFactory.java:698)
at com.fasterxml.jackson.databind.cfg.MapperConfig.constructType(MapperConfig.java:306)
at com.fasterxml.jackson.databind.SerializerProvider.findValueSerializer(SerializerProvider.java:518)
at com.fasterxml.jackson.databind.SerializerProvider.findTypedValueSerializer(SerializerProvider.java:799)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:308)
at com.fasterxml.jackson.databind.ObjectMapper._configAndWriteValue(ObjectMapper.java:4374)
at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(ObjectMapper.java:3629)
at ....MainActivity.onCreate(MainActivity.java:47)
at android.app.Activity.performCreate(Activity.java:5937)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
at android.app.ActivityThread.access$800(ActivityThread.java:144)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5221)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
Suppressed: java.lang.ClassNotFoundException: java.time.LocalDateTime
at java.lang.Class.classForName(Native Method)
at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
... 35 more
Caused by: java.lang.NoClassDefFoundError:
my app level build.gradle中的重要部分包括:
compileOptions {
coreLibraryDesugaringEnabled true
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
dependencies {
implementation 'androidx.multidex:multidex:2.0.1'
implementation 'com.fasterxml.jackson.core:jackson-databind:2.11.0'
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.5'
}
在我的项目级build.gradle中:
buildscript {
dependencies {
classpath 'com.android.tools.build:gradle:4.0.0'
}
}
注意(不确定是否需要):在AndroidManifest
中,应用程序具有android:name=“androidx.multidex.MultiDexApplication”