Home
Über mich
Blog
Veröffentlichungen
IT-Trainings
Impressum


Objektserialisierung

Zur Einführung in die Problematik möchte ich ein einfaches Beispiel die XML-basierte Objektserialisierung geben.

public interface IXMLTest {
  void setNN(String nn);
  String getNN();
  void setVN(String vn);
  String getVN();
  void setA(int a);
  int getA();
}
public class Mensch implements IXMLTest, Serializable {
  private String vorname, nachname, hobby;
  private int alter;
  //Getters, Setters
  //implemented methods
  //Constructors
}

Mit einem entsprechenden Konstruktor, der die vier Parameter übernimmt, ist es möglich, ein Objekt der Klasse "Mensch" zu generieren. In einfachster Form geschieht das durch den ObjectOutputStream:

  IXMLTest m = new Mensch("Wilma", "Wolkenlos", 33, "XML");
  FileOutputStream fos = null;
  ObjectOutputStream out = null;
  try {
      fos = new FileOutputStream("C:/wg/javaobject.ser");
      out = new ObjectOutputStream(fos);
      out.writeObject(m);
      out.close();
  } catch (Exception ex) {
  }

Das De-Serialisieren der geschriebenen Datei in ein Java-Objekt geschieht ebenso einfach durch die Klasse ObjectInputStream:

  FileInputStream fis = null;
  ObjectInputStream in = null;
  try {
      fis = new FileInputStream("C:/wg/javaobject.ser");
      in = new ObjectInputStream(fis);
      IXMLTest m = (IXMLTest) in.readObject();
      in.close();
      System.out.println(m.getNN());
      System.out.println(m.getVN());
  } catch (Exception ex) {
  }

Alternativ ist es möglich, das Objekt mit Hilfe der Klasse java.beans.XMLEncoder in ein XML Dokument zu überführen.

IXMLTest m = new Mensch("Wilma", "Wolkenlos", 33, "XML");
java.beans.XMLEncoder x1;
x1 = new java.beans.XMLEncoder(new FileOutputStream("..."));
x1.writeObject(m);
x1.flush();
x1.close();

Obwohl das Interface "IXMLTest" keinen Getter und Setter für "hobby" vorgesehen hat, wird das Objekt dennoch vollständig (auch mit der "Hobby"-Information) in XML abgebildet. Das ist auch korrekt, da es sich tatsächlich um eine Instanz der Klasse "Mensch" handelt.

<?xml version="1.0" encoding="UTF-8"?>
<java version="1.8.0_92" class="java.beans.XMLDecoder">
 <object class="Mensch">
  <void property="NN">
   <string>Wolkenlos</string>
  </void>
  <void property="VN">
   <string>Wilma</string>
  </void>
  <void property="a">
   <int>33</int>
  </void>
  <void property="hobby">
   <string>XML</string>
  </void>
 </object>
</java>

Die Klasse java.beans.XMLDecoder kann diesen Stream wieder einlesen und daraus Objekte derselben Klasse "Mensch" generieren. Gehören die Objekte, die aus dem XML-Datenstrom deserialisiert / dekodiert werden sollen, zu einer anderen Klasse (z.B. "Person"), so kann das schwierig werden, selbst dann, wenn beide Klassen dasselbe Interface ("IXMLTest") implementieren.

public class Person implements IXMLTest {
  private String lastname, firstname;
  private int age;
  //Getters, Setters
  //implemented methods
  //Constructors
  public Person(IXMLTest t){
    this.setAge(t.getA());
    this.setFirstname(t.getVN());
    this.setLastname(t.getNN());
  }

In diesem Fall ist es möglich, den XML-Datenstrom in ein Objekt jener Schnittstelle zu konvertieren. Dabei wird es automatisch als Objekt der Klasse "Mensch" instanziiert, weswegen die Typkonvertierung vom Schnittstellenobjekt zum Objekt der Klasse "Mensch" problemlos verläuft ("Mensch mm = (Mensch) t;").

Da die Klasse "Person" aber in keiner Vererbungsbeziehung zu "Mensch" steht, ist eine direkte Typkonvertierung nicht möglich. Hilfsweise ist es möglich, das "Person"-Objekt durch einen entsprechenden Copy-Konstruktor zu initialisieren. Dabei geht die Teilinformation "hobby:XML" verständlicherweise verloren, da so etwas in der Klasse "Person" nicht vorgesehen ist.

FileInputStream fi = new FileInputStream("...");
java.beans.XMLDecoder d;
d = new java.beans.XMLDecoder(fi);
IXMLTest t = (IXMLTest) d.readObject();
Mensch mm = (Mensch) t;
Person p = new Person(t);
//Ausgabe

qrpic/Datenaustausch1.jpg

wg / 14. Oktober 2017




Fragen? Anmerkungen? Tips?

Bitte nehmen Sie Kontakt zu mir auf (info10@wilfried-grupe.de).



Vielen Dank für Ihr Interesse an meiner Arbeit.


V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn

Mobil: 0151. 750 360 61 * eMail: info10@wilfried-grupe.de