Java 在GSON中反序列化接口

Java 在GSON中反序列化接口,java,json,class,interface,gson,Java,Json,Class,Interface,Gson,对于这个问题我想不出更好的措辞,但基本上我想在GSON中存储一个具体类的名称(请参阅“movement”): 这是包含我要反序列化的移动接口的类: public class PlayerController { private Player player; private DelayTimer movementDelay; private Movement movement; public PlayerController() { } [...

对于这个问题我想不出更好的措辞,但基本上我想在GSON中存储一个具体类的名称(请参阅“movement”):

这是包含我要反序列化的移动接口的类:

public class PlayerController {
    private Player player;
    private DelayTimer movementDelay;
    private Movement movement;

    public PlayerController() {
    }

    [...]
}
我编写了一个自定义反序列化程序:

package gson;

import java.lang.reflect.Type;

import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;

import controller.Movement;

public class MovementDeserialiser implements JsonDeserializer<Movement> {

    @Override
    public Movement deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
            throws JsonParseException {
        try {
            JsonObject obj = (JsonObject) json;
            Class clazz = Class.forName(obj.get("class").getAsString());
            return (Movement) clazz.newInstance();
        } catch (Exception e) {
            throw new JsonParseException(e.getMessage());
        }
    }

}
public void registerAdapters(GsonBuilder gsonBuilder) {
    gsonBuilder.registerTypeAdapter(Image.class, new ImageDeserialiser());
    gsonBuilder.registerTypeAdapter(Button.class, new ButtonDeserialiser());
    gsonBuilder.registerTypeAdapter(Animation.class, new AnimationDeserialiser());
    gsonBuilder.registerTypeAdapter(Movement.class, new MovementDeserialiser());
}
然后我尝试反序列化包含移动接口的类:

playerController = gson.fromJson(new FileReader("data/player_data/player_data.json"), PlayerController.class);
但我得到了这个错误:

错误:无法为interface controller.Movement调用无参数构造函数。为此类型向Gson注册InstanceCreator可能会解决此问题

我需要做些什么才能让它工作?指定要加载的类的想法来自Spring的bean配置东西——不确定是否有更好的方法

哦,从我所做的阅读中,我决定我不应该为运动创建InstanceCreator。我提供了一个自定义反序列化程序,毕竟


干杯。

验证
控制器。TopDownGridMovement
具有无参数构造函数。如果没有,则无法使用以下命令创建类的实例:

return (Movement) clazz.newInstance();

啊。。。我以前在需要的地方创建了一个新的Gson实例,但最近创建了一个GsonInstance单例,我向它注册了自定义序列化程序。正在从中反序列化移动对象的Gson对象不是GsonInstance对象,因此我猜Gson不知道如何序列化它。愚蠢的错误


tl;dr:我没有向我正在使用的特定Gson实例注册自定义序列化程序

是的,它实现了:公共类TopDownGridMovement实现了移动{public TopDownGridMovement(){}
return (Movement) clazz.newInstance();