Vielleicht geht es auch anders, hier mein Problem:
Ich habe viele Instanzen einer Klasse A, diese sollen eindeutig identifiziert werden können.
Jetzt wird ein Objekt B mit Referenzen auf A Serialisiert, soll aber nicht die ganze Klasse A mit serialisieren sondern nur eine Eindeutige Identifizierung.
Beim deserialisieren soll nun mit Hilfe der gespeicherten ID die richtige Klasse A aus einer Factory gezogen werden.
Wenn alle Klassen A durchnummeriert werden, geht es so lange gut wie sich nichts an der Erstellungsreihenfolge verändert und einzelne Instanzen nicht wieder verschwinden.
Pseudocode zum veranschaulichen:
class A {
public int Id;
public A(int id) {
this.Id = id;
}
}
// Somewhere:
new B(AFactory.NewA())
// -----------
class B {
public A A;
public B(A a) {
this.A = a;
}
public Deserialize(Reader reader) {
int aId = reader.ReadInt();
A = AFactory.Get(aId);
}
}
Wie also in AFactory.NewA() die IDs vergeben.
Man könnte irgend einen Hash verwenden der A eindeutig bestimmt.
Oder es gibt einen ganz einfachen anderen Ansatz den ich gerade nicht sehe.
Entweder du vergibst als ID eine GUID oder aber du verwendest eine statische Variable als Autoincrement-zähler für die Id-Vergabe.
Hallo Tarion,
so ganz verstehe ich dein Problem nicht. Die Klasse A braucht doch sowieso zwei Konstruktoren. Einen für echt neue Objekte und einen, wenn ein schomal erstelltes Objekt beim Serialisieren wiederhergestellt werden muss. Für echt neue Objekt reicht doch das Hochzählen. Und bei den wiederhergestellten Objekten ist die Id ja sowieso bekannt. Insofern sehe ich nicht, wie sie da was ins Gehege kommen soll. Mal davon abgesehen, dass du dir natürlich irgendwo die zuletzt vergebene bzw. die nächste freie Id merken musst, damit du den Zähler auf diesen Wert setzen kannst, wenn dein Programm neu gestartet wird. Diesen Umstand könntest du natürlich durch die Verwendung von GUIDs vermeiden.
herbivore
Das Eigentliche Problem liegt wohl daran, dass die objekte A nie selbst serialisiert werden, sondern nur deren Identität.
Irgendwo werden beim Programmstart viele Instanzen von A erstellt. Probleme würden erst auftreten, wenn man mal die Liste im Code ändert. Dann würden sich ID's verschieben wenn ich einfach hoch zähle.
Wenn ich GUIDs vergebe, hat das gleiche Objekt A nicht immer die gleiche GUID nach nem erneuten Programmstart, und somit werden verweise ungültig.
Meine Lösung:
Ich habe jetzt eine Art PrimaryKey für meine Objekte A. Eine Eigenschaft die einzigartig ist und über die ich die Zuweisung mache. In meinem Fall ist es nen "Type".