Serialization von Klassen (ConfigurationSerializable)

Hier könnt ihr anderen Leuten helfen, indem ihr Anleitungen oder praktische Codesegmente zur Verfügung stellt.

Serialization von Klassen (ConfigurationSerializable)

Beitragvon Jofkos » Mi 9. Apr 2014, 21:44

In diesem Tutorial geht es darum, Klassen zu serialisieren, und wieder zu deserialisieren.

Als erstes Brauchen wir unsere Klasse, diese muss ConfigurationSerializable implementiere, ein serialize Methode haben und einen statische deserialize Methode haben

Code: Alles auswählen
  1. public class ExampleSerialization implements ConfigurationSerializable {
  2.    
  3.    @Override
  4.    public Map<String, Object> serialize() {
  5.       HashMap<String, Object> map = new HashMap<String, Object>();
  6.       return map;
  7.    }
  8.    
  9.    public static ExampleSerialization deserialize(Map<String, Object> map) {
  10.       return new ExampleSerialization();
  11.    }
  12. }

Jetzt muss man noch alle Variablen die gespeichert werden sollen in die Map speichern, wo man sie dann auch wieder auslesen kann

Hier ein Beispiel für die bekannte Location Klasse:
Code: Alles auswählen
  1. public class SLocation implements ConfigurationSerializable {
  2.    
  3.    private World world; // Variablen werden initialisiert
  4.    private double x;
  5.    private double y;
  6.    private double z;
  7.    private float pitch;
  8.    private float yaw;
  9.    
  10.    public SLocation(World world, double x, double y, double z, float yaw, float pitch) { // Constructor
  11.       this.world = world; // variablen werden gesetzt (world, x, y, z, yaw, pitch)
  12.       this.x = x;
  13.       this.y = y;
  14.       this.z = z;
  15.       this.pitch = pitch;
  16.       this.yaw = yaw;
  17.    }
  18.    
  19.    @Override
  20.    public Map<String, Object> serialize() {
  21.       HashMap<String, Object> map = new HashMap<String, Object>(); // neue Map
  22.       map.put("world", this.world.getName()); // Variablen werden hinzugefügt mit einem key
  23.       map.put("x", this.x);
  24.       map.put("y", this.y);
  25.       map.put("z", this.z);
  26.       map.put("yaw", this.yaw);
  27.       map.put("pitch", this.pitch);
  28.       return map;
  29.    }
  30.    
  31.    public static ExampleSerialization deserialize(Map<String, Object> map) {
  32.       return new SLocation( // Constructor oben wird aufgerufen
  33.          Bukkit.getWorld(String.valueOf(map.get("world"))), // Variablen werden aus der Map ausgelesen, mit dem gleichen Key wie vorher
  34.          NumberConversions.toDouble(map.get("x")), // NumberConversions ist eine Bukkit-Klasse, mit dessen Hilfe man einfach aus Strings nummerische Werte (Long, Integer, usw.) auslesen kann
  35.          NumberConversions.toDouble(map.get("y")),
  36.          NumberConversions.toDouble(map.get("z")),
  37.          NumberConversions.toFloat(map.get("yaw")),
  38.          NumberConversions.toFloat(map.get("pitch"))
  39.       );
  40.    }
  41. }

Die Klasse muss noch als Serializable registriert werden. Das kann man im static Bereich seiner main Klasse machen:
Code: Alles auswählen
  1. static {
  2.    ConfigurationSerialization.registerClass(SLocation.class);
  3. }
SLocation ist dann die Klasse, die ConfigurationSerializable implementiert

Hier noch eine kompakte Version um einfach mehrere Klassen zu registrieren:
Code: Alles auswählen
  1.       for (Class<? extends ConfigurationSerializable> c : Arrays.asList(
  2.             SLocation.class,
  3.             SRegion.class
  4.       )) ConfigurationSerialization.registerClass(c);
Oder mit Lambda Expressions:
Code: Alles auswählen
  1.       Arrays.asList(
  2.             SLocation.class,
  3.             SRegion.class
  4.       ).forEach(ConfigurationSerialization::registerClass);
SLocation und SRegion sind einfach Beispiel Klassen, die ConfigurationSerializable implementieren

