我有一個實現了Serializable的類。現在我擴展了這個類,我想這個擴展類是不可序列化的。那麼該怎麼做呢?將子類作爲java中的不可序列化
例如。我有
class A implements Serializable.
,我有
class B extends A.
但我想B類是不可序列化。
我有一個實現了Serializable的類。現在我擴展了這個類,我想這個擴展類是不可序列化的。那麼該怎麼做呢?將子類作爲java中的不可序列化
例如。我有
class A implements Serializable.
,我有
class B extends A.
但我想B類是不可序列化。
正如其他人明確表示,這是不可能的Serializable
類的子類是不Serializable
。
如果你想要的是子類的屬性不被序列化,一個選項是讓它們都是瞬態的。
如果您需要更多的(你不想超類的字段被序列化),覆蓋writeObject(ObjectOutputStream)
和readObject(ObjectInputStream)
這裏概述 - https://web.archive.org/web/20120626144013/http://java.sun.com/developer/technicalArticles/ALT/serialization
Sun.com上的鏈接不再有效。這是同一篇文章嗎? http://www.oracle.com/technetwork/articles/java/javaserial-1536170.html – spaaarky21 2014-04-25 15:53:07
@ spaaarky21不,這不是同一篇文章。我已經更新了到archive.org的鏈接。 – Nayuki 2017-03-23 01:55:26
不可能。 Liskov Substitution Principle和所有。
這確實不可能。最好的辦法是令B複合/裝飾A.
public class B {
private A a = new A();
public void doSomething() {
a.doSomething();
}
}
如果'B'需要是例如'Throwable','Component'或'Action'的子類,所有這些都是可序列化的,則無法完成。 – 2016-08-10 11:14:53
不能刪除的接口,但可以防止系列化在運行時:
class B extends A {
private void writeObject(ObjectOutputStream oos) throws IOException {
throw new NotSerializableException();
}
}
這可能會導致很多問題,當有人檢查你是否實現Serializable然後希望你實際上是可序列化的。 – 2010-02-09 13:19:04
這是Sun推薦的。請參閱http://java.sun.com/developer/technicalArticles/ALT/serialization/(段落標題爲「其他指針」)。 – finnw 2010-02-09 13:30:15
這將永遠是序列化的,儘管你可以確保沒有班上曾經被通過使每一個成員transient
序列化。
回答您的評論的一個(假設你正在談論JPA或休眠的):
但要堅持應實施這裏面希望其對象的任何類。我希望我的B類對象不可持久化。
如果你不希望B具有持久性可言,不要將其標記爲@Entity
。但是,如果B不是一個持久性實體恕我直言,B擴展A並沒有意義。這將是一個糟糕的繼承使用。
需要實施readObject()和writeObject()方法
在添加答案之前,您必須先閱讀之前提出的解決方案,在這種情況下,您已經提出並且[接受](https://stackoverflow.com/a/2229256/1387113)@Jack Leow !. – hd84335 2018-01-05 13:05:23
這個問題實際上是關於持久性嗎? – 2010-02-09 14:01:22
對於所有可序列化的Swing類恕我直言,這是一個特別的問題。當我將一個(說)'AbstractTableModel'(可序列化)的子類傳遞給'JTable'時,我通常不希望JTable'將序列化模型,但我無法避免要求我的子類可序列化。 – 2016-05-11 13:49:55