2010-02-09 9 views
14

Ich habe eine Klasse, die Serializable implementiert. Jetzt erweitere ich diese Klasse und möchte, dass diese erweiterte Klasse nicht serialisierbar ist. So wie es geht?Erstellen von Child-Klassen als nicht serialisierbar in Java

Zum Beispiel. Ich habe

class A implements Serializable. 

und ich habe

class B extends A. 

Aber ich will Klasse B nicht Serializable sein.

+2

Ist diese Frage tatsächlich über Persistenz? –

+0

Dies ist insbesondere ein Problem mit allen serialisierbaren Swing-Klassen IMHO. Wenn ich eine Subklasse von (sagen wir) 'AbstractTableModel' (serialisierbar) an eine' JTable' übergebe, erwarte ich normalerweise nicht, dass 'JTable' das Modell serialisiert, trotzdem kann ich die Anforderung, dass meine Unterklasse serialisierbar ist, nicht umgehen. –

Antwort

13

Wie andere haben deutlich gemacht, es ist nicht möglich, dass eine Unterklasse einer Serializable Klasse nicht Serializable zu sein.

Wenn Sie möchten, dass die Attribute der Unterklasse nicht serialisiert werden, besteht eine Option darin, sie alle vorübergehend zu machen.

Wenn Sie mehr benötigen (Sie keine Superklasse Felder wollen serialisiert werden), außer Kraft setzen writeObject(ObjectOutputStream) und readObject(ObjectInputStream) wie hier beschrieben - https://web.archive.org/web/20120626144013/http://java.sun.com/developer/technicalArticles/ALT/serialization

+1

Der Link auf Sun.com ist nicht mehr gültig. Ist das der gleiche Artikel? http://www.oracle.com/technetwork/articles/java/javaserial-1536170.html – spaaarky21

+1

@ spaaarky21 Nein, das ist nicht der gleiche Artikel. Ich habe den Link zu archive.org jetzt aktualisiert. – Nayuki

4

Das ist in der Tat nicht möglich. Ihre beste Wette ist B Composite zu lassen/dekorieren A.

public class B { 
    private A a = new A(); 

    public void doSomething() { 
     a.doSomething(); 
    } 
} 
+0

Kann nicht ausgeführt werden, wenn "B" eine Unterklasse von zum Beispiel "Throwable", "Component" oder "Action" sein muss, die alle serialisierbar sind. –

14

Sie können die Schnittstelle entfernen, aber Sie können Serialisierung verhindern zur Laufzeit:

class B extends A { 
    private void writeObject(ObjectOutputStream oos) throws IOException { 
     throw new NotSerializableException(); 
    } 
} 
+3

Das kann viele Probleme verursachen, wenn jemand prüft, ob Sie Serializable implementieren und dann erwartet, dass Sie tatsächlich serialisierbar sind. –

+4

Dies wird von Sun empfohlen.Siehe http://java.sun.com/developer/technicalArticles/ALT/serialization/ (Abschnitt mit dem Titel "Other Pointers".) – finnw

3

Es wird immer Serializable sein, obwohl Sie nichts in der Klasse immer, indem jedes Mitglied transient serialisiert wird sicherstellen könnten.

1

Beantwortung eines Ihrer Kommentar (und vorausgesetzt, Sie von JPA oder Hibernate sprechen):

aber jede Klasse, die ihre Aufgabe will beibehalten werden soll, sollte dies umzusetzen. und ich möchte, dass die Objekte meiner Klasse B nicht persistent sind.

Wenn Sie nicht möchten, dass B überhaupt persistent ist, markieren Sie es nicht als @Entity. Aber es ist nicht wirklich sinnvoll, wenn B A verlängert, wenn B keine persistente Einheit IMHO ist. Dies wäre eine schlechte Verwendung der Vererbung.

0

Sie müssen readObject() und writeObject() Methoden implementieren

+0

Sie müssen die vorherigen vorgeschlagenen Lösungen lesen, bevor Sie Ihre Antwort hinzufügen, in diesem Fall wurde Ihre bereits vorgeschlagen und [akzeptiert] (https://Stackoverflow.com/a/2229256/1387113) von @Jack Leow !. – hd84335

Verwandte Themen