Deserialisierung von Objekten

freggeln

Mitglied
Hallo,

ich habe mir selber eine Klasse gebaut, die ich serialisieren und auch wieder deserialisieren kann. Allerdings habe ich dann jeweils nur ein Object. Mein Ziel ist es, dass n Objekte derselben Klasse in XML ablegen kann und diese dann auch wieder einlesen kann mittels deserialisierung.

Von C# kenne ich es, dass man hierfür sehr mit List<Typ> arbeiten kann. Leider habe ich bei Java bisher nichts ähnliches gefunden.

Kann mir jemand einen Denkanstoß in die richtige Richtung geben?

Danke & Gruß
 
Hallo freggeln,

versuch's mal so:
Java:
import java.beans.*;
import java.io.*;
import java.util.*;
import java.util.logging.*;

public class PersonDemo {

    final private List<Person> personList;

    public PersonDemo() {
        personList = new ArrayList<Person>();
        personList.add(new Person("André"));
        personList.add(new Person("Lydia"));
        //save all objects of the class Person from List<Person> to XML:
        save(personList, "personList.xml");
        //reload these objects from XML:
        List<Person> newPersonList = (List<Person>) load("personList.xml");
        //print the new objects:
        System.out.println("newPersonList = " + newPersonList);
    }

    public static void save(final Object obj, final String filename) {
        try {
            XMLEncoder encoder = new XMLEncoder(new BufferedOutputStream(new FileOutputStream(filename)));
            encoder.writeObject(obj);
            encoder.close();
        } catch (FileNotFoundException ex) {
            Logger.getLogger(PersonDemo.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public static Object load(final String filename) {
        Object obj = null;
        try {
            XMLDecoder decoder = new XMLDecoder(new BufferedInputStream(new FileInputStream(filename)));
            obj = decoder.readObject();
            decoder.close();
        } catch (FileNotFoundException ex) {
        }
        return obj;
    }

    public static void main(final String[] args) {
        PersonDemo personDemo = new PersonDemo();
    }
}
Java:
/*
 * Person.java
 *
 * We can use XMLEncoder for storing any object we like.
 * To do so, it's enough that the objects respect the "Bean" format:
 *
 * a public class where we add a default constructor (without parameters)
 * and the Setter and Getter methods for the properties.
 */

public class Person {

    private String name;

    public Person() {
        this("");
    }

    public Person(final String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(final String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Person{" + "name=" + name + '}';
    }
    //public boolean equals(final Object obj) {...}
    //public int hashCode() {...}
}
Wenn man will kann man beim XMLEncoder natürlich auch mehrere "writeObject" machen (und entsprechend bei XMLDecoder mehrere "readObject"). Auf diese Weise können wir Objekte verschiedener Klassen in dieselbe Datei schreiben.

Gruß,
André
 
Zuletzt bearbeitet:
Erstmal vielen Dank für die Antwort. Allerdings sind das XML was dabei rauskommt nicht wirklich "schön" aus. Daher werde ich nun einen anderen Weg gehen, wobei ich das XML von Hand parsen will.

Dabei stoße ich jetzt allerdings auf anderes Problem.

Und zwar initialisiere ich Konstruktor eine ArrayList mit dem Befehl
Code:
vlstExport = new ArrayList<Export>();

Die ArrayList habe ich in der Klasse wie folgt definiert.
Code:
private ArrayList<Export> vlstExport;

Bis hierhin ist alles richtig, oder?

Wenn ich nun allerdings in einer anderen Methode dieser Klasse versuche die ArrayList anzusprechen erhalte ich eine NullPointerException. Mit ansprechen meine ich in diesem Fall, dass ich versuche eine Element hinzuzufügen.
Code:
this.vlstExport.add(vExport);

Hat jemand eine Idee wieso ich hier die Exception bekomme?

Danke & Gruß

EDIT: Fehler entdeckt und Problem behoben.
 
Zuletzt bearbeitet:
Allerdings sind das XML was dabei rauskommt nicht wirklich "schön" aus.

Hallo freggeln,

das XML was dabei herauskommt sieht vielleicht nicht "schön" aus, dafür ist es aber optimiert, das heißt der XMLEncoder versucht redundante Informationen gar nicht erst abzuspeichern.

Außerdem ist die Datei nicht dafür gedacht, um von anderen Tools verstanden zu werden als vom XMLDecoder . Man kann sie also als verschlossenen Container betrachten, der die darin enthaltenen Informationen einfach nur von Instanz zu Instanz transportieren will.

Gruß,
André
 

Neue Themen


Zurück
Oben