有時,我想用ObjectOutputStream
來寫文件或通過網絡發送一個小圖片。但BufferedImage
和許多其他類不執行java.io.Serializable
然後流取消寫入。有沒有辦法避免這種情況?Java:使用無序列化的ObjectOutputStream
感謝,馬亭
有時,我想用ObjectOutputStream
來寫文件或通過網絡發送一個小圖片。但BufferedImage
和許多其他類不執行java.io.Serializable
然後流取消寫入。有沒有辦法避免這種情況?Java:使用無序列化的ObjectOutputStream
感謝,馬亭
只有支持 java.io.Serializable接口的對象可以 寫入流。
但是,您可以通過在javax.imageio
使用類的一個逃避這一切。特別是ImageIO.write(RenderedImage, String, OutputStream)
方法,因爲BufferedImage
執行RenderedImage
。然後您可以將其讀回ImageIO.read(InputStream)
,該返回BufferedImage
。
雖然你可能會想要一個不同的OutputSteam
類型。除了正常的OutputStream
之外,還有幾個特殊的ImageOutputStream
。
編輯:我錯過了在此之前: 要獲取中間參數有效字符串列表,你可以調用ImageIO.getWriterFormatNames()
號這就像說,「我要顯示一個對象作爲文本,但不知道如何將它轉換成字符串任何東西。」
Serializable
的全部目的是說「我知道如何序列化爲流!」 - 如果我們不需要它,我們就不會擁有它。
現在,如果你有一個實現Serializable
但含有一些東西,本身不實現Serializable
的對象,但你可以鍛鍊手序列化的一些方法,你總是可以自定義容器的序列化對象自己。
基本上ObjectOutputStream
是專爲Java的序列化框架而設計的。如果您不想使用序列化框架,請不要使用ObjectOutputStream
。特別是圖像可能有自己的「原生格式」,可以對其進行處理(正如R. Bemrose指出的那樣)。
編寫一個ObjectOutputStream子類,調用enableReplaceObject,然後重寫replaceObject(Object)。您可能還需要一個伴隨ObjectInputStream子類,通過重寫resolveObject(Object)來完成相同操作。
它可能是一個選項,uou使用不同的序列化機制。 JBoss Serialization是標準java.io序列化的直接替換,儘管由於序列化格式不同,讀者和編寫者都需要使用相同的機制。
JBoss序列化不需要類實現java.io.Serializable
,但是不能保證如果對象沒有明確的可序列化,那麼這些對象將在該過程中存活。
處理不可序列化對象的一種方法是簡單地跳過它們。您可以擴展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;
}
}
不錯,趕上 – skaffman 2009-09-03 15:04:49