【问题标题】:Java: Use ObjectOutputStream without serializableJava:使用没有可序列化的 ObjectOutputStream
【发布时间】:2010-11-25 07:49:14
【问题描述】:

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

谢谢,马丁

【问题讨论】:

    标签: java serialization io objectoutputstream


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        仅支持 java.io.Serializable接口可以是 写入流。

        -- ObjectOutputSteam docs

        但是,您可以通过使用javax.imageio 中的类之一来避免这一切。特别是ImageIO.write(RenderedImage, String, OutputStream) 方法,因为BufferedImage 实现了RenderedImage。然后,您可以使用 ImageIO.read(InputStream) 将其读回,这将返回 BufferedImage

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

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

        【讨论】:

          【解决方案4】:

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

          JBoss 序列化不需要类来实现java.io.Serializable,但是如果对象不是显式可序列化的,则无法保证这些对象将在该过程中继续存在。

          【讨论】:

            【解决方案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;
                }
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-01-09
              • 2012-04-04
              • 2015-08-13
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多