# XML-Serialisierung beeinflussen



## SEA (29. Mai 2008)

Hallo Java-Community ;-)

Ich möchte ein Objekt mit Hilfe von java.beans.XMLEncode serialisieren. Bei der Serialisierung bestimmter Klassen möchte ich aber das Serialisierungsverhalten beeinflussen.

Mein Ziel ist es alle Attribute, die vom Typ Byte-Array sind, mit base64-Codierung zu speichern.

Da das noch etwas kompliziert ist, versuche ich erst einmal die Serialisierung von Strings zu verändern.

Mein folgendes Beispiel soll für den zu serialisierenden String noch die Länge ausgeben. Aber das tut der Serialisierer nicht ;-)

(die Klasse Test hat nur ein Attribut vom Typ String)


```
import java.beans.Encoder;
import java.beans.Expression;
import java.beans.PersistenceDelegate;
import java.beans.XMLEncoder;
import java.io.ByteArrayOutputStream;
import java.io.IOException;

public class XMLSerTester2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		XMLEncoder xmlos = new XMLEncoder(baos);
		xmlos.writeObject(new Test("Hallo"));
		xmlos.writeObject(new byte[]{1, 2, 3});

		xmlos.setPersistenceDelegate(Test.class, new PersistenceDelegate() {
			protected Expression instantiate(Object oldInstance, Encoder out) {
				return new Expression(oldInstance, oldInstance.getClass(),
						"length", new Object[] { oldInstance.toString().length() });
			}
		});

		xmlos.close();
		System.out.println(new String(baos.toByteArray()));
		try {
			baos.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
```

Ergebnis:

```
<?xml version="1.0" encoding="UTF-8"?> 
<java version="1.6.0_05" class="java.beans.XMLDecoder"> 
 <object class="Test"> 
  <void property="string"> 
   <string>Hallo</string> 
  </void> 
 </object> 
 <array class="byte" length="3"> 
  <void index="0"> 
   <byte>1</byte> 
  </void> 
  <void index="1"> 
   <byte>2</byte> 
  </void> 
  <void index="2"> 
   <byte>3</byte> 
  </void> 
 </array> 
</java>
```

Kann mir jemand zu diesem Problem ein paar Tipps geben?

Viele Grüße
SEA


----------



## Wildcard (30. Mai 2008)

XMLEncoder ist zur einfachen Serialisierung von Java *Beans* gedacht. Verwende eine XML API, oder ein XML Bindung Framework.


----------



## Guest (31. Mai 2008)

Ok, Danke für deine Antwort ;-)

Ich hatte übrigens noch einen Bug in meinem Quelltext ... setPersistenceDelegate() muss natürlich vor writeObject() stehen. Aber das Problem mit dem Byte-Array konnte ich bisher noch nicht lösen.

Ich habe aber vor, folgenden work around zu programmieren:


```
public class Base64ByteArray {

private String base64 = "";

public String getBase64() {
return base64ByteArray;
}

public void setBase64() { ... }


public byte[] decodeBase64() {
return new BASE64Decoder().decode(base64ByteArray);
}

public void encodeBase64(byte[] byteArray) {
base64ByteArray = new BASE64Encoder().encode(byteArray);
}

}
```

Was denkt ihr?
Ist das sinnvoll?

(Ich möchte, dass mein Programm möglichst nur mit den Standard-Bibliotheken von Java auskommt und keine anderen APIs verwendet.)

Viele Grüße
SEA


----------



## foobar (31. Mai 2008)

JAXB oder DOM+XPath sind auch Standardapis des JDK und bieten mehr möglichkeiten als der simple XmlEncoder. Benutz mal die Forensuche.


----------



## Wildcard (31. Mai 2008)

Base64Decoder/Encoder sind übrigens proprietäre Sun Klassen (erkennst du am Package). Die solltest du nicht verwenden.


----------



## Guest (3. Jun 2008)

Ok, gibt es eine ähnliche, weit verbreitete Möglichkeit, Byte-Arrays in XML darzustellen, die frei oder open source ist?


----------

