Observer serialisieren

Status
Nicht offen für weitere Antworten.

maximilius

Mitglied
Hallo,

ich habe folgende zwei Klassen beispielhaft für meine Problematik geschrieben:

Code:
public class Item extends Observable implements Serializable {
	private String data;

	public Item(String data) {
		this.data = data;
	}

	public String getData() {
		return data;
	}

	public void setData(String data) {
		this.data = data;
		setChanged();
		notifyObservers();
	}
}

Code:
public class ItemCollection implements Observer, Serializable {
	private Vector<String> items;

	public ItemCollection() {
		items = new Vector<String>();
	}
	
	public void addItem(Item item) {
		items.add(item);
		item.addObserver(this);
	}

	public void update(Observable o, Object arg) {
		System.out.println("Ich wurde benachrichtigt.");
	}
}

Wenn ich nun eine ItemCollection instanziiere, ihr Item Objekte hinzufüge und danach jene verändere, wird ordnungsgemäß die ItemCollection benachrichtigt.
Wenn ich jedoch die ItemCollection serialisiere und danach deserialisiere sind die Observer-Beziehungen verschwunden.
Ich vermute, dass das daran liegt, dass Observer nicht Serializable implementiert.
ItemCollection ist zwar Serializable, aber die addObserver() Methode von Item erwartet ja nur Observer und keine ItemCollection.

Hat jemand eine Idee, was ich tun könnte, damit nach dem Deserialisieren die Observer-Beziehungen noch da oder wieder hergestellt werden können?

lg Stephan
 
S

SlaterB

Gast
wäre etwas nicht serialisierbar wäre, gäbe es eine Nicht-Serialierbar-Exception,

was genau ist denn nun nach dem Deserialisieren los?
schau dir die Elemente in der Liste an, an denen kann man doch sicher getListener() oder so aufrufen,
ist da noch ein Objekt vorhanden? prüfe mit ==-Vergleich, ob es die serialisierte Liste ist usw.

wichtig ist, dass durch Serialisierung alles kopiert wird,
du hast deine Originalliste + Items und aus der Serialisierung eine zweite Liste mit anderen Items,
wenn du eine der beiden Item-Arten updatest, dann bekommt das jeweils nur die zugehörige Collection mit, nicht die andere
 

Murray

Top Contributor
maximilius hat gesagt.:
Ich vermute, dass das daran liegt, dass Observer nicht Serializable implementiert.
Das Problem dürfte eher sein, dass Observable nicht Serializable implementiert (Observer ist nur eine Interface und kann als solches keine anderen Interfaces implementieren, sondern höchstens erweitern).
Wenn man von einer nicht-serialisierbaren Klasse ableitet und diese abgeleitete Klasse als "Serializable" deklariert, dann werden eben nicht automatisch auch die Attribute der Basisklasse serialisiert:

API-Dokumentaion zu java.lang.Serializable hat gesagt.:
To allow subtypes of non-serializable classes to be serialized, the subtype may assume responsibility for saving and restoring the state of the supertype's public, protected, and (if accessible) package fields.
Die abgeleitete Klasse müsste also selbst dafür sorgen, dass die Eigenschaften der Baisisklasse serialisiert werden. Das ist in diesem Fall allerdings schlecht möglich:

Source-Code von java.util.Observable hat gesagt.:
Code:
private Vector obs;

Das Member mit den Observer-Beziehungen ist also private und daher von der abgeleiteten Klasse aus nicht sichtbar.
 

maximilius

Mitglied
@SlaterB
Beim Programmende wird die ItemCollection serialisiert und in einer Datei gespeichert.
Bei Programmstart wird die in der Datei gespeicherte deserialisierte ItemCollection serialisiert.
Jetzt ist alles korrekt, bis auf, dass die Items keine Observer mehr registriert haben.
item.countObservers liefert 0

@Murray
Ich könnte der ItemCollection folgende Methode hinzufügen:
Code:
	public void repairDeserialized() {
		for (Item item : items) {
			if(item.countObservers() == 0) {
				item.addObserver(this);
			}
		}
	}
Jetzt könnte ich nach dem Deserialisieren die Methode aufrufen und alles wäre wieder beim alten.

Ich empfinde das aber als unsauber, weil es ja sein könnte, wenn ich irgendwann die Klassen woanders verwende, dass ich vergesse, nach dem Deserialisieren die Methode repairDeserialized() aufzurufen und dann habe ich wieder das Problem.

Was haltet ihr von der halbherzigen Lösung?
Gibt es eine Möglichkeit, dass die Methode automatisch beim Deserialisieren angestoßen wird?

lg Stephan
 

mvitz

Top Contributor
Ist es nicht möglich die Observable Methoden selber zu implementieren? Die würden dann ja mitserialisiert.
 

maximilius

Mitglied
Nachdem ein wenig Zeit vergangen ist und keiner weiter eine Idee hat (Ich selbst habe auch nichts weiter gefunden) fasse ich zusammen:

Mein Problem ist nicht lösbar, wenn ich von Observable ableiten möchte.
Observable implementiert nicht Serializable und man kann in der abgeleiteten Klasse nicht auf die Membervariablen von Observable zugreifen, um sie eigenständig zu serialisieren, da sie private sind.

Um eine Serialisierung zu ermöglichen muss man demnach tatsächlich das Beobachter-Entwurfsmuster selbstständig implementieren und serialisierbar halten.

lg Stephan
 

Ebenius

