Wir haben eine Anwendung, die Vergleiche an Datenobjekten durchführt, um festzustellen, ob sich eine Version des Objekts von einer anderen unterscheidet. Unsere Anwendung führt auch ein umfangreiches Caching dieser Objekte durch, und wir haben bei diesen Vergleichen ein kleines Leistungsproblem bekommen.Effizientes Klonen zwischengespeicherter Objekte
Hier ist der Workflow:
- Datenpunkt 1 ist das aktuelle Element im Speicher. Dieser Eintrag wurde ursprünglich aus dem Cache abgerufen und tief geklont (alle Unterobjekte wie Wörterbücher usw.). Datenelement 1 wird dann bearbeitet und seine Eigenschaften werden geändert.
- Wir vergleichen dann dieses Objekt mit der ursprünglichen Version, die im Cache gespeichert wurde. Da Datenelement 1 geklont wurde und seine Eigenschaften geändert wurden, sollten diese Objekte unterschiedlich sein.
Es gibt ein paar Probleme hier.
Das Hauptproblem ist unsere tiefe Klonmethode ist sehr teuer. Wir haben es gegen einen flachen Klon profiliert und es war 10x langsamer. Das ist Mist. Hier ist unsere Methode, um tiefe Klon:
public object Clone()
{
using (var memStream = new MemoryStream())
{
var binaryFormatter = new BinaryFormatter(null, new StreamingContext(StreamingContextStates.Clone));
binaryFormatter.Serialize(memStream, this);
memStream.Seek(0, SeekOrigin.Begin);
return binaryFormatter.Deserialize(memStream);
}
}
Wir wurden zunächst mit dem folgenden klonen:
public object Clone()
{
return this.MemberwiseClone();
}
Das war mehr performant, sondern weil es tut ein flacher Klon alle komplexen Objekte, die Eigenschaften waren Dieses Objekt, z. B. Wörterbücher usw., wurde nicht geklont. Das Objekt würde immer noch den gleichen Verweis wie das Objekt enthalten, das sich im Cache befand, daher wären die Eigenschaften beim Vergleich gleich.
Hat also jemand eine effiziente Möglichkeit, einen tiefen Klon auf C# -Objekte zu erstellen, der das Klonen des gesamten Objektgraphen abdecken würde?
Angenommen, Sie möchten, dass generische Clone() -Methode, weil Sie nicht wollen, zu implementieren, Auf alles klonbar? –
Dies ist Klonen nur ein bestimmtes Objekt. Dieses Objekt ist das Kerndatenobjekt in unserer App. Beantwortet das deine Frage? –