Serialisiertes Objekt innerhalb einer XML Node

Status
Nicht offen für weitere Antworten.

peez

Bekanntes Mitglied
Ich möchte gerne ein XML speichern, in dem innerhalb einer bestimmten Node ein serialisiertes Objekt gespeichert wird.
Also so ähnlich:

Code:
<Rootnode>
  <Datensatz>
    <Name>Hanspeter</Name>
    <Objekt>#0,/=§;java.util.Hashtable.)/&=§Kjok39/§=§  (oder wie das serialisierte objekt eben aussieht)</Objekt>
  </Datensatz>
</Rootnode>

Schreiben scheint zu funktionieren. Wenn ich das XML dann allerdings wieder lesen möchte, bekomme ich beim Parsen eine MalformedSequenceException (Invalid byte 1 of 1-byte UTF-8 sequence).

Muss ich beim Speichern noch irgendwas explizit maskieren oder so? Für das XML benutze ich dom4j.
 

Murray

Top Contributor
Wie serialisierst Du das Objekt denn? Das Problem wird wohl darin bestehen, dass die Serialisierung Binärdaten erzeugt, während eine XML-Datei eine Textdatei ist. Üblicherweise würde man die die Binärdaten in eine passende Textrepräsentation verpacken. Dazu kann man z.B. das Base-64-Encoding verwenden.
 

peez

Bekanntes Mitglied
Zum (De-)Serialisieren habe ich mir zwei Klassen geschrieben, die OutputStream erweitern u. einfach in einen String schreiben bzw. davon lesen.

Mit dem Base64 Encoding funktioniert irgendwas nicht.
Wenn ich testweise einfach im Programm hin- und herencode funktioniert alles.

Speichere ich den Base64 String allerdings im XML und lade diesen später wieder, bekomme ich beim Deserialisieren (also in.readObject()) eine UTFDataFormatException...

Habe keine Idee was ich da noch beachten muss...
 

peez

Bekanntes Mitglied
Ok. Also so speichere ich:

Code:
Hashtable<String, Serializable> hash = new Hashtable<String, Serializable>();
hash.put( "key", "value1" );
		
OutputStream2Text ott = new OutputStream2Text(  ); //Meine Klasse
ObjectOutputStream o;
o = new ObjectOutputStream(ott);			
o.writeObject( hash );
String serialized = ott.getText();
String encoded = new BASE64Encoder(  ).encodeBuffer( serialized.getBytes() );			

Element e = new Element("data").setText(encoded);

Und so wird dann gelesen:

Code:
String encoded = e.getText(); //Text aus XML Element
decoded = new String(new BASE64Decoder(  ).decodeBuffer( encoded ));
ObjectInputStream i = new ObjectInputStream( new Text2InputStream(decoded) );
Hashtable<String,Serializable> newHash = (Hashtable<String,Serializable>)i.readObject();



Die beiden Stream Klassen sehen so aus:
Code:
private class Text2InputStream extends InputStream {

		private byte m_bytes[] = null;

		private int m_position = 0;

		public Text2InputStream( String text ) {
					m_bytes = text.getBytes();
				
		}

		@Override
		public int read() throws IOException {

			if ( m_position == m_bytes.length ) { // Am Ende eine -1 zurückgeben
				return -1;
			}

			return (int)m_bytes[m_position++];
		}

	}

	private class OutputStream2Text extends OutputStream {

		private Vector<Byte> m_bytes;
		

		public OutputStream2Text() {
			m_bytes = new Vector<Byte>();
		}

		@Override
		public void write( int b ) throws IOException {
			m_bytes.add( new Byte( (byte)b ) );
		}

		public String getText() {
			byte b[] = new byte[m_bytes.size()];

			for ( int i = 0; i < m_bytes.size(); i++ ) {
				b[i] = m_bytes.get( i ).byteValue();
			}

		
					return new String( b);
			

		}

	}

Im XML steht dann folgendes:

