Java:使用不带序列化的ObjectOutputStream

Mar*_*aux 4 java io serialization objectoutputstream

有时,我想使用an ObjectOutputStream来写文件或通过网络发送一些小图像.但是BufferedImage许多其他类没有实现java.io.Serializable,然后Stream取消了写入.有没有办法避免这种情况?

谢谢,Martijn

Pow*_*ord 8

只有支持java.io.Serializable接口的对象才能写入流.

- ObjectOutputSteam docs

但是,您可以通过使用其中一个类来避免所有这些javax.imageio.特别是ImageIO.write(RenderedImage, String, OutputStream)方法,因为BufferedImage实现RenderedImage.然后你可以用它来回读它ImageIO.read(InputStream),它返回一个BufferedImage.

不过,你可能想要一种不同的OutputSteam类型.除了正常的OutputStreams,还有几个特殊的ImageOutputStreams.

编辑:之前我错过了:要获得中间参数的有效字符串列表,您可以调用 ImageIO.getWriterFormatNames()


小智 5

处理不可序列化对象的一种方法是跳过它们。您可以扩展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;
    }
}
Run Code Online (Sandbox Code Playgroud)