# Objekt als String serialisieren



## artur.cichosz (8. Mai 2007)

Hallo Zusammen,

Ich möchte Java-Objekte als String serialisieren. Serialisieren in einen FileInputStream wird ja breit beschrieben. 
Ich möchte aber ein Objekt nicht als Datei speichern, sondern es als String serialisieren und in eine XML-Datei packen.
Ich habe mir dafür dann folgendes Verfahren über ByteArrayInputStream zusammengeschustert und es funktioniert unter Windows (Java 1.5.0_11-b03) wie es soll. Unter Linux (Java 1.5.0_09-b03) allerdings kommt es bei der Ausführung zu folgender Exception

Exception in thread "main" java.io.StreamCorruptedException: invalid stream header
        at java.ibjectInputStream.readStreamHeader(Unknown Source)
        at java.ibjectInputStream.<init>(Unknown Source)
        at SerializeTest.deserializeFromString(SerializeTest.java:25)
        at SerializeTest.main(SerializeTest.java:47)

Hat jemand schon mal ähnliches Problem gehabt? Habei ich irgendwas bei dem Serialisierungsschritt vergessen?
Für eine Lösung schonb mal im Voraus Dicken Dank!

Mein Testprogramm gebe ich hier mit.


```
import java.io.*;

public class SerializeTest {

	public String serializeToString (String objectToWrite) 
		throws IOException, ClassNotFoundException {

		OutputStream out = new ByteArrayOutputStream(); 
      	ObjectOutputStream oos = new ObjectOutputStream( out ); 
       	oos.writeObject( objectToWrite ); 
       	oos.close(); 
       	out.close(); 
	       			
       	// String ausgeben
       	String output = out.toString();
	       	
		return output;
	}

	public String deserializeFromString (String serializedObject) 
	throws IOException, ClassNotFoundException {

		byte[] pick = serializedObject.getBytes();
		InputStream in = new ByteArrayInputStream(pick);
		ObjectInputStream ois = new ObjectInputStream(in);
		String deserializedObject = (String) ois.readObject();
		ois.close();
		in.close();
	       	
       	return deserializedObject;
	}

    public static void main( String[] args ) 
		throws IOException, ClassNotFoundException {
    	
    	SerializeTest app = new SerializeTest();

		// construct test object
    	String original = new String("Hello World!");

       	// serialize
    	String output = app.serializeToString(original); 
	       			
        // deserialize
    	String des = app.deserializeFromString(output); 
        
        // test
        System.out.println(des.toString());
    }
   

}
```


----------



## Ullenboom (8. Mai 2007)

Kein Wunder  ByteArrayOutputStream.toString() gibt ja nix gescheites. (Mach mal ein System.out.println(), dann sieht du das.) Du musst eine Konvertierung byte[] vom ByteArrayOutputStream -> String durch Base64 oder, was ich gerne nehme, URLEncoder, vornehmen.

Grüße

 Christian


----------



## Guest (8. Mai 2007)

Es gibt einen Konstruktor in der Klasse String

public String(byte[])


----------



## Philip (8. Mai 2007)

artur.cichosz hat gesagt.:
			
		

> Hallo Zusammen,
> 
> Ich möchte Java-Objekte als String serialisieren. Serialisieren in einen FileInputStream wird ja breit beschrieben.
> Ich möchte aber ein Objekt nicht als Datei speichern, sondern es als String serialisieren und in eine XML-Datei packen.



Um Objekte auf XML und umgekehrt zu mappen gibt es Frameworks, z.B. XML Beans und JAXB. Oder gibt es einen speziellen Grund, alles von Hand zu machen?


----------



## artur.cichosz (8. Mai 2007)

Philip hat gesagt.:
			
		

> artur.cichosz hat gesagt.:
> 
> 
> 
> ...



Ich möchte nicht das Objekt selbst in XML abbilden sondern es nur innerhalb eines anderen XML-Dokuments nur für kurze Zeit zwischen zwei Methoden austauschen - das zu erklären würde jetzt zu weit führen. 
Aber ich habe tatsächlich das gewünschte Ergebnis erzielt indem ich das Objekt mit XStream in XML mappe, was ich wiederum in ein <![CDATA[ ]]> in meinem XML-Dokument unterbringe.

Allerdings ist dieses Verfahren bedeutend langsammer, was ich mit der Serialisierung zu String beschleunigen könnte.


----------



## artur.cichosz (8. Mai 2007)

Habe jetzt nach den zwei ersten Antworten die serialisierende Methode wie folgt geändert. Allerdings ohne Erfolg: Unter Winbows alles Super! Unter Linux die gleiche Exception.


```
public String serializeToString (String objectToWrite) 
		throws IOException, ClassNotFoundException {

			ByteArrayOutputStream out = new ByteArrayOutputStream(); 
			ObjectOutputStream oos = new ObjectOutputStream( out ); 
			oos.writeObject( objectToWrite ); 
			oos.close(); 
			out.close(); 
	       			
			// String ausgeben
			String output = new String(out.toByteArray());
 	       	
			return output;
	}
```



Hat jemand weitere Ansatzpunkte?


----------



## artur.cichosz (10. Mai 2007)

OK habe noch dem Base64 Tip von "Ullenboom" gefolgt und siehe da! Es klappt auch mit Linux. 
Für Base64 habe ich folgende Klasse genommen: http://iharder.sourceforge.net/current/java/base64/

Unten noch mal das Testprogramm.

Vielen Dank


```
import java.io.*;


public class SerializeTest {

	public String serializeToString (String objectToWrite) 
		throws IOException, ClassNotFoundException {

			ByteArrayOutputStream out = new ByteArrayOutputStream(); 
			ObjectOutputStream oos = new ObjectOutputStream( out ); 
			oos.writeObject( objectToWrite ); 
			oos.close(); 
			out.close(); 
	       			
			// String ausgeben
			String output = Base64.encodeBytes( out.toByteArray() );
 	       	
			return output;
	}

	public String deserializeFromString (String serializedObject) 
	throws IOException, ClassNotFoundException {
		
		byte[] pick = Base64.decode(serializedObject);
		InputStream in = new ByteArrayInputStream(pick);
		ObjectInputStream ois = new ObjectInputStream(in);
		String deserializedObject = (String) ois.readObject();
		ois.close();
		in.close();
	       	
       	return deserializedObject;
	}

    public static void main( String[] args ) 
		throws IOException, ClassNotFoundException {
    	
    	SerializeTest app = new SerializeTest();

		// construct test object
    	String original = new String("Hello World!");

       	// serialize
    	String output = app.serializeToString(original); 
	       			
        // deserialize
    	String des = app.deserializeFromString(output); 
        
        // test
        System.out.println(des.toString());
    }
   

}
```


----------



## JPKI (10. Mai 2007)

Philip hat gesagt.:
			
		

> artur.cichosz hat gesagt.:
> 
> 
> 
> ...


Du brauchst noch nicht mal ein extra Framework! Ist alles schon in der Standardbibliothek enthalten (natürlich kannst du auch ein externes Framework verwenden):
www.galileocomputing.de/openbook/javainsel6/javainsel_12_012.htm#mj6f348dad4e2dac39bb3adbb9029ffb76


----------

