簡體   English   中英

如何使繼承可序列化 class 的 class 不能序列化?

[英]How to make a class inheriting of serializable class not serializable ever?

讓我們考慮以下代碼:

public class MyPanel extends JPanel {

    private long secretInfo = ...

}

JPanel是可Serializable的。 但是, MyPanel永遠不應該是Serializable ,因為它包含敏感信息。

如何徹底取消/防止從JPanel繼承的Serializable方面?

您將不想序列化的字段標記為transient

private transient long secretInfo = ...  

您仍然可以序列化MyPanel ,但它的敏感信息不會被序列化。

此外,您可以考慮另一種設計,其中敏感信息存儲在單獨的不可序列化 class 中。

您可以使用以下方法之一:

public class MyPanel extends JPanel {
    private long secretInfo = ...

    // refuse to be serialized!
    private void writeObject(ObjectOutputStream out) throws IOException {
        throw new IllegalStateException("MyPanel cannot be serialized");
    }
}

或者

public class MyPanel extends JPanel {
    // flag the serialization mechanism to ignore
    // sensitive information
    private transient long secretInfo = ...
}

不要擴展 JPanel。 問題解決了。 嘗試這樣的事情:

class MyPanel {
    void doSomething();
    String getSomeValue();
    JPanel getDisplayComponent();
}

MyPanel 在邏輯上表示您的應用程序中的一個面板,但對於擴展 JPanel 沒有特別的要求。 組合通常是一種更強大的關系。

暫無
暫無

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

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