# Bilder -> SWT Images in einer Datei serialisieren und des



## volk (23. Jul 2005)

Hallo zusammen,

ich speicher meine Bilder als InputStream in einer Derby-Datenbank als Blob. Die Datenbank kann leider die Bilder nicht in einer Datei exportieren bzw. importieren. Deshalb habe ich mir gedacht ich programmiere selber die Export und Import  Funktionen! Die Export-Funktion funktioniert, indem ich die Bilder als InputStream aus der Datenbank lese und in einem byte[] speichere und anschliessend in einer Datei serialisiere. Man kann leider InputStream oder Images nicht serialisieren! Deswegen byte[]. Ich habe Probleme mit der Import-Funktion!
Beim deserialisieren lese ich das byte array und übergebe an die Klasse ByteArrayInputStream. Anhand des ByteArrayInputStream kann ich ein Image erzeugen! Pustekuchen !?! Irgendetwas passiert mit dem byte array!

Export:


```
InputStream in = blob.getBinaryStream();
byte[] buf = new byte[in.available()];
while (in.read(buf) != -1){}
```

Import !?!
// imageData ist das byte Array

```
in = new ByteArrayInputStream(imageData);
pstm.setBinaryStream(4, in, (int)imageData.length);
```

Wenn ich jetzt das Image, dass ich in die Datenbank importiert habe ansprechen will, dann bekomme ich folgende Exception:


```
org.eclipse.swt.SWTException: Unsupported or unrecognized format
```

Ich habe auch das InputStream vorher und nachher in die Konsole ausgeben lassen. Sie sehen gleich aus!
Hat eine vielleicht eine Idee, wie man unter SWT Images in einer Datei serialisieren bzw. deserialisieren kann?


----------



## AMiGA (25. Jul 2005)

Huhu,

unabhängig von SWT serialisiere/deserialisiere ich Images so:


```
// serialization
ByteArrayOutputStream byteArrayStream = new ByteArrayOutputStream();
ImageIO.write(bufferedImage, "png", byteArrayStream);
```


```
// deserialization
ByteArrayInputStream byteArrayStream = new ByteArrayInputStream(byteArray);
BufferedImage image = ImageIO.read(byteArrayStream);
```


----------



## volk (25. Jul 2005)

Hallo AMiGA,

ich werde es ausprobieren und dir noch Bescheid geben, ob es funktioniert hat!

Ich möchte das Image nicht alleine serialisieren sondern mit anderen Daten zusammen. Ich habe ein DTO-Objekt "Data Transfer Object". Dieses Objekt beihnhaltet setter-Methoden und unterandrem setImage. Nachdem ich meine Daten mit den setter-Methoden gesetzt habe, dann serialisiere ich mein DTO-Objekt.

Jetzt muss ich schauen, wie ich deinen Tipp bei mir im Zusammenhang mit dem DTO-Objekt realisieren kann!

Vielen Dank für den Tipp


----------



## Sky (25. Jul 2005)

Geht ganz einfach, dein DTO-Objekt zu schreiben/lesen:


```
// schreiben
    try {
      ObjectOutputStream oos = new ObjectOutputStream( new FileOutputStream( "c:/file.out" ) );
      oos.writeObject(myObject);
    } catch( IOException ex ) {
      ex.printStackTrace();
    }
    
    // lesen
    try {
      ObjectInputStream ois = new ObjectInputStream( new FileInputStream( "c:/file.out" ) );
      myObject = ois.readObject();
    } catch( IOException ex ) {
    } catch( ClassNotFoundException ex ) {
    }
```
Beim Lesen nur daran denken, dass Du evtl. noch einen Cast durchfürhren musst, wenn 'myObject' nicht vom Typ Object ist.


----------



## tuxedo (5. Sep 2005)

Ich habe ein sehr ähnliches, wenn nicht sogar gleiches Problem:

Ich habe ein Objekt das von JPanel erbt. Darin existieren mehrere Objekte die auch von JPanel erben und die nun auch Images enthalten. 
Versuche ich das "Hauptobjekt" zu serialisieren (habe auch deinen besagten Code getestet) dann kriege ich folgende Fehlermeldung:



> sun.awt.image.ToolkitImage@1b67f74
> java.io.NotSerializableException: sun.awt.image.ToolkitImage
> at java.ibjectOutputStream.writeObject0(Unknown Source)
> at java.ibjectOutputStream.defaultWriteFields(Unknown Source)
> ...



Ich habe alle meine Objekte "serializabe" implementieren lassen. Das Problem scheint aber beim "ToolkitImage" zu liegen. 

Ich will halt irgendwie das ganze Hauptobjekt serialisieren, und nicht die Bilder einzeln (was ja scheinbar machbar ist) zusätzlich zum Hauptobjekt... 

Gibts da eine "einfache" Lösung. Oder gibt es eine andere Bibliothek die ähnlich wie "Image" des sun.awt.image.ToolkitImage funktioniert, sich aber serialisieren lässt ?

Gruss
Alex


----------



## volk (5. Sep 2005)

Hi!

Man kann ein Image leider nicht so einfach serialisieren! Du kannst nur die Daten von Deinem Image als byte-Array serialisieren. Vielleicht kann man auch ImageIO.write verwenden, um Images zu serialisieren!


----------



## tuxedo (6. Sep 2005)

Hi,
habs.. Arbeite einfach mti ImageIcons... Die lassen sich innerhalb eines Objekts 1a serialisieren. UND: Im Prinzip belibt alles beim alten da "intern" ja doch wieder mit Images gearbeitet wird. So irgendwas stand zumindest in "Java ist auch eine Insel 4"...


Für mich funzt das prima und ich muss sogut wie nix umbauen. Einzigster Nachteil: Man kann das ganze nicht so prima komprimieren. Aber das ist nicht weiter wild. Meine serialisierten Objekte sind sowieso nicht groß. 

gruss
Alex


----------



## volk (6. Sep 2005)

Hi!

Die jpeg Bilder sind sowieso komprimiert! Ich weiss nur nicht, warum meine jpeg Bilder, die ich serialisiert habe sich noch einmal mit zip so stark wieder komprimieren lassen!?! Warum?


----------



## tuxedo (8. Sep 2005)

Komische Sache... Hast du mal kontrolliert wie groß ein einfaches serialisiertes JPEG wird ? Ich meine im vergleich zur eigentlichen JPEG Größe...

Gruss
Alex


----------



## volk (8. Sep 2005)

Ich glaube, dass der Overhead von Java so stark komprimiert wird und nicht die jpeg-Bilder!


----------

