ServerPlugin HashMap Speichern schlägt fehl

Dieses Thema im Forum "Programmierung" wurde erstellt von Galliar12, 26. Juni 2013.

  1. Galliar12
    Offline

    Galliar12

    Registriert seit:
    16. Juli 2011
    Beiträge:
    85
    Minecraft:
    Galliar12
    Hey Leute, ich habe ein kleines Problem mit dem Speichern meiner HashMap.

    Meine onEnable Methode:
    Code (Text):
    1. try {
    2.     SpawnL.load(this.Lobby, "plugins/MineLeague/lobby.bin");
    3. } catch (Exception lex) {
    4.     lex.printStackTrace();
    5. }
    Meine onDisable Methode:
    Code (Text):
    1.         try {
    2.             SpawnL.save(this.Lobby, "plugins/MineLeague/lobby.bin");
    3.           }
    4.           catch (Exception localException) {
    5.           }
    SpawnL.class
    Code (Text):
    1. public class SpawnL
    2. {
    3.   public static void save(HashMap<String, Spawn> Lobby, String path)
    4.     throws Exception
    5.   {
    6.     ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(path));
    7.     oos.writeObject(Lobby);
    8.     oos.flush();
    9.     oos.close();
    10.   }
    11.  
    12.   public static Object load(HashMap<String, Spawn> Lobby,String path) throws Exception {
    13.       ObjectInputStream ois = new ObjectInputStream(new FileInputStream(path));
    14.       Object result = ois.readObject();
    15.       ois.close();
    16.       return result;
    17. }
    18. }
    Spawn.class
    Code (Text):
    1. public class Spawn
    2.   implements Serializable
    3. {
    4.   private static final long serialVersionUID = 1L;
    5.   int x;
    6.   int y;
    7.   int z;
    8.   World world;
    9.  
    10.   public Spawn(Location loc)
    11.   {
    12.     this.x = loc.getBlockX();
    13.     this.y = loc.getBlockY();
    14.     this.z = loc.getBlockZ();
    15.     this.world = loc.getWorld();
    16.   }
    17.   public Location getLocation() {
    18.     Location loc = new Location(this.world, this.x, this.y, this.z);
    19.     return loc;
    20.   }
    21. }
    Die Fehlermeldung:

    http://pastebin.com/sqHaZPVn


    Hoffe jmd kann mir helfen :/

    Danke schön an alle Antworter
     
    #1
  2. Cabraca
    Online

    Cabraca

    In der Klasse "Spawn" steckt ein World Objekt und World Objekte können nicht serialisiert werden.
    Ersetz das World Objekt durch nen String mit dem Weltnamen dann sollte es gehen.

    Achja und ne Klasse für serialisierbare Locations gibts bereits:
    https://gist.github.com/SagaciousZed/3380178

    Keine Ahnung ob die noch funzt, einfach mal testen und ggf anpassen.
     
    #2
  3. Galliar12
    Offline

    Galliar12

    Registriert seit:
    16. Juli 2011
    Beiträge:
    85
    Minecraft:
    Galliar12
    Hmmm, klappt jetzt zur Hälfte. Ich werde zwar nachdem ich die Lobbys gesetzt habe zu ihnen teleportiert, aber wenn ich die Hashmap speichern will (egal ob reload oder neustart) wird diese nicht gespeichert, wodurch ich danach keine Lobbypunkte mehr habe und deshalb auch nichts mehr Laden kann
     
    #3
  4. Cabraca
    Online

    Cabraca

    Kleiner Tipp von mir: Lern Java.
    Das sind so grundlegende Sachen die dir offenbar Fehlen da bist du bei Bukkit komplett fehl am platz.

    Code (Text):
    1.  
    2.   public static Object load(HashMap<String, Spawn> Lobby,String path) throws Exception {
    3.       ObjectInputStream ois = new ObjectInputStream(new FileInputStream(path));
    4.       Object result = ois.readObject();
    5.       ois.close();
    6.       return result;
    7.   }
    8.  
    9. SpawnL.load(this.Lobby, "plugins/MineLeague/lobby.bin");
    10.  
    Du übergibst also ne HashMap, die du nie benutzt, returnst ein Objekt was du nicht benutzt und wunderst dich dann, dass das nicht funktioniert?

    Wie wärs wenn du zum einen den ConfigKram von Bukkit und damit dann die von mir gelinkte Klasse nutzt anstatt das Rad nochmal neu zu erfinden?
     
    #4
  5. Galliar12
    Offline

    Galliar12

    Registriert seit:
    16. Juli 2011
    Beiträge:
    85
    Minecraft:
    Galliar12
    Würde ich sie nicht nutzen wäre sie ja nicht vorhanden oder? Bzw wäre sie einfach nur unnötig ;) Aber ja nur so btw.

    Ich verstehe ja dass du helfen willst, oder dass hier viele Personen rumlaufen die meinen sie können programmieren ohne einen Schimmer zu haben aber jmd gleich mit deinem Sarkasmus zu überhäufen und ihn versuchen ihn schlecht zu machen und irg.welche Sachen schreiben die einfach nur dämlich sind (Ja das was du geschrieben hast ist dämlich).

    Aber naja nicht jeder ist ja so ein Profi wie du, der Java perfekt beherrscht und nicht versucht irg.eine Hilfe in einem Forum zu finden auf ein Problem dass einen schon ankotzt ;)
     
    #5
  6. games6471
    Online

    games6471

    Schau dir doch mal die load Methode an. Er hat völlig recht.
     
    #6
  7. Galliar12
    Offline

    Galliar12

    Registriert seit:
    16. Juli 2011
    Beiträge:
    85
    Minecraft:
    Galliar12
    Ich sage nicht dass er unrecht hat ;) Ich finde in einem... Nunja öffentlichen Forum gehört Anstand und Respekt eher hin als Sarkasmus und "Haten"
     
    #7
  8. Cabraca
    Online

    Cabraca

    was erwartest du bitte? dass ich dir den fertigen code hier poste?
    ganz ehrlich ich hab dich jetzt mehr als genug auf das problem hingewiesen. deine load methode macht effektiv garnix.
    was an meinen posts dämlich sein soll keine ahnung. aber mit solchen beleidigungen kommste sicher nicht weiter.
    dir fehlen offenbar die grundlagen, das hab ich angemerkt und mehr nicht. java profi bin ich auch nicht aber ich sehe wenn jemand noch was nachzuholen hat.
    aber ok ich werd dich nicht mehr mit meinen dämlichen posts nerven ;) have fun mit deinem problem
     
    #8
  9. Chrisliebaer
    Online

    Chrisliebaer

    Was denn nun?

    Dir fehlen offensichtlich die Grundlagen. Außerdem ist Serialisieren und Deserialisieren vielleicht nicht die beste Idee. Der Problem ist nähmlich, dass das von der JVM abhängt. Es wäre, vor allem für etwas, das so oft auf verschiedenen Platformen läuft, besser das ganze in XML/JSON/YAML zu speichern. Außerdem ist es dann auch deutlich einfacher von Hand zu editieren und zu Bugfixen.

    Deine load()-Methode ist der Knüller schlechthin. Du prüfst nichtmal ob das, was du da geladen hast wirklich die Hashmap ist, die du haben wolltest.

    Außerdem hast du einen wunderschönen Stacktrace gepostet. Da sieht man sofort auf Annhieb wo das Problem ist. Wenn man halt das erste mal mit so einem kryptischen Teil in Berührung kommt, muss man halt mal Googeln wie man so etwas interpretiert. Außerdem hast du den Stacktrace offensichtlich aus der Windowskonsole rauskopiert und dabei die Zeilenumbrüche kaputt gemacht. Du solltest dich vielleicht einfach noch ein bisschen mit normalem Java beschäftigen, bis dir solche merkwürdigen Dinge, wie deine load()-Methode nicht mehr passieren. Und dazu braucht man keine Javaexperte sein, das sind schlicht Basiscs.

    Und falls du bisher nicht auf die Lösung gekommen bist, warum dein Code nicht funktioniert: java.io.NotSerializableException. Wenn du das mal googlest, findest du wunderschön in der Javadokumentation deine Ursache.

    Hier sind nicht alle am haten, aber mit was für einer Selbstverständlichkeit hier manch einer glaubt, dass er bereits fortgeschrittener Hobbyprogrammierer ist, ist schon beachtlich.
     
    #9