時々、ファイルに何かを書き込んだり、ネットワークを介して小さな画像を送信したりするのに、ObjectOutputStream
を使いたいことがあります。しかしBufferedImage
と他の多くのクラスはjava.io.Serializable
を実装していないので、ストリームは書き込みをキャンセルします。それを避ける方法はありますか?Java:シリアル化なしでObjectOutputStreamを使用
おかげで、マルタイン、言うようなものだ
時々、ファイルに何かを書き込んだり、ネットワークを介して小さな画像を送信したりするのに、ObjectOutputStream
を使いたいことがあります。しかしBufferedImage
と他の多くのクラスはjava.io.Serializable
を実装していないので、ストリームは書き込みをキャンセルします。それを避ける方法はありますか?Java:シリアル化なしでObjectOutputStreamを使用
おかげで、マルタイン、言うようなものだ
オブジェクトのみが は、ストリームに書き込むことができます。
ただし、javax.imageio
にクラスのいずれかを使用して、すべてこれを避けることができます。具体的には、BufferedImage
がRenderedImage
を実装しているため、ImageIO.write(RenderedImage, String, OutputStream)
メソッドです。 ImageIO.read(InputStream)
でそれを読み取って、BufferedImage
を返します。
おそらく別のOutputSteam
タイプが必要です。通常のOutputStream
に加えて、いくつかの特別なImageOutputStream
があります。私は前にこれを逃した:
編集途中引数の有効な文字列のリストを取得するには 、あなたはそれが uouが異なる直列化機構を使用するための選択肢かもしれImageIO.getWriterFormatNames()
号「私は、テキストなどのオブジェクトを表示したいのですが、文字列に変換する方法については何も知りません。」
Serializable
の全目的は、「私はストリームにシリアル化する方法を知っています!私たちがそれを必要としなければ、私たちはそれを持っていないでしょう。今
あなたがSerializable
を実装していますが、がSerializable
を実装していませんが、あなたは手でシリアル化のいくつかの方法を考え出すことができた、あなたは常にコンテナのシリアライズを自分でオブジェクトをカスタマイズすることができ、それ自体に何かが含まれているオブジェクトがある場合。
基本的にObjectOutputStream
は、Javaのシリアライゼーションフレームワーク用に設計されています。シリアライゼーションフレームワークを使用しない場合は、ObjectOutputStream
を使用しないでください。特に画像は、ImageIO
が扱うことができる独自の "ネイティブフォーマット"を持つ可能性が高い(R. Bemroseが指摘したように)。
ObjectOutputStreamサブクラスを作成し、enableReplaceObjectを呼び出し、replaceObject(Object)をオーバーライドします。あなたはおそらく、コンパニオンのObjectInputStreamサブクラスもresolveObject(Object)をオーバーライドすることによって同じことをする必要があります。 にjava.io.Serializableインタフェースをサポート
を呼び出すことができます。 JBoss Serializationは、標準のjava.ioシリアル化の代わりに使用されますが、シリアライゼーション形式が異なるため、リーダーとライターの両方が同じメカニズムを使用する必要があります。
JBossシリアライゼーションでは、クラスにjava.io.Serializable
を実装する必要はありませんが、オブジェクトが明示的にシリアライズ可能でない場合、そのプロセスが生き残る保証はありません。
シリアル化できないオブジェクトを処理する方法の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;
}
}
nice catch、that catch – skaffman