Objekt wird aus XPF geladen, Klasse hat sich geändert
Moderator: Moderatoren
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9345
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 100 Mal
- Danksagung erhalten: 359 Mal
- Kontaktdaten:
Objekt wird aus XPF geladen, Klasse hat sich geändert
Ein Klassenobjekt - selbstdefinierte Klasse, keine riskanten Elemente enthalten, die nicht-persistent bzw. nicht-persistenzfähig wären - wird in einer XPF-Datei gespeichert. Ich will diesen Weg nicht diskutieren und keine Alternativen hören, danke! Jetzt wird das Objekt aus der XPF-Datei restauriert. Es ist kein DataObject (auch das will ich nicht diskutieren, danke!). Wenn die Klasse inzwischen erweitert wurde, kennt das restaurierte Objekt Instanzvariablen nicht, die seit seiner Speicherung hinzugekommen sind, und wenn man auf die dann zugreifen will, knallt es. Darauf kann man zwar vergleichsweise elegant über die NotfiyLoaded()-Methode reagieren, aber im Prinzip müsste man dann über IsMemberVar einzeln abfragen, ob ggf. neue iVars vorhanden sind oder nicht. Und wenn nicht, muss man ein neues Objekt erzeugen, das geladene inhaltlich Schritt für Schritt klonen und dann ersetzen. Oder gibt es für diesen Schritt einen eleganteren Weg?
Herzlich,
Tom
Tom
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2513
- Registriert: Mi, 28. Jul 2010 17:16
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 77 Mal
Re: Objekt wird aus XPF geladen, Klasse hat sich geändert
Ja. über das Filedatum oder eine Versionsnummer in der Klasse prüfen ob die gespeicherte Klasse zum aktuellen Programm passt. Wenn nicht die Datei verwerfen, umbauen oder sonst was tun das es nicht zum Knall kommt....
Valar Morghulis
Gruss Carlo
Gruss Carlo
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9345
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 100 Mal
- Danksagung erhalten: 359 Mal
- Kontaktdaten:
Re: Objekt wird aus XPF geladen, Klasse hat sich geändert
Hallo, Carlo.
Man kann nach dem Laden prüfen, ob das geladene Objekt bestimmte iVars schon kennt (IsMemberVar), und wenn das nicht der Fall ist, erzeugt man ein neues Objekt und lädt alle iVars aus dem Dateiobjekt dort hinein. Das kann nur - je nach Anzahl der iVars - eine ziemliche Portion Code werden, dabei geht es nur darum, diejenigen iVars, die das alte Objekt nicht kennt, mit den Default-/Init-Werten der Klasse zu besetzen. Datei wegschmeißen ist keine so gute Idee, weil dann auch die Daten darin weg wären.
Man kann nach dem Laden prüfen, ob das geladene Objekt bestimmte iVars schon kennt (IsMemberVar), und wenn das nicht der Fall ist, erzeugt man ein neues Objekt und lädt alle iVars aus dem Dateiobjekt dort hinein. Das kann nur - je nach Anzahl der iVars - eine ziemliche Portion Code werden, dabei geht es nur darum, diejenigen iVars, die das alte Objekt nicht kennt, mit den Default-/Init-Werten der Klasse zu besetzen. Datei wegschmeißen ist keine so gute Idee, weil dann auch die Daten darin weg wären.
Herzlich,
Tom
Tom
- brandelh
- Foren-Moderator
- Beiträge: 15689
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 65 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Objekt wird aus XPF geladen, Klasse hat sich geändert
Wenn du eine zukunftssichere Methode willst, musst du immer ein neues Objekt erzeugen (das hat dann den aktuellen Stand) und danach vom alten die belegten Inhalte übertragen.
Ich sehe keine Methode die das automatisch macht (kann natürlich sein, dass ich sie nur nicht gefunden habe, oder dass die versteckt ist), ich würde das grundsätzlich in eine Funktion auslagern (neues und geladenes Objekt als Parameter).
Ich hoffe das war jetzt noch im Rahmen der oben festgelegten, erlaubten Antwort Parameter
Ich sehe keine Methode die das automatisch macht (kann natürlich sein, dass ich sie nur nicht gefunden habe, oder dass die versteckt ist), ich würde das grundsätzlich in eine Funktion auslagern (neues und geladenes Objekt als Parameter).
Ich hoffe das war jetzt noch im Rahmen der oben festgelegten, erlaubten Antwort Parameter
Gruß
Hubert
Hubert