Java 在GSON中反序列化接口
对于这个问题我想不出更好的措辞,但基本上我想在GSON中存储一个具体类的名称(请参阅“movement”): 这是包含我要反序列化的移动接口的类: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() { } [...
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();