<additionalData>rO0ABXNyABNqYXZhLnV0aWwuSGFzaHRhYmxlE7sPJSFK5LgDAAJGAApsb2FkRmFjdG9ySQAJdGhy ZXNob2xkeHA/QAAAAAAACHcIAAAACwAAAAB4</additionalData>

(original rauskopiert)
 

Murray

Top Contributor
Hier passen XML und Code nicht zusammen: im Code steht data im XML aber additional Data. Das liegt aber vermutlich an irgendwelchen Vereinfachungen beim Posten und dürfte daher für das Problem wohl nicht so wichtig sein.

Drei Fragen aber:
1. Was sind das für Base64Encoder / Decoder?
2. Warum verwendest Du nicht ByteArrayOutputStream und ByteArrayInputStream zur Serialisierung?
3. Läuft Dein Test innerhalb einer VM, so dass unterschiedliches Platform-Default-Encoding definitiv ausgeschlossen werden kann?
 

Ebenius

Top Contributor
Was soll denn das mit den String-Operationen auf den Byte-Arrays? So geht's richtig:
Code:
final ByteArrayOutputStream baos = new ByteArrayOutputStream(); // Eine Klasse die funktioniert
ObjectOutputStream o; 
o = new ObjectOutputStream(ott);          
o.writeObject( hash ); 
String serialized = ott.getText(); 
String encoded = new BASE64Encoder().encodeBuffer(baos.toByteArray());

Und so geht's zurück:
Code:
final String encoded = e.getText(); //Text aus XML Element 
final byte[] decoded = new BASE64Decoder().decodeBuffer(encoded);
final ObjectInputStream i = new ObjectInputStream(new ByteArrayInputStream(decoded));
Code im Browser getippt, also nicht getestet.

Ebenius
 

peez

Bekanntes Mitglied
Hmm.. Funktioniert auch so nicht.
Kann es evt. an dom4j liegen? Wenn ich den selben Weg nämlich innerhalb des Programms nur über Stringvariablen gehe, funktioniert alles.
Wird der Base64 String im XML gespeichert, kommt beim Parsen des XMLs der Fehler "Invalid byte 2 of 2-byte UTF-8 sequence".
Könnte es Sinn machen, mal einen anderen XML parser zu benutzen?
 

peez

Bekanntes Mitglied
Eigentlich auf ganz übliche weise:

Lesen:
Code:
SAXReader reader = new SAXReader();
Document doc = reader.read( src );

Schreiben:
Code:
FileWriter w = new FileWriter( dst );
doc.write( w );
 

Ebenius

Top Contributor
Hmm... Kannst Du mal das XML insgesamt posten? Oder zumindest soweit, dass die charset-Angabe (erste Zeile) drin ist und der Teil der serialisierten Instanz der schief geht?
 

peez

Bekanntes Mitglied
Das sieht so aus:
HTML:
<?xml version="1.0" encoding="UTF-8"?>

<DPSubtitleSet>
  <Project>
    <name>(CREPÚSCULO)subt.inglés</name>
    <additionalData>rO0ABXNyABNqYXZhLnV0aWwuSGFzaHRhYmxlE7sPJSFK5LgDAAJGAApsb2FkRmFjdG9ySQAJdGhy ZXNob2xkeHA/QAAAAAAACHcIAAAACwAAAAB4</additionalData>
    <fps>25.0</fps>
 
Zuletzt bearbeitet:

Murray

Top Contributor
Tritt der Fehler jetzt beim Parsen des XMLs auf? Oder beim Deserialisieren des Objekts aus dem Text-Content des additionalData-Elements heraus?

Ist ersteres der Fall, dann kann es auch an den anderen Sonderzeichen liegen.

Komisch am Base64-encodeten String ist das Leerzeichen - die sollten da eigentlich nicht vorkommen.
 

peez

Bekanntes Mitglied
Der Fehler tritt beim Parsen auf.
Wegen dem Leerzeichen - ich benutze diesen Encoder von Sun, der mit Java mitkommt. Der sollte doch eigentlich funktionieren, oder?
 
S

Spacerat

