# Objekte via XML speichern und wieder einlesen



## nils_eckert (25. Sep 2004)

Hallo zusammen!

Ich bin gerade auf der Suche nach einem Weg Objecte eines Programms möglichst einfach in eine XML Datei umzuwandeln und zu speichern und dann beim Programm-Neustart wieder einzulesen.

Was gibt es da für Möglichkeiten und wo liegen die Vor und Nachteile?

Ich habe bisher ObjectInputStream und OutputStream verwendet, aber wenn man dann mal eine Variable zu einem Objekt hinzufügen will, geht gar nüscht mehr.

Vielen Dank schon mal!
Nils


----------



## L-ectron-X (25. Sep 2004)

Ja, das ist korrekt. Ab Java 1.5 kann man eine Klasse die das Interface Serializable implementiert ohne gleich folgenden Code erst gar nicht mehr kompilieren.
Damit das von Dir beschriebene nicht (mehr) passiert, musst Du in die zu serialisierende Klasse ein spezielles Datenfeld einfügen.

```
private static final long serialVersionUID = -5617671899626507127L;
```
Damit wird die Serialisierungskompatibilität sicher gestellt. (Wert des long frei wählbar)

Bestehende Klassen, ohne dieses Datenfeld können auf ihre serialVersionUID hin untersucht werden, damit man ihnen nachträglich die Funktionstüchtigkeit zurück geben kann.
Dazu bringt das JDK bereits ein Tool mit GUI mit, welches das ermöglicht.
Eingabe an der Eingabeaufforderung unter Windows: *serialver -show*

Weitere Informationen kannst Du hier nach lesen.


----------



## foobar (25. Sep 2004)

Wenn du Objekte mit Hilfe von XML serialisieren willst, ist am einfachsten die Klassen XMlEncoder und XMLDecoder zu benutzen. Falls du die XML Daten auch noch andersweitig verwenden willst, solltest du die Daten mit DOM/JDOM einlesen und speichern. Die Verarbeitung mit DOM/JDOM ist zwar etwas aufwändiger, dafür hast du aber auch die volle Kontrolle darüber, wie der XMLdatenstrom aufgebaut ist. Hier ein kleines Beispiel für XMLEncoder /XMLDecoder:

```
import java.beans.*;
import java.beans.XMLEncoder;
import java.io.*;
import java.util.Vector;
public class XmlEncoderDecoderDemo
{
	private FileOutputStream fos;
	private FileInputStream fis;
	public XmlEncoderDecoderDemo(String fileName)
	{
		try
		{
			fos = new FileOutputStream(fileName);
			fis = new FileInputStream( fileName );
		}
		catch (FileNotFoundException e)
		{
			e.printStackTrace();
		}
	}

	public Object read()
	{
		XMLDecoder decoder = new XMLDecoder( this.fis);
		Object out = decoder.readObject();
		return out;
	}

	public void write(Object data)
	{
		BufferedOutputStream bos = new BufferedOutputStream( fos );
		XMLEncoder encoder = new XMLEncoder(bos);
		encoder.writeObject( data );
		encoder.close();
	}

	public static void main(String[] args)
	{
		XmlEncoderDecoderDemo encoder =new XmlEncoderDecoderDemo("/home/steffen/meinVector.xml");
		
		Vector v = new Vector();
		v.add("aaa");
		v.add("bbb");
		encoder.write( v );
		
		//#########################
		
		Vector out = (Vector) encoder.read();
		System.out.println(out.firstElement());
		System.out.println("ok");
	}

}
```
Ein Beispiel mit DOM: http://www.java-forum.org/de/viewtopic.php?t=8325&highlight=xml


----------



## Guest (3. Mrz 2008)

Wenn ich eine Objektliste bestehend aus mehrern Objekten mit folgenden Inhalten habe

Datum(String) , Geldwert (double) und Ausgabenart(String)

Diese werden in einer XML-Datei gespeichert wie oben beschrieben.

Wie kann ich nun auf die Objekte, bzw die Zahlenwerte zugreifen ?
Ich müsste alle Geldwerte der XML summieren können


----------



## HoaX (4. Mrz 2008)

schau dir mal xstream an, welten besser als XMLEn/Decoder


----------



## vogella (4. Mrz 2008)

Hallo, 

Du könntest Eclipse EMF verwenden, dann kannst Du Dein Model sehr einfach per XML speichern und wieder einlesen. 

Tutorial: EMF Tutorial

Viele Grüße, Lars


----------



## Wildcard (4. Mrz 2008)

Auch wenn ich großer EMF Fan bin, ist es für eine Model Driven Architecture wohl zu spät wenn das Modell schon da ist.


----------



## vogella (5. Mrz 2008)

Moin Wildcard,

findest Du? Ich habe gerade ein existierendes Projekt von POJO auf ein EMF Modell umgestellt und fand das relativ schmerzfrei....

Viele Grüße, Lars


----------



## Wildcard (5. Mrz 2008)

vogella hat gesagt.:
			
		

> findest Du? Ich habe gerade ein existierendes Projekt von POJO auf ein EMF Modell umgestellt und fand das relativ schmerzfrei....


Wenn man POJOs mit reinen Geschäftsdaten hat und entsprechende Interfaces definiert hat, geht das auch relativ einfach und IMO mit einem sehr großem Mehrwert.
Aber wenn man seine ersten Schritte in die Java-XML Welt macht, vermute ich das 
a) man von EMF etwas erschlagen werden könnte (alleine schon durch Runtime Compatibility Jars)
b) kein sehr sauberes Datenmodell hat (keine echte MVC Trennung und so weiter) und am Ende einen Großteil der Anwendung neu schreibt

Einen Blick sollte nils_eckert aber spätestens im Hinblick auf sein nächstes Projekt riskieren, denn EMF ist Gold wert.


----------



## vogella (5. Mrz 2008)

Ja, stimmt schon. EMF kann am Anfang etwas kompliziert wirken.


----------



## Guest (5. Mrz 2008)

Mein Java Outputcode:


```
public static void foodcosts() throws FileNotFoundException, IOException {
      Costs food;
      food = new Costs();
      List<Costs> foodList = new ArrayList<Costs>(); 
XMLEncoder output = new XMLEncoder(new BufferedOutputStream(
            new FileOutputStream("foodCosts.xml")));
      output.writeObject(foodList);
      output.close();[/quote]
```


So sieht dann die *.XML Datei aus:


```
<?xml version="1.0" encoding="UTF-8" ?>
- <java version="1.6.0_03" class="java.beans.XMLDecoder">
- <object class="java.util.ArrayList">
- <void method="add">
- <object class="Costs">
- <void property="date">
  <string>01.01.2008</string>      --->Datum
  </void>
- <void property="höhe">
  <double>43.0</double>            ---->Höhe, mit der nach dem einlesen weitergerechnet werden soll
  </void>
- <void property="name">
  <string>schweinebraten</string>
  </void>
  </object>
  </void>
  </object>
  </java>
```


Diese Liste geht dann natürlich noch weiter...

Wie kann ich dann aus dieser längeren xml Liste die Double Werte rausfischen und addieren und anzeigen?
Danke


----------



## vogella (6. Mrz 2008)

Hallo,

z.B. per XPath:

Java XML und XPath

Viele Grüße, Lars


----------



## Guest (7. Mrz 2008)

Und wie kann ich jetz damit genau die Double Attribute oder Werte auslesen und mit Ihnen arbeiten?
Mir wird das nicht klar


----------

