2016-07-05 8 views
1

Momentan arbeite ich an dem Datenspar- (und Lade-) Teil meines Spiels, benutze LibGDX's JSON Ausgabedatei Schreibklassen. Ich habe überall in Google versucht, eine Lösung zu finden, und bin nah dran, aber keine Zigarre. Bisher habe ich bei dem Versuch, eine Array<Object> in einer Datei zu speichern gelungen, aber wenn ich versuche, die Daten aus der Datei zu lesen/laden, erhalte ich die folgende Ausnahme:LibGDX SerializationException verursacht durch Feld nicht gefunden

com.badlogic.gdx.utils.SerializationException: Error reading file: cards.json 
    at com.badlogic.gdx.utils.Json.fromJson(Json.java:705) 
    at com.towersvault.unbalanced.util.save.SaveHandler.loadCards(SaveHandler.java:91) 
    at com.towersvault.unbalanced.util.save.SaveHandler.load(SaveHandler.java:51) 
    at com.towersvault.unbalanced.UnbalancedMain.create(UnbalancedMain.java:28) 
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:147) 
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:124) 
Caused by: com.badlogic.gdx.utils.SerializationException: Field not found: cards (com.badlogic.gdx.utils.Array) 
Serialization trace: 
{}.cards 
    at com.badlogic.gdx.utils.Json.readFields(Json.java:790) 
    at com.badlogic.gdx.utils.Json.readValue(Json.java:919) 
    at com.badlogic.gdx.utils.Json.fromJson(Json.java:703) 
    ... 5 more 

Meine JSON-Datei wie folgt aussieht:

{ 
"cards": [ 
    { 
     "card": "ID_3", 
     "temper": "LAZY" 
    }, 
    { 
     "card": "ID_2", 
     "temper": "LAZY" 
    }, 
    { 
     "card": "ID_1", 
     "temper": "LAZY" 
    }, 
    { 
     "card": "ID_1", 
     "temper": "LAZY" 
    } 
] 
} 

Mein Quellcode für das Ladeverfahren sieht wie folgt aus:

Array<CardData> loadedCards = json.fromJson(Array.class, CardData.class, Gdx.files.local("cards.json"); 

die CardData Klasse hat zwei Variablen, nämlich private Card card; (typi es aus, die Variable ist eine enum, die ich für die Instanz jeder Karte), und private CardTemper temper; (auch eine enum, die das gleiche wie die andere). Es wird Instanzen der Karten geben müssen, weil sie alle nicht gleich sind, wenn ich die restlichen Funktionen weiter ausführe.

Ich weiß nicht genau, wo ich falsch liege, und ich denke, dass es hauptsächlich auf meine mangelnde Erfahrung im Umgang mit dem Speichern und Laden von Spielinformationen zurückzuführen ist.

Wenn jemand mir vielleicht helfen könnte, würde es sehr geschätzt werden.

Danke, Clifford

Antwort

1

Eine mögliche Lösung neue Klasse erstellen Cards wie so ist:

public class Cards { 
    private Array<CardData> cards; 

    public Array<CardData> getCards() { 
     return cards; 
    } 

    public void setCards(Array<CardData> cards) { 
     this.cards = cards; 
    } 
} 

und dann Abrufen von Werten wie:

Cards cardsJson = json.fromJson(Cards.class, Gdx.files.local("cards.json")); 
Array<CardData> loadedCards = cardsJson.getCards(); 

Ein weiterer ist zu ändern json Datei an:

[ 
    { 
     "card": "ID_3", 
     "temper": "LAZY" 
    }, 
    { 
     "card": "ID_2", 
     "temper": "LAZY" 
    }, 
    { 
     "card": "ID_1", 
     "temper": "LAZY" 
    }, 
    { 
     "card": "ID_1", 
     "temper": "LAZY" 
    } 
] 

Und dann Abrufen von Werten wie:

Array<CardData> fromJson = json.fromJson(Array.class, CardData.class, Gdx.files.local("cards.json")); 

Ich würde die erste Variante bevorzugen, aber die Wahl liegt bei Ihnen.