gpt4 book ai didi

java - 反序列化 GSON 中的接口(interface)

转载 作者:搜寻专家 更新时间:2023-10-31 08:04:11 26 4
gpt4 key购买 nike

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

{ 
"player" : {
"position" : { "x" : 300, "y" : 400 },
"scale" : 1,
"rotation" : 0,
"sprite" : {
"frames" : [ {
"fileName" : "data/plane.png"
} ],
"duration" : 1
}
},
"movementDelay" : { "elapsed" : 0, "started" : 0, "delay" : 150 },
"movement" : { "class" : "controller.TopDownGridMovement" }
}

这是包含我要反序列化的 Movement 接口(interface)的类:

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());
}

然后我尝试反序列化包含 Movement 接口(interface)的类:

playerController = gson.fromJson(new FileReader("data/player_data/player_data.json"), PlayerController.class);

但是我得到这个错误:

ERROR:Unable to invoke no-args constructor for interface controller.Movement. Register an InstanceCreator with Gson for this type may fix this problem.

我需要做什么才能让它发挥作用?指定要加载的类的想法来自 Spring 的 bean 配置内容 - 不确定是否有更好的方法。

哦,根据我所做的阅读,我确定我不应该为 Movement 创建一个 InstanceCreator。毕竟,我正在提供自定义反序列化器...

干杯。

最佳答案

验证 controller.TopDownGridMovement 具有无参数构造函数。如果没有,则您不能使用以下方法创建该类的实例:

return (Movement) clazz.newInstance();

关于java - 反序列化 GSON 中的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7856456/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com