首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jackson + ProGuard:不能反序列化使用自定义反序列化器的类

Jackson + ProGuard:不能反序列化使用自定义反序列化器的类
EN

Stack Overflow用户
提问于 2016-03-08 20:38:00
回答 1查看 2.2K关注 0票数 3

我的应用程序使用杰克逊。我得到了最小化的构建,主要是使用这种配置:

代码语言:javascript
复制
# don't obfuscate Jackson classes
-keep class com.fasterxml.** { *; }

# don't strip runtime annotations
-keepattributes RuntimeVisibleAnnotations

# keep members with Jackson annotations
-keepclassmembers public class * {
     @com.fasterxml.jackson.annotation.JsonCreator *;
     @com.fasterxml.jackson.annotation.JsonProperty *;
}

但是最小化的构建仍然无法反序列化使用自定义反序列化器的类,而后者又使用工厂。工厂、反序列化器和映射器都是由Dagger2生产的。错误是:

代码语言:javascript
复制
com.fasterxml.jackson.databind.JsonMappingException: No suitable constructor found for type [simple type, class com.mycompany.myapp.c.y]: can not instantiate from JSON object (missing default constructor or creator, or perhaps need to add/enable type information?)
            at [Source: N/A; line: -1, column: -1]
            at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(Unknown Source)
            at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(Unknown Source)
            at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(Unknown Source)
            at com.fasterxml.jackson.databind.ObjectMapper._readValue(Unknown Source)
            at com.fasterxml.jackson.databind.ObjectMapper.readValue(Unknown Source)
            at com.fasterxml.jackson.databind.ObjectMapper.treeToValue(Unknown Source)
            at com.mycompany.myapp.c.x.a(Unknown Source)
            at com.mycompany.myapp.c.x.a(Unknown Source)
            at com.mycompany.myapp.c.x.deserialize(Unknown Source)
            at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(Unknown Source)
            at com.fasterxml.jackson.databind.ObjectMapper.readValue(Unknown Source)
            at com.mycompany.myapp.c.ag.d(Unknown Source)
            at com.mycompany.myapp.c.ag.a(Unknown Source)
            at com.mycompany.myapp.c.at.run(Unknown Source)
            at android.os.Handler.handleCallback(Handler.java:605)
            at android.os.Handler.dispatchMessage(Handler.java:92)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:4508)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:809)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:576)
            at dalvik.system.NativeStart.main(Native Method)

错误消息表明,我的类缺乏默认构造函数,这实际上是因为实例是由使用工厂的自定义反序列化程序创建的。当我禁用ProGuard时,这很好。要使它与ProGuard一起工作,我需要做些什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-08 23:04:20

我意外地发现了这种方便的故障排除技术:

代码语言:javascript
复制
-keepnames class * { *; }

这揭示了真正的罪魁祸首是我的自定义反序列化器中的私有静态嵌套类。解决方案是从这个选项的类说明符中删除public

代码语言:javascript
复制
-keepclassmembers class * {
     @com.fasterxml.jackson.annotation.JsonCreator *;
     @com.fasterxml.jackson.annotation.JsonProperty *;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35877540

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档