我有一个实现接口可串行化的A类。有两个子类B和C,它们扩展了A.我希望B类不可序列化?我怎样才能实现它?
答案 0 :(得分:3)
根据定义,如果Java类实现了Serializable
接口,那么它是可序列化的,可序列化的类不能具有非可序列化的子类。
因此,在继承树的高级实现该接口或在接口中扩展它之前,应该三思而后行。我知道顶级IIdentifiable
接口扩展Serializable
的项目,强制所有域类都可序列化。不幸的是(对于想要使用该功能的同事),其中许多在实践中不可序列化,因为:
您可以通过以下几种方式阻止序列化:
Serializable
类型的成员变量(如jefflub的回答所示)或private void writeObject(java.io.ObjectOutputStream out) throws IOException
(具有确切的签名)并在该方法中抛出IOException
,任何序列化类的尝试都会引发异常。
答案 1 :(得分:1)
对于B类,添加一个不可序列化的成员变量:
public class B extends A
{
NoSerialize stopper = new NoSerialize();
// other instance stuff
private class NoSerialize
{
// Not sure if you'll need instance stuff here...
}
}
尝试序列化这应该抛出异常,因为stop成员变量不可序列化。
答案 2 :(得分:1)
我会实现writeObject
方法并让它抛出异常。
答案 3 :(得分:1)
我不确定上下文,但你应该再看一下你的设计。遵循IS-A继承原则,类型B或C的对象也是A类的成员,因此应该是Serializable(因为A是)。如果您不能自由地重新设计对象层次结构,那么其他答案中提到的一些黑客将起作用,但您应该认识到设计远非理想,并且在确定哪些接口时将来会非常谨慎应该实现一个可子类化的类。
答案 4 :(得分:0)
我认为你不能这样做,但你可以在其某些属性上使用关键字transient。