繁体   English   中英

Java:使用不带序列化的ObjectOutputStream

[英]Java: Use ObjectOutputStream without serializable

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

谢谢,Martijn

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

- ObjectOutputSteam docs

但是,您可以通过使用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所说)。

处理不可序列化对象的一种方法就是跳过它们。 您可以扩展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)来做同样的事情。

可以选择使用不同的序列化机制。 JBoss Serialization是标准java.io序列化的直接替代品,但由于序列化格式不同,读者和编写者都需要使用相同的机制。

JBoss Serialization不需要类来实现java.io.Serializable ,但是如果它们不是显式的Serializable,则无法保证对象将在进程中存活。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM