让我们考虑以下代码:
public class MyPanel extends JPanel {
private long secretInfo = ...
}
JPanel
是Serializable
。但是,MyPanel
不应该是Serializable
,因为它包含敏感信息。
如何从Serializable
干净地取消/阻止继承的JPanel
方面?
答案 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。作文通常是一种更强大的关系。