Gast
Ganz heisser Tip: Schau dir mal den Quelltext von
Code:
(String).getBytes()
in der API an. Dann siehst du so in etwa, was unter Umständen mit deinen Binärdaten beim Serialisieren passiert und warum diese dann nicht wieder deserialisiert werden können. Deie Klasse würde ich wie oben schon vorgeschlagen in einen ByteArrayOutputStream schreiben und anschliessend mit Base64-Encoding in die XML-Datei.
 
S

Spacerat

Gast
... das da "StringCoding.encoding()" verwendet wird. Das bedeutet, das der String encodiert wird, was bei Binärstrings (z.B. Serialisierte Daten) recht fatal sein kann / ist, sobald auch nur ein Byte über 0x7F (127) fälschlicherweise als Unicode interpretiert wird. Binärstrings packt man am besten mit einer eigenen Schleife in ein Array, oder man leitet einen InputStream in einen ByteArrayOutputStream um.
Code:
String tmp = "someBinaryData";
byte[] buffer = new byte[tmp.length()];
for(int n = 0; n < buffer.length; n++) buffer[n] = (byte) (tmp.charAt(n) & 0xFF);
// oder
InputStream in = new FileInputStream("someBinaryData");
ByteArrayOutputStream out = new ByteArrayOutputStream();
int n;
while((n = in.read()) != -1) out.write(n);
in.close();
out.close();
byte[] buffer = out.toByteArray();
 

peez

Bekanntes Mitglied
Habe das Problem gefunden. Das Encoding war immer richtig aber dom4j scheint ein Problem mit UTF-8 speichern zu haben...
Das selbe passiert nämlich auch, wenn innerhalb der XML Texte mit Unicode Zeichen vorkommen.
Habe jetzt auf JAXP umgestellt und schon funktionierts. Muss mich nur noch dran gewöhnen, dass es die Methode .element(String name) nicht mehr gibt ;-)

Ach und weiß jemand, wie man mit diesem Transformer ein "Pretty Print" hinbekommt?
 

Ebenius

Top Contributor
Ach und weiß jemand, wie man mit diesem Transformer ein "Pretty Print" hinbekommt?
Hängt von der Implementation ab. Auf jeden Fall das: [HIGHLIGHT="Java"]transformer.setOutputProperty(OutputKeys.INDENT, "yes"); //$NON-NLS-1$[/HIGHLIGHT]
... und ich mach zusätzlich noch das: [HIGHLIGHT="Java"]transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); //$NON-NLS-1$[/HIGHLIGHT]

