2009-09-03 9 views
4

時々、ファイルに何かを書き込んだり、ネットワークを介して小さな画像を送信したりするのに、ObjectOutputStreamを使いたいことがあります。しかしBufferedImageと他の多くのクラスはjava.io.Serializableを実装していないので、ストリームは書き込みをキャンセルします。それを避ける方法はありますか?Java:シリアル化なしでObjectOutputStreamを使用

おかげで、マルタイン、言うようなものだ

答えて

8

オブジェクトのみが は、ストリームに書き込むことができます。

からObjectOutputSteam docs

ただし、javax.imageioにクラスのいずれかを使用して、すべてこれを避けることができます。具体的には、BufferedImageRenderedImageを実装しているため、ImageIO.write(RenderedImage, String, OutputStream)メソッドです。 ImageIO.read(InputStream)でそれを読み取って、BufferedImageを返します。

おそらく別のOutputSteamタイプが必要です。通常のOutputStreamに加えて、いくつかの特別なImageOutputStreamがあります。私は前にこれを逃した:

編集途中引数の有効な文字列のリストを取得するには 、あなたはそれ uouが異なる直列化機構を使用するための選択肢かもしれImageIO.getWriterFormatNames()

+0

nice catch、that catch – skaffman

4

号「私は、テキストなどのオブジェクトを表示したいのですが、文字列に変換する方法については何も知りません。」

Serializableの全目的は、「私はストリームにシリアル化する方法を知っています!私たちがそれを必要としなければ、私たちはそれを持っていないでしょう。今

あなたがSerializableを実装していますが、Serializableを実装していませんが、あなたは手でシリアル化のいくつかの方法を考え出すことができた、あなたは常にコンテナのシリアライズを自分でオブジェクトをカスタマイズすることができ、それ自体に何かが含まれているオブジェクトがある場合。

基本的にObjectOutputStreamは、Javaのシリアライゼーションフレームワーク用に設計されています。シリアライゼーションフレームワークを使用しない場合は、ObjectOutputStreamを使用しないでください。特に画像は、ImageIOが扱うことができる独自の "ネイティブフォーマット"を持つ可能性が高い(R. Bemroseが指摘したように)。

1

ObjectOutputStreamサブクラスを作成し、enableReplaceObjectを呼び出し、replaceObject(Object)をオーバーライドします。あなたはおそらく、コンパニオンのObjectInputStreamサブクラスもresolveObject(Object)をオーバーライドすることによって同じことをする必要があります。 にjava.io.Serializableインタフェースをサポート

1

を呼び出すことができます。 JBoss Serializationは、標準のjava.ioシリアル化の代わりに使用されますが、シリアライゼーション形式が異なるため、リーダーとライターの両方が同じメカニズムを使用する必要があります。

JBossシリアライゼーションでは、クラスにjava.io.Serializableを実装する必要はありませんが、オブジェクトが明示的にシリアライズ可能でない場合、そのプロセスが生き残る保証はありません。

1

シリアル化できないオブジェクトを処理する方法の1つは、スキップするだけです。ObjectOutputStreamを拡張し、オブジェクトが直列化可能かどうかを調べるreplaceObjectメソッドを実装できます。

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; 
    } 
} 
関連する問題