如何使继承可序列化类的类不可序列化?

时间:2011-08-13 18:24:58

标签: java inheritance serializable

让我们考虑以下代码:

public class MyPanel extends JPanel {

    private long secretInfo = ...

}

JPanelSerializable。但是,MyPanel不应该是Serializable,因为它包含敏感信息。

如何从Serializable干净地取消/阻止继承的JPanel方面?

3 个答案:

答案 0 :(得分:4)

您将不希望序列化的字段标记为transient

private transient long secretInfo = ...  

您仍然可以序列化MyPanel,但其敏感信息不会被序列化。

此外,您可以考虑另一种设计,其中敏感信息存储在单独的非可序列化类中。

答案 1 :(得分:2)

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

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 = ...
}

答案 2 :(得分:2)

不要扩展JPanel。问题解决了。尝试这样的事情:

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

MyPanel逻辑上代表了您应用中的一个面板,但没有特别要求它来扩展JPanel。作文通常是一种更强大的关系。