2012-10-11 79 views
14

Java包含很多類(如Swing),它們實現了dreaded and error proneinterface Serializable什麼是使一個類不可序列化的好方法?

如果你實現了,說,一個新的TableModel通過擴展AbstractTableModel,新車型必須是序列化的,但如果它包含不可序列並不必是因爲你不打算內部數據類型是什麼反正使用這個功能?

在這種情況下,像Sonar這樣的工具會發瘋。要麼抱怨說「類Foo定義了非瞬時不可序列化實例字段bar」。

所以我做的那場transient剛剛拿到「這個領域Foo.bar是短暫的,但不是由反序列化設置」

是否可以說「不,這個類是不可序列,和我不你是否希望它「以這樣的方式,你不會在像Sonar這樣的工具中出現任何錯誤?

+0

不聲納支持警告爲個人類抑制?在IntelliJ中,您可以選擇爲此類檢查添加@SuppressWarning以供您參考。 –

+0

Sonar只在您的代碼上運行FindBugs,PMD和CheckStyle並彙總結果。所以一個讓這三個安靜的解決方案對我來說很有用。 '@ SuppressWarning'按預期工作。還有一些插件允許忽略文件名,路徑或字符串模式等警告。 –

+0

這不是什麼'短暫'的目的? – EJP

回答

20

從這個JavaRevisited article引用(見#8):

爲避免你需要實現的writeObject()和readObject()方法,在你的類,需要從這些方法拋出NotSerializableException Java序列化。

所以,你只需要粘貼到您的類:

private void writeObject(java.io.ObjectOutputStream stream) throws java.io.IOException { 
    throw new java.io.NotSerializableException(getClass().getName()); 
} 

private void readObject(java.io.ObjectInputStream stream) throws java.io.IOException, ClassNotFoundException { 
    throw new java.io.NotSerializableException(getClass().getName()); 
} 
+0

哇,不知道'NotSerializableException' – AlexR

+0

我驗證了這個解決方案,它的工作原理。 Sonar,FindBugs和PMD似乎都檢查'NotSerializableException'。 –

+2

聽起來很奇怪:在序列化時實現接口Serializable並拋出NotSerializableException。我看到的唯一方法是創建一個Proxy-Class,它不是可序列化的,而是將所有方法委託給具體的實現。但是,這就像一個小小的鳥兒一樣。 –

0

我能想到的實施方法private void writeObject()如下:

private void writeObject(ObjectOutputStream oos) throws IOException { 
    throw new UnsupportedOperationException("Not serializable!!!"); 
} 

或者你可以實現Externalizable和寫similiar實施writeExternal()

兩者都不是「好」的方法,但只是解決方法。

1

我在這裏看到的答案實際上只是回答是否有可能阻止某些標記爲可序列化的類的序列化或反序列化。但問題是另一個:

'是否可以說「不,這個類是不可序列化的,我不希望它是」以這種方式,你沒有得到任何Sonar等工具出現錯誤?

(所以我想知道這些答案以及許多上了票...)

周圍的答案Google'ing似乎是「不」,聲納可以說,這樣的類是「假積極「,但這需要修補Sonar。開發由其他人的Sonar檢查代碼的開發人員不能從這種可能性中受益。

而且由於這個問題實際上要求爲「Sonar」等其他工具提供解決方案,所以答案總的來說不能是「是」---當然這樣的工具會堅持「實現Serializable +可序列化的非瞬態場「意味着麻煩。

+1

他們得到upvotes,因爲他們提出了一個解決方案。 – Matsemann

+0

哦,我明白了,原來的海報試過了,有問題的工具確實在尋找那個例外。所以答案確實意味着一個解決方案... – mkl

1

你可以使用類似的東西?

@SuppressFBWarnings(justification = "This field need to be transient") 
private transient SomeObject myTransientField; 

您將抑制Findbug警告。您還可以指定要suprres像驗證類型:

@SuppressFBWarnings("SE_TRANSIENT_FIELD_NOT_RESTORED") 

完整列表有:http://findbugs.sourceforge.net/bugDescriptions.html

+0

我看到你想要做什麼,但我只有'瞬態',因爲FindBugs抱怨字段不是可序列化的。我正在尋找的是一種告訴Sonar的方法,該類不能也不會被序列化。 –

相關問題