2009-09-03 8 views
4

Parfois, je veux utiliser un ObjectOutputStream pour écrire quelque chose dans un fichier ou envoyer une petite image sur le réseau. Mais BufferedImage et de nombreuses autres classes ne mettent pas en œuvre java.io.Serializable, puis le flux annule l'écriture. Y at-il un moyen d'éviter cela?Java: Utiliser ObjectOutputStream sans sérialisable

Merci, Martijn

Répondre

8

Seuls les objets qui prennent en charge l'interface de java.io.Serializable peuvent être écrits aux cours d'eau.

- ObjectOutputSteam docs

Cependant, vous pouvez éviter tout cela en utilisant l'une des classes javax.imageio. Plus précisément, la méthode ImageIO.write(RenderedImage, String, OutputStream), car BufferedImage implémente RenderedImage. Vous pouvez ensuite le lire avec ImageIO.read(InputStream), ce qui renvoie un BufferedImage.

Vous voudrez probablement un autre type de OutputSteam, cependant. En plus des OutputStream s normaux, il y a plusieurs ImageOutputStream s spéciaux.

Edit: j'ai raté auparavant: Pour obtenir une liste de chaînes valides pour l'argument du milieu, vous pouvez appeler ImageIO.getWriterFormatNames()

+0

belle prise, que – skaffman

4

Non, c'est comme dire: « Je veux afficher un objet sous forme de texte, mais ne savent pas quoi que ce soit sur la façon de le convertir en une chaîne. »

L'objectif entier de Serializable est de dire "Je sais comment être sérialisé à un flux!" - Si nous n'en avions pas besoin, nous ne l'aurions pas.

Maintenant, si vous avez un objet qui implémente Serializable mais contient quelque chose qui se ne le fait pas mettre en œuvre Serializable, mais que vous pouvez travailler sur une façon de sérialisation à la main, vous pouvez toujours personnaliser la sérialisation du conteneur objet vous .

Fondamentalement ObjectOutputStream est conçu pour la structure de sérialisation de Java. Si vous ne souhaitez pas utiliser le framework de sérialisation, n'utilisez pas ObjectOutputStream. Les images en particulier sont susceptibles d'avoir leur propre "format natif" qui peut être utilisé par ImageIO (comme l'a noté R. Bemrose).

1

Écrivez une sous-classe ObjectOutputStream, appelez enableReplaceObject, puis remplacez replaceObject (Object). Vous avez probablement aussi besoin d'une sous-classe ObjectInputStream compagnon qui fait de même en surchargeant resolveObject (Object).

1

Il peut être une option pour uou d'utiliser un mécanisme de sérialisation différent. JBoss Serialization est un remplacement direct de la sérialisation java.io standard, bien que le format de sérialisation soit différent, les lecteurs et les rédacteurs doivent utiliser le même mécanisme.

JBoss La sérialisation ne nécessite pas de classes pour implémenter java.io.Serializable, cependant il n'y a aucune garantie que les objets survivront au processus s'ils ne sont pas explicitement sérialisables.

1

Une façon de gérer les objets non sérialisables consiste simplement à les ignorer.Vous pouvez étendre ObjectOutputStream et implémenter la méthode replaceObject qui vérifie si l'objet est sérialisable.

public class MyOOS extends ObjectOutputStream { 
    public MyOOS(OutputStream out) throws IOException { 
     super(out); 
     enableReplaceObject(true); 
    } 

    @Override 
    protected Object replaceObject(Object obj) throws IOException { 
     if ((obj instanceof Serializable)) 
      return obj; 
     System.err.println("Skipping serialization of "+obj); 
     return null; 
    } 
} 
Questions connexes