Objekte als XML Struktur speichern

Status
Nicht offen für weitere Antworten.

Daishi1002

Mitglied
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

Code:
class UnterObject{
 int unter1;
 int unter2;}

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


Message myMessage = new Message();

XML erzeugen, was so aussieht:

Code:
<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
 
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.
 
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
Code:
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
Code:
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
Code:
<?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?
 
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.

Code:
public HopList(){
   	this(0, 0);
   }
 
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:

Code:
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
Code:
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
Code:
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
 
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
 
Gemeint ist, dass du deine get- / set- methoden public machst. Die "Felder" - Variablen solltest Du private machen.

Gruß
Q.
 
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??
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben