2009-09-03 27 views

回答

8

只有支持 java.io.Serializable接口的對象可以 寫入流。

- ObjectOutputSteam docs

但是,您可以通過在javax.imageio使用類的一個逃避這一切。特別是ImageIO.write(RenderedImage, String, OutputStream)方法,因爲BufferedImage執行RenderedImage。然後您可以將其讀回ImageIO.read(InputStream),該返回BufferedImage

雖然你可能會想要一個不同的OutputSteam類型。除了正常的OutputStream之外,還有幾個特殊的ImageOutputStream

編輯:我錯過了在此之前: 要獲取中間參數有效字符串列表,你可以調用ImageIO.getWriterFormatNames()

+0

不錯,趕上 – skaffman 2009-09-03 15:04:49

4

號這就像說,「我要顯示一個對象作爲文本,但不知道如何將它轉換成字符串任何東西。」

Serializable的全部目的是說「我知道如何序列化爲流!」 - 如果我們不需要它,我們就不會擁有它。

現在,如果你有一個實現Serializable但含有一些東西,本身實現Serializable的對象,但你可以鍛鍊手序列化的一些方法,你總是可以自定義容器的序列化對象自己。

基本上ObjectOutputStream是專爲Java的序列化框架而設計的。如果您不想使用序列化框架,請不要使用ObjectOutputStream。特別是圖像可能有自己的「原生格式」,可以對其進行處理(正如R. Bemrose指出的那樣)。

1

編寫一個ObjectOutputStream子類,調用enableReplaceObject,然後重寫replaceObject(Object)。您可能還需要一個伴隨ObjectInputStream子類,通過重寫resolveObject(Object)來完成相同操作。

1

可能是一個選項,uou使用不同的序列化機制。 JBoss Serialization是標準java.io序列化的直接替換,儘管由於序列化格式不同,讀者和編寫者都需要使用相同的機制。

JBoss序列化不需要類實現java.io.Serializable,但是不能保證如果對象沒有明確的可序列化,那麼這些對象將在該過程中存活。

1

處理不可序列化對象的一種方法是簡單地跳過它們。您可以擴展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; 
    } 
}