我想保存一个Mission.class
数组,其变量如下:
public class Mission {
public MissionEnum missionEnum;
public int progress;
public Mission(MissionEnum missionEnum, int progress) {
this.missionEnum = missionEnum;
this.progress = progress;
}
并且还在另一个java类中保存任务:
public void saveMissions() {
Json json = new Json();
json.setOutputType(JsonWriter.OutputType.json);
json.addClassTag("Mission", Mission.class);
FileHandle missionFile = Gdx.files.local("missions_array.json");
missionFile.writeString(json.prettyPrint(missions), false);
}
并加载任务:
public void loadMissions() {
if (Gdx.files.local("missions_array.json").exists()) {
try {
FileHandle file = Gdx.files.local("missions_array.json");
Json json = new Json();
json.addClassTag("Mission", Mission.class);
missions = json.fromJson(Array.class, Mission.class, file);
for (Mission mission : missions) {
Gdx.app.log(TAG, "Mission loaded: " + mission.missionEnum);
}
Gdx.app.log(TAG, "Load missions successful");
} catch (Exception e) {
Gdx.app.error(TAG, "Unable to read Missions: " + e.getMessage());
}
}
}
我这样得到了json:
[
{
"class": "Mission",
"missionEnum": "BUY_POWERUP"
},
{
"class": "Mission",
"missionEnum": "DISTANCE_ONE_RUN_2"
},
{
"class": "Mission",
"missionEnum": "BANANA_TOTAL_2",
"progress": 35
}
]
但是,当loadMissions()
运行时,我显示了"Load missions successful"
日志,但"Mission loaded..."
没有显示任何错误日志。任务似乎没有正确加载。我不知道出了什么问题,因为另一个数组以相同的方式成功加载。
答案 0 :(得分:1)
更新回复:
您必须向(Mission)添加无参数构造函数,或者 您将不得不添加自定义序列化程序(请参阅 https://code.google.com/p/libgdx/wiki/JsonParsing#Customizing_serialization) 知道如何保存(任务)实例并知道适当的 重新读取(任务)时调用的构造函数。
public Mission() {
// Do nothing.
}
实现Json.Serializable的类必须具有零参数 构造函数,因为对象构造是为您完成的。
或者删除未使用的构造函数。我认为Enigo的回答也是正确的,所以我要回答他的回答。
Providing Constructors for Your Classes
你不必为你的班级提供任何建设者,但是你 这样做时一定要小心。编译器自动提供 no-argument,任何类没有构造函数的默认构造函数。 这个默认构造函数将调用的无参数构造函数 超类。在这种情况下,编译器会抱怨如果 超类没有无参数构造函数,所以你必须验证 它确实如此。如果你的类没有明确的超类,那么它有一个 Object的隐式超类,它有一个无参数 构造
注意:我没有测试我们的回复,我在过去两年没有开发游戏或使用过libgdx。
另请阅读此libgdx问题:Json - constructor default value with Enum:
我不知道这是否会被称为错误,但我有一个案例 有这样的枚举;
然后我有一个包含2个构造函数的类;
第二个由我的框架调用,第一个由Json调用 反序列化。
...
之前的回复:
我猜想某些Mission类中缺少的进度字段可能是问题的根源,但读取错误日志肯定会很有趣。
答案 1 :(得分:1)
不确定为什么日志中没有错误,因为在复制问题时我有例外。
问题出在loadMissions()
方法:你创建新的Json解析器而不设置类标记:
Json json = new Json();
// add the line below
json.addClassTag("Mission", Mission.class);
missions = json.fromJson(Array.class, Mission.class, file);
....
如果没有标记解析器,则不知道json文件中的"class": "Mission"
是什么。
<强>更新强>
可能导致此问题的另一件事是args构造函数。至少,当我添加它时,我得到了一个例外。如果你不使用它 - 只需删除。 仍然,非常奇怪的是,你肯定没有log'cos中的任何例外。