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