【问题标题】:Android: Gson serialization is missing one specific fieldAndroid:Gson 序列化缺少一个特定字段
【发布时间】:2019-12-19 08:55:53
【问题描述】:

这是课

class TransactionDetails {

    @SerializedName("item")
    private String item;
    @SerializedName("itemPrice")
    private double itemPrice;
    @SerializedName("commissions")
    private double commissions;
    @SerializedName("itemCount")
    private double itemCount;
    @SerializedName("when")
    private long when;
    @SerializedName("tax")
    private double tax;

    TransactionDetails(String item, double itemPrice, double commissions, double itemCount, long when, double tax) {
        this.item = item;
        this.itemPrice = itemPrice;
        this.commissions = commissions;
        this.itemCount = itemCount;
        this.when = when;
        this.tax = tax;
    }

    String getItem() {
        return item;
    }

    double getItemPrice() {
        return itemPrice;
    }

    double getCommissions() {
        return commissions;
    }

    double getItemCount() {
        return itemCount;
    }

    long getWhen() {
        return when;
    }

    double getTotalPrice() {
        return itemCount * itemPrice;
    }

    String getWhenStr() {
        return Utils.getInstance().getDateStr(when);
    }

    double getTax() {
        return tax;
    }

}

double getTax() 是我在代码中唯一没有使用的方法,因为我在我的应用程序中没有使用它,所以我看到“从未使用方法 getTax()”虽然我不确定它是相关

这是实例

ArrayList<TransactionDetails> transactionDetailsFull = new ArrayList<>();

这是失败的代码

new Gson().toJson(Utils.getInstance().transactionDetailsFull);

由于某种原因,上面的代码序列化了类的所有字段,除了税。只有在发布模式下才会发生这种情况:

minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'

在调试模式下,它可以工作。请注意,我做了@SerializedName,所以我不明白我遗漏了什么以及导致只有税没有被序列化的原因。

【问题讨论】:

    标签: android serialization gson


    【解决方案1】:

    你是否在 proguard 文件中添加了 Gson 和你的类(TransactionDetails)? 如果不。 尝试像这样更改 proguard 文件:

    # Add the gson class
    -keep public class com.google.gson
    
    # Add any classes the interact with gson
    -keep class yourpackage.TransactionDetails { *; }
    

    【讨论】:

    • 既然你提到了它,问题可能恰恰相反,意味着 proguard 文件中有一些额外的东西。过去我在序列化时遇到了问题,我使用了 proguard 文件,但它没有帮助。只有添加 @serializedName 才能使其工作。也许我当时做了一些现在影响这个问题的事情。
    • 你能发布你的json吗?
    • 我在 proguard 中没有任何与“交易”或“税收”相关的内容。 json 很明显:调试:[{"commissions":5.0,"itemPrice":30.55,"itemCount":30.0,"item":"bottle","tax":15.0,"when":17094}]。发布:[{"commissions":5.0,"itemPrice":30.55,"itemCount":30.0,"item":"bottle", "when":17094}]。只是税没了。
    • 我测试发布版本没有:-keep public class com.google.gson 和 -keep class yourpackage.TransactionDetails { *; } 那么结果是一个像这样的空 json:{ }。但是当我在 proguard-rules.pro 中添加这些行时,结果是带有所有属性和税的 json。
    • 过去我在使用 minify true 序列化类时遇到问题,将这些行添加到 proguard 并没有帮助。只有添加 @serializedName 才能使其工作。现在也一样。添加 -keep public class com.google.gson 和 -keep class mypackage.TransactionDetails { *; } 到 proguard-android-optimize.txt 并没有给序列化加税。一定有什么愚蠢的东西造成了这一切。
    【解决方案2】:

    好吧,显然这部分是错误的:double getTax() 是我在代码中唯一没有使用的方法,因为我在我的应用程序中没有使用它,所以我看到“从未使用方法 getTax()”虽然我不确定它是否相关。我在代码中添加了对 getTax() 的引用,现在 Gson 对其进行序列化...

    可能是一个错误,或者我不明白序列化的工作原理......

    【讨论】:

      猜你喜欢
      • 2017-05-19
      • 1970-01-01
      • 2011-08-18
      • 2011-01-17
      • 1970-01-01
      • 1970-01-01
      • 2011-03-25
      • 2016-06-17
      • 1970-01-01
      相关资源
      最近更新 更多