2011-09-14 127 views
1

我正在閱讀blog,有一個問題來到我的頭上。是否有可能覆蓋ObjectOutputStream的寫法。自定義Java序列化

比方說,我寫一個文件out.dat即

ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(new File("C:\\out.dat"))); 
out.writeObject(o); 

當我在記事本打開該文件out.dat ++,我看到了二進制數據。這是有道理的。如果我想定製這些數據寫入的方式,該怎麼辦?比方說,我想我的out.dat文件在JSON格式(這只是一個例子,它可以是任何其他格式)。我應該覆蓋什麼方法來做到這一點?

回答

0

我敢肯定,java沒有內部支持序列化到JSON。在我看來,最好的辦法是創建一個接口,用於獲取JSON並有JSON你想序列化的任何對象實現這個接口:

public interface IJSONSerializable{ 
    public String getSerializedForm(); 
} 

,然後使用基本FileOutputStream輸出,因爲(我的理解)ObjectOutputStream用於將對象序列化爲二進制,並且不具有固有的JSON支持。

其他的想法

如果你選擇走這條路,你可以寫一個輔助類寫出來的東西,如一個屬性和一個值。

1

我認爲你應該這樣做,因爲這種格式是用來保持層之間的通信(使用網絡上的分佈式對象)。你可以做的只是創建一個處理程序,使用你漂亮的格式將你的對象存儲在一個文件中。

+0

他爲什麼不應該這樣做?這不是最有效的轉換(但是既不是默認的java序列化),但它經常在Web上使用,而不會造成太大的問題。只要他做得對,數據在傳輸時看起來像什麼樣子是相當無趣的。 – Voo

0

那麼Java本身沒有對JSON序列化的內置支持,但是我相信你可以找到這樣做的框架 - 或者只是自己編寫簡單的類。

所以對於要在JSON格式序列化任何類只是簡單地覆蓋

private void writeObject(java.io.ObjectOutputStream out) 
    throws IOException 
private void readObject(java.io.ObjectInputStream in) 
    throws IOException, ClassNotFoundException; 

應該不會太硬,如果有一些JSON框架在那裏,讓你在字符串格式和副一個實例的數據反之亦然。

1

你可以讓你的對象實現Externalizable並完全控制序列化。使用例如當執行readExternal/writeExternal方法時,JSON爲google-gson

1

在您的情況,您正在尋找一個自定義序列化機制,我會建議您實現Externalizable接口,並提供了方法的實現

public void writeExternal(ObjectOutput out) throws IOException

public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException

它完全取決於你在這種情況下你想如何序列化。