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

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

我也试过实现 JsonDeserializer<?>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);
    }

我在 Debug模式下评估了typeAdapter instanceof JsonDeserializer<?>,发现它实际上是false
其实我已经评估了所有这些:
  • typeAdapter instanceof JsonDeserializer
  • typeAdapter instanceof JsonDeserializer<ForeignCollection>
  • typeAdapter instanceof JsonDeserializer<?>

  • 他们都是假的。

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

    最佳答案

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

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

    smh

    关于java - 为什么 Gson Preconditions 在这种情况下会失败?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24168154/

    10-11 16:59