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

Aar*_*lla 18 java serialization coding-style

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

如果你TableModel通过扩展来实现一个新的AbstractTableModel,那么新模型必须是可序列化的,但是如果它包含不可序列化的内部数据类型,并且因为你不打算使用这个特性而不必这样做呢?

在这种情况下,像Sonar这样的工具会变得疯狂.要么抱怨"类Foo定义非瞬态非可序列化实例字段bar".

因此,我transient只是为了得到"该字段Foo.bar是暂时的,但不是通过反序列化设置"

是否有可能说"不,这个类不可序列化,我不希望它"以这样的方式,你不会在像Sonar这样的工具中出现任何错误?

sky*_*der 25

引用这篇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() );
}
Run Code Online (Sandbox Code Playgroud)

  • 听起来很奇怪:在序列化时实现Interface Serializable并抛出NotSerializableException.我看到的唯一方法是创建一个Proxy-Class,它不是可序列化的委托,具体实现的所有方法.但这就像是一只小小的小鸟. (2认同)

uri*_*rir 6

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

要么

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