android - Gson 不会反序列化从未使用过的字段

标签 android serialization gson unused-variables

现状
我有一个模型,其中 UserSettingModel 类有两个字段:long UserId 并具有一个名为 Settings 的类 UserSettings 示例(具有许多字段)。

警告:我的代码中没有直接使用这些字段(在 Android Studio 中,此字段的颜色为灰色),但我需要将其重新发送到服务器。

public class UserSettingsModel
{
    @SerializedName("UserId")
    public long UserId = -1L;

    @SerializedName("Settings")
    public UserSettings Settings;

}//end of class/ UserSettingsModel

class UserSettings
{
    @SerializedName("showRegion")
    public String showRegion = "";

    @SerializedName("showAddress")
    public String showAddress = "";
}

问题
如果在 Debug模式下使用 apk:GSON 反序列化 UserSettingModel 类的所有字段,包括设置

如果在 RELEASE 模式下使用 apk:字段设置 - 不反序列化

我的前卫:
-keepattributes Signature
-keepattributes *Annotation*
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.stream.** { *; }
-keep class com.google.gson.examples.android.model.** { *; }
-keep class com.google.gson.** { *; }
-keepclassmembers enum * { *; }
-keep class * implements com.google.gson.TypeAdapterFactory
-keep class * implements com.google.gson.JsonSerializer
-keep class * implements com.google.gson.JsonDeserializer

我需要什么
如何在 Release模式下使用 GSON 序列化/反序列化所有类的字段,同时警告“字段从未使用”?

最佳答案

这是因为混淆,正如 DQuade 在评论中所说的那样。
要防止 gradle 删除它们,您可以在 proguard-rules.pro 文件中添加特定类:

-keepclassmembers class [yourPackageName].UserSettingsModel
-keepclassmembers class [yourPackageName].UserSettings
或阻止 gradle 删除所有带有 SerializedName 注释的成员注解:
-keepclassmembers class * {
  @com.google.gson.annotations.SerializedName <fields>;
}

关于android - Gson 不会反序列化从未使用过的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45983696/

相关文章:

java - 在 java : automatic thread-safety? 中序列化

java - 在这种情况下如何为 GSON 指定通用类型

java - 如何使用 GSON 保留 JSON 对象中特定键的数据类型?

java - 你为什么要把那些无效的 child 还给我?

android - 没有发现类定义错误 (android)

Android ListView如何禁用多点击

Android什么时候保存大数据?

Android - Material.io - TextInputLayout 在 LinearLayout 中不起作用

asp.net - 如何从 ASP.NET Web 服务实现自定义 JSON 序列化?

ios - 在 Swift 中用数组序列化我自己的对象的更优雅的方法是什么