使类不可序列化的好方法是什么?

2022-09-02 12:35:27

Java包含许多类(如Swing),它们实现了可怕且容易出错的接口Serializable

例如,如果您通过扩展来实现一个新的模型,则新模型必须是可序列化的,但是如果它包含不可序列化的内部数据类型,并且由于您不打算使用此功能而不必序列化,该怎么办?TableModelAbstractTableModel

在这种情况下,像Sonar这样的工具会发疯。要么抱怨“类定义了非瞬态不可序列化的实例字段”。Foobar

因此,我创建该字段只是为了获得“该字段是瞬态的,但不是由反序列化设置的”transientFoo.bar

是否可以说“不,这个类是不可序列化的,我不希望它是”,这样你就不会在Sonar这样的工具中得到任何错误?


答案 1

引用这篇 JavaRevisited 文章(参见 #8):

为了避免java序列化,你需要在你的类中实现 writeObject() 和 readObject() 方法,并且需要从这些方法中抛出 NotSerializableException。

所以你只需要把它粘贴到你的类中:

private void writeObject(java.io.ObjectOutputStream stream) throws java.io.IOException {
    throw new java.io.NotSerializableException( getClass().getName() );
}

private void readObject(java.io.ObjectInputStream stream) throws java.io.IOException, ClassNotFoundException {
    throw new java.io.NotSerializableException( getClass().getName() );
}

答案 2

实现和抛出的方法writeObject()readObject()NotSerializableException

http://docs.oracle.com/javase/6/docs/platform/serialization/spec/security.html#4214