Gson десериализует json, когда у класса есть абстрактное поле throwjava.lang.RuntimeException: невозможно вызвать конструктор без аргументов для - PullRequest
0 голосов
/ 18 декабря 2018
public class JsonSerializableTest {
protected static transient RuntimeTypeAdapterFactory<JsonSerializable> adapterFactory =
        RuntimeTypeAdapterFactory.of(JsonSerializable.class,"clazz")
        .registerSubtype(A.class,A.class.getName())
        .registerSubtype(B.class,B.class.getName())
        .registerSubtype(C.class,C.class.getName());
protected static transient Gson gson = new GsonBuilder().registerTypeAdapterFactory(adapterFactory).create();
protected static transient Type typeToken = new TypeToken<JsonSerializable>() {}.getType();
@Test
public void fromJson(){
    C c = new C();
    c = gson.fromJson(gson.toJson(c),typeToken);
    LogbackReporter.log(gson.toJson(c));

}

private abstract class A extends JsonSerializable{
    public A(){}
}

private class B extends A{
}

private class C extends JsonSerializable{
    public A a1 = new B();
    public A a2 = new B();
}

}

java.lang.RuntimeException: Unable to invoke no-args constructor for class com.tingyun.tads.api.JsonSerializableTest$A. Registering an InstanceCreator with Gson for this type may fix this problem.

Вы можете скачать RuntimeTypeAdapterFactory с git-адреса gson.Оно не будет включено в гуаву.

Если я удалю абстрактное ключевое слово, оно будет работать, но я хочу сохранить его.

Может ли кто-нибудь мне помочь?

...