Top Contributor
SlaterB hat gesagt.:
wäre etwas nicht serialisierbar wäre, gäbe es eine Nicht-Serialierbar-Exception,

Die abgeleitete Klasse ist serialisierbar. Die Felder von Observable werden aber nicht mitserialisiert, weil Observable nicht serialisierbar ist. Da Observable jedoch einen Default Constructor hat, gibt es keine NotSerializableException.

Ebenius

Grüße, Ebenius
 
S

SlaterB

Gast
jo, war am 27.12. in der nächsten Antwort dann schon klar,
vergesse ich häufig,

heute mich bitte nicht mehr korrigieren ;)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M OOP Design Pattern - "extends Observable implements Observer" Allgemeine Java-Themen 0
GreenTeaYT Verstehe nicht ganz das Observer Pattern in einer Arrayliste? Allgemeine Java-Themen 3
S OOP JFrame als Observer eines JPanel Allgemeine Java-Themen 3
A Observer und Initialisierung Allgemeine Java-Themen 7
L Registrierung von Observer Allgemeine Java-Themen 4
G 2 Observable und ein Observer... Allgemeine Java-Themen 4
M MVC: PropertyChangeListener vs Java Observer & Observable Allgemeine Java-Themen 11
S Wie kann ein Observer mehrere Observables beobachten? Allgemeine Java-Themen 9
Z Observer/Observable & Grundlagen Allgemeine Java-Themen 6
R Observer Umsetzungsproblem Allgemeine Java-Themen 7
K Verständnisprobleme bei Observer-Pattern mit größerem Datenmodell Allgemeine Java-Themen 32
nrg Java Observer in SysTray laufen lassen / Console schließen Allgemeine Java-Themen 2
T Observer vs Listener Allgemeine Java-Themen 18
A Observer Pattern: feuern bei neuer Referenz-Zuweisung? Allgemeine Java-Themen 8
V Threads und Observer Allgemeine Java-Themen 18
H Observer und Observable Allgemeine Java-Themen 3
U Verständnisschwierigkeiten Observer Pattern Allgemeine Java-Themen 18
B Observer vs Listener (GUI-Programmierung) Allgemeine Java-Themen 5
G Observer / Observable oder doch lieber Message Broker? Allgemeine Java-Themen 2
D Observer/Observable Pattern vs. Listener-Konzept Allgemeine Java-Themen 4
P Observer/TimerTask Allgemeine Java-Themen 3
P Observer Allgemeine Java-Themen 4
N Observer/Observable der JAVA-API od. eigene Implementierung Allgemeine Java-Themen 2
B Observer reagieren beim 2ten mal nicht Allgemeine Java-Themen 23
P Observer, nicht alle updates bearbeiten Allgemeine Java-Themen 2
P Abmelden beim Observer Allgemeine Java-Themen 4
N Observer Pattern Allgemeine Java-Themen 2
M Frage zu update Methode von Observer! Allgemeine Java-Themen 40
lhein Tutorial zu Observer / Observable? Allgemeine Java-Themen 6
G problem mit dem observer pattern Allgemeine Java-Themen 3
S Observable und Observer Allgemeine Java-Themen 10
G Frage zu (mehrfachem) Observable/Observer Allgemeine Java-Themen 2
G Frage zum Observer Pattern Allgemeine Java-Themen 4
M Objekt serialisieren/deserialisieren und in einer SQLite-Datenbank speichern Allgemeine Java-Themen 3
OnDemand Objekte serialisieren Allgemeine Java-Themen 3
B Mehrere Objekte verschlüsselt serialisieren Allgemeine Java-Themen 6
D Problem mit Referenzen beim Serialisieren Allgemeine Java-Themen 3
J Methoden Fehler beim serialisieren und laden!? help Allgemeine Java-Themen 4
X Objekte aus TableModel serialisieren und deserialisieren Allgemeine Java-Themen 4
J Bilddaten serialisieren Allgemeine Java-Themen 7
B Zertifikat des Users speichern (serialisieren oder kopieren) Allgemeine Java-Themen 2
A Dateien Serialisieren Allgemeine Java-Themen 50
G Objekte serialisieren Allgemeine Java-Themen 2
MQue Serialisieren von Objecten Allgemeine Java-Themen 6
J Ein Objekt mehrfach serialisieren Allgemeine Java-Themen 2
A Problem beim serialisieren/deserialisieren einer ArrayList Allgemeine Java-Themen 3
K Collections oder Vektoren sicher zu serialisieren? Allgemeine Java-Themen 5
M DefaultTableModel wirft beim Serialisieren Exception :-( Allgemeine Java-Themen 7
Z Array serialisieren Allgemeine Java-Themen 4
G Serialisieren eines JButton mit Icon Allgemeine Java-Themen 8
F Textformatierungen wie serialisieren? Allgemeine Java-Themen 5
L unterschiedliche Größe beim serialisieren eines Objektes! Allgemeine Java-Themen 6
G Serialisieren von Objekten : IO Exception beim Schreiben Allgemeine Java-Themen 3
R Serialisieren Allgemeine Java-Themen 2
F Bild (File) komplett serialisieren Allgemeine Java-Themen 9
B Serialisieren von mehreren Objekten Allgemeine Java-Themen 7
B Serialisieren von Klassen Allgemeine Java-Themen 4
thE_29 Serialisieren von AWTEvent Allgemeine Java-Themen 19
I Vector serialisieren: StackOverflow Allgemeine Java-Themen 13

Ähnliche Java Themen

Neue Themen


Oben