簡體   English   中英

為什么java.io.Serializable不是一個類?

[英]Why is java.io.Serializable not a class?

我理解這個問題聽起來很奇怪,但我想知道為什么java.io.Serializable接口已經被精確地實現為一個接口,而不是一個類?

讓我思考這一點的是,我們正在談論覆蓋 readObject / writeObject方法,而根據定義,我們不會覆蓋它們(即,我們的Serializable對象沒有已經實現這些方法的超類型)。

因此,如果Serializable是一個類,它可以實現默認的 readObject / writeObject方法,然后執行類可以真正覆蓋所述方法。


這是一個不起作用的解決方法,說明了我的話:

public class Serializable implements java.io.Serializable {

    private static final long serialVersionUID = 356223041512972356L;

    protected void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException {
        stream.defaultReadObject();
    }

    protected void writeObject(ObjectOutputStream stream) throws IOException {
        stream.defaultWriteObject();
    }

}

public class MyClass extends Serializable {

    private static final long serialVersionUID = -5437634103734137046L;

    @Override
    protected void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException {
        super.readObject(stream);
        // custom readObject method
    }

}

PS:提供的解決方法不起作用,因為當我的protected時,必須將readObject / writeObject方法聲明為private

因為如果你想從另一個類繼承並實現Serializable你真的搞砸了。 這是Java在選擇不支持真正的多重繼承時所做的一般權衡。

你會注意到Java 2.0語言(Groovy和Scala)通過他們所謂的traits或mixins來改變這個決定 - 它們的設計非常精確 ,所以你可以“混入”例如Serializable功能,而不是邏輯上只是從它派生 - 這你可以把你作為一個非常好的觀點作為證據,而Java本來可以很好地聽取你的意見。

如果java.io.Serializable是一個類,那么你將無法從另一個基類繼承。

換句話說,它是繼承或序列化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM