2016-08-12 2 views
1

ich ein Array von Mission.class speichern möchten, die Variablen wie folgt:Libgdx laden/speichern Array in Json

public class Mission { 

public MissionEnum missionEnum; 
public int progress; 

public Mission(MissionEnum missionEnum, int progress) { 
    this.missionEnum = missionEnum; 
    this.progress = progress; 
} 

und auch Missionen in anderen Java-Klasse sparen:

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); 
} 

und Last-Missionen :

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()); 
     } 
    } 
} 

ich habe json wie folgt aus:

[ 
{ 
"class": "Mission", 
"missionEnum": "BUY_POWERUP" 
}, 
{ 
"class": "Mission", 
"missionEnum": "DISTANCE_ONE_RUN_2" 
}, 
{ 
"class": "Mission", 
"missionEnum": "BANANA_TOTAL_2", 
"progress": 35 
} 
] 

aber wenn loadMissions() läuft Ich habe das "Load missions successful" Protokoll gezeigt, aber "Mission loaded..." sind nicht ohne Fehlerprotokoll angezeigt. Missionen erschienen nicht richtig geladen. Ich weiß nicht, was schief gelaufen ist, weil ein anderes Array auf die gleiche Weise erfolgreich geladen wurde.

+0

Ist es möglich, dass das fehlende Fortschrittsfeld in einigen Missionen das Problem verursacht? Welche Fehlerprotokolle werden angezeigt? Vielleicht fügt man einen Konstruktor mit nur einer Mission Enum hinzu und setzt den Fortschritt auf Null. – albodelu

+0

Ich habe wieder zu den Voreinstellungen zurückgekehrt. nvm – lamma

Antwort

1

Aktualisiert Antwort:

eine leere contructor hinzufügen und lesen this und this

Sie werden entweder hinzufügen haben eine nicht-Argument Konstruktor (Mission) oder müssen Sie Fügen Sie einen benutzerdefinierten Serializer hinzu (siehe https://code.google.com/p/libgdx/wiki/JsonParsing#Customizing_serialization) , der weiß, wie eine (Missions-) Instanz gespeichert wird, und er kennt den entsprechenden -Konstruktor, der beim Einlesen einer (Mission) wieder aufgerufen werden soll.

public Mission() { 
    // Do nothing. 
} 

Reading & writing JSON

Die Klasse Umsetzung Json.Serializable ein Null Argument Konstruktor haben muss, weil Objektbau für Sie getan wird.

Alternativ können Sie den nicht verwendeten Konstruktor löschen. Ich denke Enigos Antwort ist auch richtig, also werde ich seine Antwort verbessern.

Providing Constructors for Your Classes

Sie müssen alle Konstrukteure für Ihre Klasse nicht bieten, aber Sie müssen vorsichtig sein, wenn dies zu tun. Der Compiler stellt automatisch kein Argument, Standardkonstruktor für jede Klasse ohne Konstruktoren zur Verfügung. Dieser Standardkonstruktor ruft den Konstruktor ohne Argumente der Superklasse auf. In dieser Situation wird der Compiler beschweren, wenn die Superklasse keinen Konstruktor ohne Argument hat, so dass Sie überprüfen müssen, dass es tut. Wenn Ihre Klasse keine explizite Oberklasse hat, dann hat sie eine implizite Oberklasse von Object, die einen Konstruktor ohne Argument hat.

Hinweis: ich nicht unsere Antworten nicht getestet, ich habe Spiele nicht entwickelt oder Libgdx in den letzten zwei Jahren.

Auch diese Libgdx Ausgabe lesen: Json - constructor default value with Enum:

Ich weiß nicht, ob dies ein Fehler nennen würde, aber ich habe einen Fall, wo ich eine Enumeration wie diese habe ;

Dann habe ich eine Klasse mit 2 Konstruktoren;

Diese Sekunde wird von meinem Framework aufgerufen, die erste von JSON Deserialisierung.

...

Zurück Antwort:

Ich denke, dass die fehlenden Fortschritte Feld in einigen Mission Klassen die Ursache des Problems sein kann, aber wäre interessant, die Fehlerprotokolle gelesen sicher sein.

Ich folgte this, this und this, um dies zu bestätigen, aber es ist schwer ohne zusätzliche Informationen über den genauen Protokollfehler.

+0

Nein, eigentlich sind die fehlenden Felder nicht die Ursache eines Problems. sie werden mit Standardwerten initialisiert - Nullen im Fall von "int" – Enigo

+0

In diesem Fall, versuchen Enigo Antwort, reproduziert er Ihr Problem und scheint, dass das Problem gefunden. – albodelu

+0

sie sind int mit Nullwert. Die Einsen haben auch keine Werte. – lamma

1

Nicht sicher, warum es keine Fehler in den Protokollen gibt, da ich während der Reproduktion Ihres Problems eine Ausnahme habe.

Das Problem ist in loadMissions() Methode: Sie neuen Json-Parser erstellen, ohne den Klasse-Tages Einstellung:

Json json = new Json(); 
// add the line below 
json.addClassTag("Mission", Mission.class); 
missions = json.fromJson(Array.class, Mission.class, file); 
.... 

Ohne den Tag-Parser nicht wissen, was "class": "Mission" in JSON-Datei ist.

aktualisiert

andere Sache, die dieses Problem verursachen kann der args-Konstruktor ist. Zumindest als ich es hinzugefügt habe, habe ich eine Ausnahme bekommen. Wenn Sie es nicht benutzen - einfach löschen. Dennoch, ziemlich seltsam, dass Sie keine Ausnahmen in Logs haben, die ich definitiv habe.

+0

Eigentlich habe ich nicht addClassTag auch für saveMission verwendet, aber ich bekomme immer noch das gleiche Problem. Ich wollte das Paket noch nicht zeigen. Danke, ich weiß, ich brauche AddClassTag in beiden Methoden. Es löst das Problem jedoch nicht. – lamma

+0

Ich habe der Frage ein Klassen-Tag hinzugefügt – lamma