【问题标题】:Why does Gson Preconditions fail in this instance?为什么 Gson Preconditions 在这种情况下会失败?
【发布时间】:2014-06-11 16:37:55
【问题描述】:

我正在为ForeignCollection 类编写一个反序列化器,即abstract,并在ORMLite Android Library 中提供给我。请参阅下面的代码。

public class ForeignCollectionDeserializer implements JsonDeserializer<ForeignCollectionDeserializer> {
    @Override
    public ForeignCollection deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {
        ...
    }
}

我也尝试过实现JsonDeserializer&lt;?&gt;JsonDeserialzer(没有泛型类型)

我正在使用GsonBuilder.registerTypeAdapter 注册解串器。

GsonBuilder gb = new GsonBuilder();

gb.registerTypeAdapter(ForeignCollection.class, new ForeignCollectionDeserializer());
Gson gson = gb.create();

但是,registerTypeAdapter() 正在抛出这个:

06-11 11:27:27.937: E/AndroidRuntime(15197): FATAL EXCEPTION: main
06-11 11:27:27.937: E/AndroidRuntime(15197): Process: com.myapp, PID: 15197
06-11 11:27:27.937: E/AndroidRuntime(15197): java.lang.IllegalArgumentException
06-11 11:27:27.937: E/AndroidRuntime(15197):    at com.google.gson.internal.$Gson$Preconditions.checkArgument($Gson$Preconditions.java:42)
06-11 11:27:27.937: E/AndroidRuntime(15197):    at com.google.gson.GsonBuilder.registerTypeAdapter(GsonBuilder.java:448)

我正在单步执行代码,然后从下面的GsonBuilder 找到有问题的部分。

public GsonBuilder registerTypeAdapter(Type type, Object typeAdapter) {
    $Gson$Preconditions.checkArgument(typeAdapter instanceof JsonSerializer<?>
            || typeAdapter instanceof JsonDeserializer<?>
            || typeAdapter instanceof InstanceCreator<?>
            || typeAdapter instanceof TypeAdapter<?>);
    if (typeAdapter instanceof InstanceCreator<?>) {
        instanceCreators.put(type, (InstanceCreator) typeAdapter);
    }

我在调试模式下评估typeAdapter instanceof JsonDeserializer&lt;?&gt;,发现其实是false

实际上我已经评估了所有这些:

  • typeAdapter instanceof JsonDeserializer
  • typeAdapter instanceof JsonDeserializer&lt;ForeignCollection&gt;
  • typeAdapter instanceof JsonDeserializer&lt;?&gt;

都是假的。

当我将typeAdapter 声明为ForeignCollectionsDeserializer 类型的Object,它实现了JsonDeserializer,这是怎么回事?

【问题讨论】:

    标签: java android deserialization gson ormlite


    【解决方案1】:

    事实证明我有多个不正确的导入。

    我不小心导入了 Gson 的 JsonDeserializer 的另一个库实现,导致代码编译,但 instanceof 条件失败。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-17
      • 1970-01-01
      • 2014-05-31
      • 2021-10-07
      • 1970-01-01
      • 1970-01-01
      • 2021-10-11
      相关资源
      最近更新 更多