改造不会序列化我的响应类中的第二个对象

Posted

技术标签:

【中文标题】改造不会序列化我的响应类中的第二个对象【英文标题】:Retrofit doesn't serialize second object in my response class 【发布时间】:2020-02-13 19:15:36 【问题描述】:

我的问题是当我使用发布 APK 运行我的应用程序时(启用了 proguard),GSON 不会序列化我的第二个对象。第一个对象已成功序列化。但是,应用程序在调试模式下运行一切正常。

我的应用使用 Retrofit2.6 和 Proguard。 Gradle 版本是 gradle:3.5.1

我来自 WebServer 的 json 数据

 
  "error": false,
  "contents": [
    
      "id": 1,
      "channel": 
        "id": 7,
        "language_id": 1
      ,
      "publisher": 
        "id": 1,
        "name": "Name of Publisher"
      ,
      "title": "Some title",
      "description": "This is description",
      "subscribed": false
    
  ]

这是改造的响应类

public class GetContentsResponse

    @SerializedName("error")
    @Expose
    private boolean mError;

    @SerializedName("contents")
    @Expose
    private List<Content> mContents;



public class Content 

    @SerializedName("id")
    @Expose
    private int mId;

    @SerializedName("channel")
    @Expose
    private Channel mChannel;

    @SerializedName("publisher")
    @Expose
    private Publisher mPublisher;

    @SerializedName("title")
    @Expose
    private String mTitle;

    @SerializedName("description")
    @Expose
    private String mDescription;

    @SerializedName("subscribed")
    @Expose
    private boolean mSubscribed;

    public int getId() 
        return mId;
    

    public Channel getChannel() 
        return mChannel;
    

    public String getTitle() 
        return mTitle;
    

    public String getDescription() 
        return mDescription;
    

    public boolean isSubscribed() 
        return mSubscribed;
    

    public Publisher getPublisher() 
        return mPublisher;
    


这是我的proguard规则

-dontwarn javax.annotation.**
-keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase
-dontwarn org.codehaus.mojo.animal_sniffer.*
-dontwarn okhttp3.internal.platform.ConscryptPlatform
-keepattributes *Annotation*

在调试模式(proguard 禁用)时,Publisher 对象正在解析。发布 APK 运行时发布者对象为空(启用 proguard)。

我真的非常研究这个问题。但我不明白问题是什么?有人可以帮忙吗?

编辑:我现在将所有模型类都保留在 Proguard 规则中,但这里有一个神秘的错误。我找不到它。为什么 Channel 对象序列化了,而 Publisher 对象没有序列化?

【问题讨论】:

【参考方案1】:

在你的proguard中添加这个

-keep public class com.package.name.models.** *;

注意:- com.package.name.models - 这是您的 POJO 类所在的包名称。

就是这样。

【讨论】:

如果没有其他答案,我将其标记为正确答案。我只是好奇。通道对象已序列化,但 Publisher 对象未序列化。 该死,你真是个天才,Retrofit 正在删除发布版本中的序列化类,但正在调试模式下工作。你的解决方案很有魅力

以上是关于改造不会序列化我的响应类中的第二个对象的主要内容,如果未能解决你的问题,请参考以下文章

改造 1.9 原始响应无法在成功回调中处理

在改造android中使用简单的xml转换器反序列化html转义字符

使用jackson从改造中反序列化json,其中相同的变量名可以代表两个不同的对象

Java实现对象的序列化

序列化程序中的格式验证错误

使用 Java 可序列化保存第二个对象的数组