簡體   English   中英

為什么 Kryo 在序列化對象時給我這個錯誤?

[英]Why Kryo gives me that error when serializing object?

我正在嘗試在我的 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.esotericsoftware.kryo.serializers.ReflectField.write(ReflectField.java:71) 在 com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:108) 在 com.esotericsoftware.kryo.Kryo.writeObject(Kryo .java:575) 在 com.esotericsoftware.kryo.serializers.ReflectField.write(ReflectField.java:71) 在 com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:108) 在 com.esotericsoftware.kryo。 Kryo.writeClassAndObject(Kryo.java:644) 在 com.esotericsoftware.kryo.serializers.DefaultArraySerializers$ObjectArraySerializer.write(DefaultArraySerializers.java:362) 在 com.esotericsoftware.kryo.serializers.DefaultArraySerializers.javaDefaultArraySerializer.write( 326)

控制台中未報告任何異常。 它看起來像stackoverflow,但是我不知道導致錯誤的原因。 我增加了虛擬機堆棧大小 -Xss300m 但它沒有解決問題。 任何想法我做錯了什么?

我找到了解決方案。 我無法獲得完整的錯誤消息。 所以我設置了 vm arg -XX:MaxJavaStackTraceDepth=200000000 來顯示完整的跟蹤。 某些課程未在 Kryo 中注冊。 我注冊了缺失的類,寫操作成功。 我在讀取寫入的文件時遇到了類似的問題,但這次錯誤信息在少數情況下已滿。 缺少非參數構造函數。 在錯誤消息未滿的情況下,我在調試模式下運行游戲並導致崩潰以在 LwjglApplication.initialize() 方法中引發斷點命中。 在那里我調查了 KryoException.trace 領域。 還缺少非 args 構造函數。 我不確定為什么控制台中的錯誤消息不完整,但我猜是對許多對象的太多引用導致了這個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM