代码之家  ›  专栏  ›  技术社区  ›  GuruKulki

用Java实现子类不可串行化

  •  16
  • GuruKulki  · 技术社区  · 15 年前

    我有一个实现可序列化的类。现在我扩展了这个类,我希望这个扩展类是不可序列化的。那么怎么做呢?

    例如。我有

    class A implements Serializable.
    

    而且我有

    class B extends A.
    

    但我希望类B是不可序列化的。

    7 回复  |  直到 7 年前
        1
  •  13
  •   Nayuki James111    8 年前

    正如其他人所说,它不可能是 Serializable 非类- 可串行化的 .

    如果您希望子类的属性不被序列化,一个选项是使它们都是暂时的。

    如果您需要更多(不希望序列化超级类字段),请重写 writeObject(ObjectOutputStream) readObject(ObjectInputStream) 如本文所述- https://web.archive.org/web/20120626144013/http://java.sun.com/developer/technicalArticles/ALT/serialization

        2
  •  15
  •   finnw    15 年前

    无法删除接口,但可以在运行时阻止序列化:

    class B extends A {
        private void writeObject(ObjectOutputStream oos) throws IOException {
            throw new NotSerializableException();
        }
    }
    
        3
  •  4
  •   BalusC    15 年前

    这确实不可能。你最好的选择是让B组合/装饰A。

    public class B {
        private A a = new A();
    
        public void doSomething() {
            a.doSomething();
        }
    }
    
        4
  •  3
  •   Michael Borgwardt    15 年前

    不可能。 Liskov Substitution Principle 等等。

        5
  •  3
  •   Cuga    15 年前

    它将始终是可序列化的,尽管通过使每个成员 transient .

        6
  •  1
  •   Pascal Thivent    15 年前

    回答你的一条评论(假设你在谈论JPA或Hibernate):

    但是任何希望其对象被持久化的类都应该实现这一点。我希望我的B类对象是不可持久的。

    如果你一点也不想让B坚持下去,不要把它标为 @Entity . 但是,如果B不是一个持久的实体imho,那么B扩展A并没有真正意义。这将是对继承的不良利用。

        7
  •  0
  •   sivaram    7 年前

    需要实现ReadObject()和WriteObject()方法