【问题标题】:serialVersionUID added to JSONserialVersionUID 添加到 JSON
【发布时间】:2017-09-14 01:00:00
【问题描述】:

我正在使用 com.google.code.gson:gson:2.2.4 库通过代码将对象转换为 JSON:

String json = new GsonBuilder().excludeFieldsWithModifiers(Modifier.PROTECTED).create().toJson(object);

在 JSON 字符串中,“serialVersionUID”会自动添加Long 值,即使它不在模型类中。我只想从 JSON 中删除 serialVersionUID

【问题讨论】:

  • serialVersionUID 必须是 static
  • 但我的班级没有 serialVersionUID 字段。
  • 那么你的类继承了一个具有非静态serialVersionUID 字段的类。您可以修改基类并使该字段保持应有的静态吗?
  • 当我使用 new Gson().toJson(object) 时,它不会在 JSON 中添加 serialVersionUID。
  • 啊,抱歉我错了 Gson 配置。您只需将修饰符掩码更改为Modifier.PROTECTED | Modifier.STATIC。 (我从未考虑过(反)序列化静态字段,也从未使用非标准排除修饰符)。

标签: android json gson serialversionuid


【解决方案1】:

我找到了this 的答案。基本上,serialVersionUID 是由 InstantRun 添加的,禁用 InstantRun 为我解决了这个问题。

【讨论】:

    【解决方案2】:

    解决此问题的一种方法是使用GsonBuilder.excludeFieldsWithoutExposeAnnotation,然后使用@Expose 注释来明确标记什么是(反)序列化的。

    public class SomeClass {
        private int field1 = 2;
        @Expose private int field2 = 6;
        @Expose @SerializedName ("foo") private int field3 = 12;
    }
    

    给你{"field2":6, "foo":12}。字段 field1 被排除在外,因为它没有用 @Expose 注释。

    就个人而言,我总是使用GsonBuilder.excludeFieldsWithoutExposeAnnotation,因为它会过滤掉任何生成的字段(例如上面的Instant Run 评论)。如果你没有用@Expose注解它,它就不会被序列化/反序列化。

    另一种方法是将字段声明为transient

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-17
      • 2017-06-01
      • 2022-01-18
      • 2017-11-12
      相关资源
      最近更新 更多