# Objekte als XML Struktur speichern



## Daishi1002 (7. Jun 2005)

Hallo alle zusammmen,

ich hätte gerne ein paar Hinweise, Tipps, wie man selbst definierte Objekte als XML speichert.

Sollte ich java.beans.XMLEncoder benutzen? Oder writeObject von Serializable überschreiben? oder mit Externalizable irgendwas machen?

Was ich will:

Aus Java-Objecten, die etwa so aussehen


```
class UnterObject{
 int unter1;
 int unter2;}

class Message{
 int var1;
 UnterObject myUnter1;
 ...}


Message myMessage = new Message();
```

XML erzeugen, was so aussieht:


```
<xmlstartkrams ... />
 <myMessage>
   <var1>wert_von_var1</var1>
   <myUnter1>
     <unter1>wert</unter1>
     <unter2>wert2</unter2>
   </myUnter1>
  ...
 </myMessage>
```

Ich hab ein wenig mit XMLEncoder rumgespielt, es scheint aber eigentlich für Beans und deren Speicherung zu sein, richtig?

Hat jemand Tips, womit ich das realisieren kann?
Danke
Daishi1002


----------



## stev.glasow (7. Jun 2005)

Der XMLEncoder ist für so etwas gedacht. 
Der speichert die Eigenschaften die per getter und setter zugänglich sind - http://xstream.codehaus.org/ wäre eine Alternative, die ähnlich funktioniert  Hängt halt davon ab wie du es haben willst.


----------



## Daishi1002 (7. Jun 2005)

Ich Xstream mal getestet. Sehr schön, funktioniert problemlos.

Allerdings würde ich das, wenn geht mit Standard Java Routinen lösen. Daher lieber XMLEncoder.

Hier habe ich jedoch das Problem, das meine Obejkte nicht im XML Stream erscheinen, obwohl sie set & get Methoden haben, sowie die Fehlermeldung


> java.lang.IllegalAccessException: Class java.beans.Statement can not access a member of class ForwardLookupMessage with modifiers ""
> Continuing ...
> java.lang.Exception: XMLEncoder: discarding statement XMLEncoder.writeObject(ForwardLookupMessage);
> Continuing ...



mit der ich absolut nichts anfangen kann.

Folgendes Programm

```
import java.beans.XMLEncoder;
import java.io.*;


public class Starter {

	public static void main(String[] args) {
		
		Message test = new Message();
		
		test.setEinText("BerendTest");
		test.setEinWert(4711);
		test.setMessageId(47112312);

		try{
        XMLEncoder e = new XMLEncoder( new BufferedOutputStream( new FileOutputStream("out.xml")));
        e.writeObject(test);
        e.close();
		}catch(Exception e){
			e.printStackTrace();
		}
		
	}
}
```

mit der Messageklasse

```
import java.io.*;

public class Message implements Serializable {

	//Felder
	
	long messageId;
	int einWert;
	String einText;
	
	//getter & setter
	void setMessageId(long wert){messageId = wert;}
	void setEinWert(int wert){einWert = wert;}
	void setEinText(String wert){einText = wert;}
	
	long getMessageId(){return messageId;}
	int getEinWert(){return einWert;}
	String getEinText(){return einText;}
}
```

lieferte  nur diesen XML Outout

```
<?xml version="1.0" encoding="UTF-8"?> 
<java version="1.5.0_03" class="java.beans.XMLDecoder"> 
 <object class="Message"/> 
</java>
```


Leider nicht das, wa ich erwartet hätte. Weiss jemand was mit der Fehlermeldung anzufangen, oder warum der Output hier im Beispiel so mager ist?


----------



## stev.glasow (7. Jun 2005)

Daishi1002 hat gesagt.:
			
		

> warum der Output hier im Beispiel so mager ist?


Weil ne Exception geworfen wurde.  :roll: 


Mach die Klassen, Methoden und Konstruktoren public (komplett alle modifier weg zu lassen ist eh Fusch)

Außerdem braucht HopList noch nen Standartkonstruktor:
z.B.


```
public HopList(){
   	this(0, 0);
   }
```


----------



## Daishi1002 (7. Jun 2005)

Ich hab das ganze nochmal in ein einfaches Beispiel gepackt - was wieder eine andere Fehlermeldung auspuckt - mit der ich wieder nicht anfangen kann. Diesmal gar kein Output:


```
import java.beans.XMLEncoder;
import java.io.*;


public class Starter {

	public static void main(String[] args) {
		
		Message test = new Message(47112312, 4711, "Test");
		
		/*test.setEinText("Test");
		test.setEinWert(4711);
		test.setMessageId(47112312);*/

		try{
        XMLEncoder e = new XMLEncoder( new BufferedOutputStream( new FileOutputStream("out.xml")));
        e.writeObject(test);
        e.close();
		}catch(Exception e){
			e.printStackTrace();
		}
		
	}
}
```

mit der Messageklasse

```
import java.io.*;

public class Message implements Serializable {

	//Felder
	public long messageId;
	public int einWert;
	public String einText;
	
	//Konstructor
	public Message(long id, int wert, String text){
		messageId = id;
		einWert = wert;
		einText = text;
	}
	
	//getter & setter
	void setMessageId(long wert){messageId = wert;}
	void setEinWert(int wert){einWert = wert;}
	void setEinText(String wert){einText = wert;}
	
	long getMessageId(){return messageId;}
	int getEinWert(){return einWert;}
	String getEinText(){return einText;}
}
```

es kommt die Fehlermeldung

```
java.lang.InstantiationException: Message
Continuing ...
java.lang.Exception: XMLEncoder: discarding statement XMLEncoder.writeObject(Message);
Continuing ...
```

Ich hab jetzt einen Konstruktor dabei, der auch public ist, das hat aber nichts geändert. Und mit der Fehlermeldung kann ich wieder nichts anfagen. Die InstantiationException tritt aber nicht in Zeile bei der Instanziierung des Objektes auf, sondern erst im try-Block. 



> Mach die Klassen, Methoden und Konstruktoren public (komplett alle modifier weg zu lassen ist eh Fusch)



Meisnt du damit die getter&setter? Ich dachte, die brauche, weil der XMLEncoder die sonst nicht mit nimmt


----------



## Bleiglanz (7. Jun 2005)

würde sagen du brauchst einen Default-Konstruktor OHNE Argumente

das deserialisieren geht wohl so vonstatten, dass eine Instanz erzeugt wird und dann einfach alle setter aufgerufen werden


----------



## Quorthon (7. Jun 2005)

Gemeint ist, dass du deine get- / set- methoden public machst. Die "Felder" - Variablen solltest Du private machen.

Gruß
Q.


----------



## thE_29 (1. Dez 2005)

Also ich probier das auch gerade!

Aber der Hund speichert mir nur die 1te Einstellung!!


Also er nimmt nur die 1. get/set Methode die anderen nicht!!


Warum??


----------



## thE_29 (1. Dez 2005)

A geht schon 

Hab vergessen zuzuweisen


----------

