为什么Kryo在序列化对象时给我那个错误



我正在尝试在我的Libgdx游戏中创建保存/加载游戏机制。我在用Kryo写对象。对象图是非常大和复杂的。我不会发布整个代码,因为它太多了。它包含许多ArrayList。对其他对象有许多引用的对象。许多字段被transient关键字排除在序列化之外,因为它们包含Textures、Pixmap等。SaveGame类:

package save_game;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.io.Output;
import data.GameDataBase;
public class SaveGame {
private GameDataBase gameDB;
private Kryo kryo;
private KryoUtil kryoUtil;
public SaveGame(GameDataBase gameDB) {
this.gameDB = gameDB;
kryoUtil = new KryoUtil();
kryo = kryoUtil.getKryo();
}

public void save() throws FileNotFoundException {
kryo.setReferences(true);
Output output = new Output(new FileOutputStream("testfile"));
kryo.writeClassAndObject(output, gameDB);
output.close();
}
}

当运行方法save时,我得到一条错误消息,它重复出现并填充整个控制台:

com.密宗软件.kryo.serializers.ReflectField.write(ReflectField.java:71(网址:com.mystericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:108(网址:com.密宗软件.kryo.kryo.writeObject(kryo.java:575(在com.密宗软件.kyo.serializers.ReflectField.write(ReflectField.java:71(网址:com.mystericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:108(网址:com.mystericsoftware.kryo.kryo.writeClassAndObject(kryo.java:644(网址:com.mystericsoftware.kryo.serializers.DefaultArraySerializers$ObjectArraySerilizer.write(DefaultArraySerializers.java:362(网址:com.mystericsoftware.kryo.serializers.DefaultArraySerializers$ObjectArraySerilizer.write(DefaultArraySerializers.java:326(

控制台中未报告任何异常。它看起来像stackoverflow,但我不知道是什么原因导致了错误。我增加了vm堆栈大小-Xs300m,但它并没有解决这个问题。你知道我做错了什么吗?

我找到了解决方案。我无法获得完整的错误消息。因此,我设置了vm arg-XX:MaxJavaStackTraceDepth=200000000来显示完整的跟踪。有些课程没有在Kryo注册。我注册了丢失的类,写入操作成功。我在阅读书面文件时也遇到了类似的问题,但这次的错误消息在少数情况下是满的。缺少非args构造函数。在错误消息未满的情况下,我在调试模式下运行了游戏,并导致崩溃,从而在LwjglApplication.initialize((方法中引发断点命中。在那里我调查了字段KryoException.trace。也缺少非args构造函数。我不知道为什么控制台中的错误消息不完整,但我猜是对许多对象的过多引用导致了这种情况,而这些对象又引用了其他对象。

相关内容

最新更新