2010-02-09 21 views
14

我有一個實現了Serializable的類。現在我擴展了這個類,我想這個擴展類是不可序列化的。那麼該怎麼做呢?將子類作爲java中的不可序列化

例如。我有

class A implements Serializable. 

,我有

class B extends A. 

但我想B類是不可序列化。

+2

這個問題實際上是關於持久性嗎? – 2010-02-09 14:01:22

+0

對於所有可序列化的Swing類恕我直言,這是一個特別的問題。當我將一個(說)'AbstractTableModel'(可序列化)的子類傳遞給'JTable'時,我通常不希望JTable'將序列化模型,但我無法避免要求我的子類可序列化。 – 2016-05-11 13:49:55

回答

13

正如其他人明確表示,這是不可能的Serializable類的子類是不Serializable

如果你想要的是子類的屬性不被序列化,一個選項是讓它們都是瞬態的。

如果您需要更多的(你不想超類的字段被序列化),覆蓋writeObject(ObjectOutputStream)readObject(ObjectInputStream)這裏概述 - https://web.archive.org/web/20120626144013/http://java.sun.com/developer/technicalArticles/ALT/serialization

+1

Sun.com上的鏈接不再有效。這是同一篇文章嗎? http://www.oracle.com/technetwork/articles/java/javaserial-1536170.html – spaaarky21 2014-04-25 15:53:07

+1

@ spaaarky21不,這不是同一篇文章。我已經更新了到archive.org的鏈接。 – Nayuki 2017-03-23 01:55:26

4

這確實不可能。最好的辦法是令B複合/裝飾A.

public class B { 
    private A a = new A(); 

    public void doSomething() { 
     a.doSomething(); 
    } 
} 
+0

如果'B'需要是例如'Throwable','Component'或'Action'的子類,所有這些都是可序列化的,則無法完成。 – 2016-08-10 11:14:53

14

不能刪除的接口,但可以防止系列化在運行時:

class B extends A { 
    private void writeObject(ObjectOutputStream oos) throws IOException { 
     throw new NotSerializableException(); 
    } 
} 
+3

這可能會導致很多問題,當有人檢查你是否實現Serializable然後希望你實際上是可序列化的。 – 2010-02-09 13:19:04

+4

這是Sun推薦的。請參閱http://java.sun.com/developer/technicalArticles/ALT/serialization/(段落標題爲「其他指針」)。 – finnw 2010-02-09 13:30:15

3

這將永遠是序列化的,儘管你可以確保沒有班上曾經被通過使每一個成員transient序列化。

1

回答您的評論的一個(假設你正在談論JPA或休眠的):

但要堅持應實施這裏面希望其對象的任何類。我希望我的B類對象不可持久化。

如果你不希望B具有持久性可言,不要將其標記爲@Entity。但是,如果B不是一個持久性實體恕我直言,B擴展A並沒有意義。這將是一個糟糕的繼承使用。

0

需要實施readObject()和writeObject()方法

+0

在添加答案之前,您必須先閱讀之前提出的解決方案,在這種情況下,您已經提出並且[接受](https://stackoverflow.com/a/2229256/1387113)@Jack Leow !. – hd84335 2018-01-05 13:05:23

相關問題