2010-05-09 71 views
2

我剛剛開始使用Java序列化:我有一個練習要做,我需要在任何類上鎖定序列化,當我試圖序列化該類時,會引發異常。如何在Java中鎖定序列化?

有誰知道該怎麼做?

+0

僅適用於一個類,或者您嘗試序列化的* any *類? – 2010-05-09 14:18:31

+1

僅供一堂課。 – PaulP89 2010-05-09 14:24:08

回答

1

序列化僅適用於實現Serializable的類(請閱讀此界面的文檔)。我不認爲你可以在運行時切換它。如果您不希望對象可序列化,請不要使它們實現Serializable

如果序列號在您的控制範圍內(即您撥打ObjectOutputStream.writeObject(..)),則只需設置一個禁止該呼叫的配置選項。

另一種選擇是根據配置選項實施writeObject(ObjectOutputStream out)方法並拋出異常。

5

如果添加引發異常的writeObject的實現,則序列化將被中止,例如,

private void writeObject(ObjectOutputStream stream) throws IOException { 
    throw new RuntimeException("Don't want to serialize today"); 
    } 

一個很好的介紹,以覆蓋缺省序列化行爲見http://java.sun.com/developer/technicalArticles/ALT/serialization/

+2

我建議拋出一個更具體的'UnsupportedOperationException'而不是一般的'RuntimeException'。 – 2010-05-09 19:18:34

2

從需要在序列化和反序列化過程中的特殊處理必須實現具有下列準確簽名的特殊方法http://java.sun.com/j2se/1.4.2/docs/api/java/io/Serializable.html

類:

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

你總是可以嘗試超載writeObject與上面的簽名,並拋出異常。

+0

謝謝你的回答,現在我想我明白它是如何工作的。 – PaulP89 2010-05-09 14:22:52

2

您要提供的三種自定義序列化方法是writeObjectreadObjectreadObjectNoData。適當的例外是適當命名的java.io.NotSerializableException

private void writeObject(
    ObjectOutputStream out { 
) throws IOException { 
    throw new NotSerializableException(); 
} 
private void readObject(
    ObjectInputStream in 
) throws IOException, ClassNotFoundException { 
    throw new NotSerializableException(); 
} 
private void readObjectNoData( 
) throws ObjectStreamException { 
    throw new NotSerializableException(); 
} 

甲小動作(雖然在spec實際上不指定)是引起NPE當系統試圖創建匹配java.io.ObjectStreamClass。我 s。

private static final ObjectStreamField[] serialPersistentFields = { null }