Java:对可序列化的限制

时间:2011-03-20 20:55:28

标签: java serialization

我有一个实现接口可串行化的A类。有两个子类B和C,它们扩展了A.我希望B类不可序列化?我怎样才能实现它?

5 个答案:

答案 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。