有时候,我想使用ObjectOutputStream
将某些内容写入文件或通过网络发送一些小图像。但是BufferedImage
和许多其他类没有实现java.io.Serializable
,然后Stream取消了写入。有没有办法避免这种情况?
谢谢,Martijn
答案 0 :(得分:8)
仅支持的对象 java.io.Serializable接口即可 写入溪流。
但是,您可以使用javax.imageio
中的一个类来避免这一切。特别是ImageIO.write(RenderedImage, String, OutputStream)
方法,因为BufferedImage
实现了RenderedImage
。然后,您可以使用ImageIO.read(InputStream)
将其朗读,然后返回BufferedImage
。
但是,您可能想要一个不同的OutputSteam
类型。除了正常的OutputStream
之外,还有几个特殊的ImageOutputStream
s。
编辑:之前我错过了这个:
要获取中间参数的有效字符串列表,可以调用ImageIO.getWriterFormatNames()
答案 1 :(得分:4)
没有。这就像说,“我想将对象显示为文本,但不知道如何将其转换为字符串。”
Serializable
的全部目的是说“我知道如何序列化为流!” - 如果我们不需要它,我们就不会拥有它。
现在,如果你有一个实现Serializable
但是包含不实现Serializable
的东西的对象,但你可以用手工编制一些方法,你总是可以自己定制容器对象的序列化。
基本上ObjectOutputStream
是为Java的序列化框架而设计的。如果您不想使用序列化框架,请不要使用ObjectOutputStream
。特别是图像可能有ImageIO
可以处理的“原生格式”(正如R. Bemrose所说)。
答案 2 :(得分:2)
处理非可序列化对象的一种方法就是跳过它们。您可以扩展ObjectOutputStream并实现replace Object方法,该方法检查对象是否可序列化。
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;
}
}
答案 3 :(得分:1)
编写ObjectOutputStream子类,调用enableReplaceObject,然后重写replaceObject(Object)。您可能还需要一个伴随的ObjectInputStream子类通过重写resolveObject(Object)来做同样的事情。
答案 4 :(得分:1)
可能是您使用其他序列化机制的选项。 JBoss Serialization是标准java.io序列化的替代品,但由于序列化格式不同,读者和编写者都需要使用相同的机制。
JBoss Serialization不需要类来实现java.io.Serializable
,但是如果它们不是显式的Serializable,则不能保证对象能够在进程中存活。