Laden...

Eindeutige und immer gleiche ID

Erstellt von Tarion vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.502 Views
T
Tarion Themenstarter:in
381 Beiträge seit 2009
vor 13 Jahren
Eindeutige und immer gleiche ID

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.

C
24 Beiträge seit 2009
vor 13 Jahren

Guid-Struktur

Sollte in etwa das sein, was du suchst.

A
69 Beiträge seit 2010
vor 13 Jahren

Entweder du vergibst als ID eine GUID oder aber du verwendest eine statische Variable als Autoincrement-zähler für die Id-Vergabe.

49.485 Beiträge seit 2005
vor 13 Jahren

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

T
Tarion Themenstarter:in
381 Beiträge seit 2009
vor 13 Jahren

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".

  • Verschwindet ein Type aus dem System, wird einfach eine Referenz ungültig.
  • Kommt ein Type hinzu ist dieser eindeutig
  • Ändert ein Type seine Eigenschaften, ist es immer noch der gleiche Type und damit durchaus noch gültig.