Nun könnt ihr die Klasse in Configs schreiben wie ihr es gewöhnt seid:
Code: Alles auswählen
  1. SLocation loc = new SLocation(Bukkit.getWorld("world), 0.0D, 0.0D, 0.0D, 0.0F, 0.0F); // beispiel SLocation
  2. this.getConfig().set("ExamplePath", loc);
  3. List<SLocation> locList = new ArrayList<SLocation>();
  4. this.getConfig().set("ExampleList", locList);

und auch wieder so auslesen:
Code: Alles auswählen
  1. SLocation loc = (SLocation) this.getConfig().get("ExamplePath");
  2. List<SLocation> locList = (List<SLocation>) this.getConfig().getList("ExampleList");


Quelle: Configuration API Reference

Ich hoffe ich habe nichts vergessen :)
Wenn irgendwo doch noch einen Fehler findet, dann meldet ihn mir bitte
Zuletzt geändert von Jofkos am Sa 25. Jul 2015, 13:59, insgesamt 7-mal geändert.
Jofkos

...........

..Bild
Benutzeravatar
Jofkos
 
Beiträge: 1537
Registriert: So 16. Jun 2013, 22:45

Re: Serialization von Klassen

Beitragvon IK_Raptor » Do 10. Apr 2014, 14:51

Cool das wer dazu ein Tutorial macht. :D

Hab selbst schon mal versucht das Interface zu benutzen, musste schließlich aber doch die aufwändigere Methode benutzen (alle Werte einzelnd speichern). :/
Benutzeravatar
IK_Raptor
 
Beiträge: 609
Registriert: Mo 12. Aug 2013, 15:37

Re: Serialization von Klassen

Beitragvon Summerfeeling » So 11. Mai 2014, 21:52

Hey.
Ne kurze Frage, was bringt es, die Class als Serializable zu registrieren?
Grüße
Summerfeeling | Timo
Benutzeravatar
Summerfeeling
 
Beiträge: 1300
Registriert: Sa 15. Jun 2013, 18:43
Wohnort: Viersen

Re: Serialization von Klassen

Beitragvon Jofkos » So 11. Mai 2014, 22:17

Summerfeeling hat geschrieben:was bringt es, die Class als Serializable zu registrieren?
Dann kannst du eine instance der Klasse einfach in eine Config schreiben wie ein z.B. ein String.

Die register methode registriert quasi die deserialize methode für die angegebene Klasse
Code: Alles auswählen
  1. Example aa = new Example(loc, p, c, x, random); // Example ist einfach eine Beispiel klasse, die hier ConfigurationSerializable implementiert und auch registriert wurde als serializable
  2. this.getConfig().set("deinpfad", aa);
Nun kannst du dir die gesamte Klasse einfach wieder holen mit der get Methode einer FileConfiguration
Code: Alles auswählen
  1. Example gleichWieAa = (Example) this.getConfig().get("deinpfad"); // die Klasse wurde direkt aus der Config geladen, und ist quasi die gleiche wie oben

Docs dazu nochmals Serializing and Deserializing Objects
Jofkos

...........

..Bild
Benutzeravatar
Jofkos
 
Beiträge: 1537
Registriert: So 16. Jun 2013, 22:45

Re: Serialization von Klassen

Beitragvon DonXs » Mo 12. Mai 2014, 09:17

Hey Jofkos,
ein kleiner Tipp am Rande, die gewählte Überschrift könnte leicht zur verwechselt des eigentlichen Thema's kommen,
da vielleicht der ein oder andere bei der Überschrift "Serialization von Klassen" an das Interface Serializable und Persistieren von Objekte denkt,
da diese ein Teil der IO API von Java sind, würde ich die Überschrift zu "ConfigurationSerializable" ändern.

MfG DonXs
Benutzeravatar
DonXs
 
Beiträge: 102
Registriert: So 2. Feb 2014, 17:15
Wohnort: NRW

Re: Serialization von Klassen

Beitragvon Jofkos » Mo 12. Mai 2014, 15:28

DonXs hat geschrieben:Hey Jofkos,
ein kleiner Tipp am Rande, die gewählte Überschrift könnte leicht zur verwechselt des eigentlichen Thema's kommen,
da vielleicht der ein oder andere bei der Überschrift "Serialization von Klassen" an das Interface Serializable und Persistieren von Objekte denkt,
da diese ein Teil der IO API von Java sind, würde ich die Überschrift zu "ConfigurationSerializable" ändern.

MfG DonXs

Besser? :D
Jofkos

...........

..Bild
Benutzeravatar
Jofkos
 
Beiträge: 1537
Registriert: So 16. Jun 2013, 22:45

Re: Serialization von Klassen (ConfigurationSerializable)

Beitragvon Summerfeeling » Mo 12. Mai 2014, 20:55

Jofkos hat geschrieben:
Summerfeeling hat geschrieben:was bringt es, die Class als Serializable zu registrieren?
Dann kannst du eine instance der Klasse einfach in eine Config schreiben wie ein z.B. ein String.

Die register methode registriert quasi die deserialize methode für die angegebene Klasse
Code: Alles auswählen
  1. Example aa = new Example(loc, p, c, x, random); // Example ist einfach eine Beispiel klasse, die hier ConfigurationSerializable implementiert und auch registriert wurde als serializable
  2. this.getConfig().set("deinpfad", aa);
Nun kannst du dir die gesamte Klasse einfach wieder holen mit der get Methode einer FileConfiguration
Code: Alles auswählen
  1. Example gleichWieAa = (Example) this.getConfig().get("deinpfad"); // die Klasse wurde direkt aus der Config geladen, und ist quasi die gleiche wie oben

Docs dazu nochmals Serializing and Deserializing Objects


Hey.
Danke nochmal für diese Erklärung.
Erleichtert das speichern von Objekten ungemein! Danke für dieses super Tutorial. Daumen hoch! :D
Grüße
Summerfeeling | Timo
Benutzeravatar
Summerfeeling
 
Beiträge: 1300
Registriert: Sa 15. Jun 2013, 18:43
Wohnort: Viersen


Zurück zu Anleitungen

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot] und 5 Gäste

cron