Lib Gdx json序列化异常并缺少no-arg构造函数

时间:2013-03-07 18:10:14

标签: java serialization libgdx filehandle

尝试执行这段代码时:

public void load(String filename) { 
   FileHandle file = Gdx.files.external(filename + ".bim");
   Json json = new Json();      
   String text = file.readString();
   datamap.clear(); 
   datamap = json.fromJson(HashMap.class, text);

我收到错误:

  

线程“LWJGL应用程序”中的异常   com.badlogic.gdx.utils.GdxRuntimeException:   com.badlogic.gdx.utils.SerializationException:无法创建类   (缺少no-arg构造函数):com.bvo.easyBim.Model.Cursor at   com.badlogic.gdx.backends.lwjgl.LwjglApplication $ 1.run(LwjglApplication.java:113)   引起:com.badlogic.gdx.utils.SerializationException:类不能   被创建(缺少no-arg构造函数):com.bvo.easyBim.Model.Cursor     在com.badlogic.gdx.utils.Json.newInstance(Json.java:915)at   com.badlogic.gdx.utils.Json.readValue(Json.java:793)at at   com.badlogic.gdx.utils.Json.readValue(Json.java:803)at at   com.badlogic.gdx.utils.Json.fromJson(Json.java:644)at   com.bvo.easyBim.View.DataProcessor.load(DataProcessor.java:85)at   com.bvo.easyBim.View.World.init(World.java:115)at   com.bvo.easyBim.View.WorldRenderer.buttons(WorldRenderer.java:173)at at   com.bvo.easyBim.View.WorldRenderer.render(WorldRenderer.java:106)at at   com.bvo.easyBim.Screens.AppScreen.render(AppScreen.java:22)at   com.badlogic.gdx.Game.render(Game.java:46)at   com.bvo.easyBim.EasyBim.render(EasyBim.java:39)at   com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:187)     在   com.badlogic.gdx.backends.lwjgl.LwjglApplication $ 1.run(LwjglApplication.java:110)   引起:java.lang.InstantiationException:   java.lang.Class.newInstance0中的com.bvo.easyBim.Model.Cursor(未知   来自)java.lang.Class.newInstance(未知来源)at   com.badlogic.gdx.utils.Json.newInstance(Json.java:901)... 12更多

我正在尝试将json文件在正确保存在另一段代码中之后转换回数据图。 (一个hashmap),但这似乎不起作用。

我猜他无法读取文字字符串,但实际上我不知道问题是什么。

1 个答案:

答案 0 :(得分:6)

异常消息“无法创建类(缺少无参数构造函数):com.bvo.easyBim.Model.Cursor”确切地描述了出错的地方。

Libgdx JSON代码使用反射来创建对象的实例并初始化它们。在您的示例中,保存的JSON文件中必须有com.bvo.easyBim.Model.Cursor。因此,在读取该文件时,JSON代码需要创建一个Cursor的实例来放入数据。它假定有一个无参构造函数可以用来创建一个空Cursor(它不能确定哪个构造函数适合否则)。但是,似乎没有这样的方法。

您必须向Cursor添加无参数构造函数,否则您将需要添加知道如何保存Cursor实例的自定义序列化程序(请参阅https://code.google.com/p/libgdx/wiki/JsonParsing#Customizing_serialization)并且知道在阅读Cursor时要调用的适当构造函数。