5

有时,我想使用 anObjectOutputStream将内容写入文件或通过网络发送小图像。但是BufferedImage许多其他类没有实现java.io.Serializable,然后 Stream 取消写入。有办法避免吗?

谢谢,马丁

4

5 回答 5

8

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

-- ObjectOutputSteam 文档

但是,您可以通过使用javax.imageio. 特别是ImageIO.write(RenderedImage, String, OutputStream)方法,因为BufferedImage实现RenderedImage. 然后,您可以使用 将其读回ImageIO.read(InputStream),这将返回一个BufferedImage.

不过,您可能需要不同的OutputSteam类型。除了普通OutputStream的s,还有几个特殊ImageOutputStream的s。

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

于 2009-09-03T15:02:49.390 回答
4

不,这就像说,“我想将一个对象显示为文本,但不知道如何将其转换为字符串。”

的全部目的Serializable是说“我知道如何序列化为流!” - 如果我们不需要它,我们就不会拥有它。

现在,如果您有一个实现Serializable但包含本身实现的对象的对象Serializable,但您可以通过某种方式手动进行序列化,您始终可以自己自定义容器对象的序列化。

基本上ObjectOutputStream是为Java的序列化框架设计的。如果您不想使用序列化框架,请不要使用ObjectOutputStream. 特别是图像可能有自己的“本机格式”,ImageIO可以处理(正如 R. Bemrose 指出的那样)。

于 2009-09-03T14:56:34.513 回答
3

处理不可序列化对象的一种方法是简单地跳过它们。您可以扩展 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;
    }
}
于 2011-04-29T00:01:20.903 回答
1

编写一个ObjectOutputStream 子类,调用enableReplaceObject,然后重写replaceObject(Object)。您可能还需要一个伴随的 ObjectInputStream 子类,通过覆盖 resolveObject(Object) 来做同样的事情。

于 2009-09-03T14:57:51.093 回答
1

uou可以选择使用不同的序列化机制。JBoss 序列化是标准 java.io 序列化的直接替代品,尽管由于序列化格式不同,读取器和写入器都需要使用相同的机制。

JBoss 序列化不需要类来实现java.io.Serializable,但是如果对象不是显式可序列化的,则不能保证对象在该过程中仍然存在。

于 2009-09-03T15:04:32.680 回答