Ebenius
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Thallius Hash über serialisiertes Objekt? Allgemeine Java-Themen 3
Developer_X Input/Output Serialisiertes Objekt speichern und laden Allgemeine Java-Themen 1
T Serialisiertes Objekt über Socket nachladen Allgemeine Java-Themen 8
Thallius Serialisiertes File kann auf anderem Rechner nicht geladen werden Allgemeine Java-Themen 12
N Lwjgl 3d Objekt wird schmaler, wenn es sich dreht Allgemeine Java-Themen 0
B Ein Objekt einer Klasse mehreren anderen Klassen zur Verfügung stellen? Allgemeine Java-Themen 6
T Objekt Array Aufgabe mit Busdatenbank Allgemeine Java-Themen 2
Maxi-JOO Klassen Dummy Objekt in anderen Constructor übergeben Allgemeine Java-Themen 5
el_niiinho13 Objekt auf der Konsole ausgeben lassen Allgemeine Java-Themen 8
d.lumpi Aus Einer Klasse auf ein Objekt einer anderen Klasse Zugreifen Allgemeine Java-Themen 1
A Objekt aus anderen Objekten machen Allgemeine Java-Themen 8
SaftigMelo In einem Winkel Objekt bewegen Allgemeine Java-Themen 2
E Datentypen Wie kann ich die Längen der unterschiedlichen Ebenen aus einem Objekt lesen von dem ich weiß, dass es ein mehrdimensionaler Array ist? Allgemeine Java-Themen 3
H Objekt speichern und laden Allgemeine Java-Themen 1
H Objekt speichern und laden Allgemeine Java-Themen 1
J Objekt in Bytestream umwandeln Allgemeine Java-Themen 12
J Wie kann ich von Vornherrein einen Fokus auf ein Objekt entfernen? Allgemeine Java-Themen 3
J Information von getSource() Objekt auslesen Allgemeine Java-Themen 1
Drachenbauer Wie stelle ich fest, ob ein Objekt in meinem Array vorkommt? Allgemeine Java-Themen 5
S Variable als Objekt Name Allgemeine Java-Themen 3
D Input/Output Zwischen zwei ID-Räumen unterscheiden und Objekt löschen Allgemeine Java-Themen 16
L Objekt aus Objekt-array "löschen" Allgemeine Java-Themen 2
T Objekt mit String und Int aus TxT Datei erstellen Allgemeine Java-Themen 23
T Objekt in Array packen Allgemeine Java-Themen 6
K Methodenaufruf mit String / String zu Objekt konvertieren Allgemeine Java-Themen 8
S Neues Objekt darstellen Allgemeine Java-Themen 4
J Best Practice Objekt an alle Klassen verteilen ( Discord Bot ) Allgemeine Java-Themen 7
D Objekt-Suche mit mehreren optionalen Parametern Allgemeine Java-Themen 6
M Klassen Objekt weiter geben Allgemeine Java-Themen 1
B Klassen Objekt erzeugen und Konstruktor aufrufen - Welche Lösung ist besser? Allgemeine Java-Themen 2
L Variablen Eigenes Objekt wie z.B. einen Integer zuweisen Allgemeine Java-Themen 3
D Konstruktor - jedes Objekt einzeln erzeugen - alternative? Allgemeine Java-Themen 8
S Applet Überprüfen ob ein Objekt angeklickt wurde Allgemeine Java-Themen 2
RalleYTN 3D Objekt Translation basierend auf Rotation (Probleme mit Z Rotation) Allgemeine Java-Themen 0
B Von String zu <Objekt> ||Speichern/Laden Allgemeine Java-Themen 17
G Neues Objekt aus List<JsonObject> mit Stream Allgemeine Java-Themen 4
P Threads Objekt im Konstruktor anders wie im Run()-Block Allgemeine Java-Themen 10
R Objekt funktioniert nicht auf iOS Allgemeine Java-Themen 15
K Textdatei als Objekt Allgemeine Java-Themen 4
Viktim Classenname zu Objekt Allgemeine Java-Themen 4
P Entity Objekt Methoden vs Service methoden Allgemeine Java-Themen 2
D Datentypen Klassenattribut aus Objekt in generischer Liste Allgemeine Java-Themen 15
O Klassen Bruch im gleichen Objekt Speichern Allgemeine Java-Themen 1
P Liste zu Objekt umwandeln Allgemeine Java-Themen 4
C Liste checken auf MINDESTENS ein Objekt | Bukkit Allgemeine Java-Themen 3
K Best Practice JFrame Objekt allgemein zugänglich machen Allgemeine Java-Themen 8
B ArrayList in ein Objekt legen Allgemeine Java-Themen 1
D Objekt entlang eines Funktionsgraphens bewegen Allgemeine Java-Themen 6
M Objekt serialisieren/deserialisieren und in einer SQLite-Datenbank speichern Allgemeine Java-Themen 3
D Java Objekt als Service in Runtime registrieren Allgemeine Java-Themen 1
S Interaktion mit einer website (website als Objekt?) Allgemeine Java-Themen 3
J OOP Überwachen, ob ein Objekt erzeugt wird Allgemeine Java-Themen 9
S Byte Array welches in Laufzeit aufgelöst wird // Objekt Array Allgemeine Java-Themen 3
C Generics Objekt in ArrayList Allgemeine Java-Themen 2
L Klassen Konstruktor soll Objekt anderer Klasse erzeugen Allgemeine Java-Themen 2
F Neues Objekt aus .CSV definition Allgemeine Java-Themen 3
K Methoden Objekt wird nicht erkannt Allgemeine Java-Themen 11
P Objekt mit verschiedenen Datentypen Allgemeine Java-Themen 5
T Objekt kontaktiert seinen "erzeuger" Allgemeine Java-Themen 5
S Objekt orientierte Programmierung Allgemeine Java-Themen 7
C Objekt Datenverlust nach Methodenaufruf Allgemeine Java-Themen 9
H JavaFX Von einer Methode auf stage-Objekt zugreifen Allgemeine Java-Themen 3
T WeakReference/PhantomReference: Mitbekommen WELCHES Objekt nun GC'ed wird Allgemeine Java-Themen 2
T Class-Objekt mit URLClassloader Allgemeine Java-Themen 7
P Konsoleneingabe übernehmen und Objekt instanzieren. Allgemeine Java-Themen 5
E Auf Java-Objekt aus anderer Instanz zugreifen Allgemeine Java-Themen 26
L Klassen Polymorphie:2 Attribute gleichen Namens in einem Objekt Allgemeine Java-Themen 6
P Objekt Array in Datei Speichern Allgemeine Java-Themen 3
F Dynamisch ein Objekt einer bestimmten Subklasse erstellen Allgemeine Java-Themen 7
D Player Objekt - Frame über Server anzeigen lassen. Allgemeine Java-Themen 3
V Objekt löschen Allgemeine Java-Themen 7
A OOP Wie auf Objekt der Superklasse zugreifen? Allgemeine Java-Themen 6
S Datei in File-Objekt mit UTF-8 einlesen Allgemeine Java-Themen 2
M neues Objekt speichern, nicht Referenz Allgemeine Java-Themen 10
B synchronisierter zugriff auf Objekt Allgemeine Java-Themen 6
F Objekt einer Datei verschieben, aber Verzeichnispfad fehlt Allgemeine Java-Themen 6
C Objekt Typ herausfinden Allgemeine Java-Themen 5
E Objekt beim Erzeugen in ArrayList Allgemeine Java-Themen 9
M Objekt prüfen auf null ->Invocation Target Exception??? Allgemeine Java-Themen 2
M Objekt aus Liste in Liste suchen/löschen Allgemeine Java-Themen 6
D Eigenen Objekt Pool Allgemeine Java-Themen 15
C blueJ: Objekt wird nicht in Objektleiste angezeigt Allgemeine Java-Themen 8
T Objekt 2x deserialisieren, aber nur 1x im Heap haben? Allgemeine Java-Themen 4
sambalmueslie Benachrichtigung bei neuer Objekt-Instanz Allgemeine Java-Themen 5
U Konstante in Objekt definieren Allgemeine Java-Themen 6
D this mit Objekt überschreiben Allgemeine Java-Themen 17
R Synchronized - auf welchem Objekt Allgemeine Java-Themen 16
E Objekt erstellen Allgemeine Java-Themen 7
M Timer von nicht existiertem Objekt stopen Allgemeine Java-Themen 5
M Swing-Frontend abhängig von ausgewähltem Objekt Allgemeine Java-Themen 4
J Lebt das Objekt noch?? Allgemeine Java-Themen 12
K Objekt einer konkreten Implementierung eines Interfaces durch übergebenen String Allgemeine Java-Themen 2
K Objekt-Austausch zwischen zwei Programmen über System-Clipboard Allgemeine Java-Themen 5
S Performance Frage: Objekt oder static? Allgemeine Java-Themen 33
B Speicherverbrauch Objekt-Referenz Allgemeine Java-Themen 11
D Browser-Objekt erzeugen Allgemeine Java-Themen 8
B FileWriter / FileReader testen / Mock-Objekt für Unit Tests? Allgemeine Java-Themen 6
A Iterationen einer XML-Datei in einem Objekt sichern Allgemeine Java-Themen 5
R Objekt zur Laufzeit zerstören? Allgemeine Java-Themen 12
hdi Frage zur Objekt Initialisierung Allgemeine Java-Themen 4

Ähnliche Java Themen


Oben