Ich bin auf der Suche nach einem Mittel, um einen Objektgraphen in perfekter Weise zu klonen. Ich werde mehrere Threads haben, die ein Diagramm extrem schnell klonen, so dass sie mit einem bestimmten Zustand spielen und die Ergebnisse wegwerfen können, wenn sie nicht interessant sind, und zum Original zurückkehren, um es erneut zu versuchen.
Ich benutze derzeit einen tiefen Klon über binäre Serialisierung, die, obwohl sie funktioniert, nicht erstaunlich schnell ist. Ich habe andere Bibliotheken wie protobuf gesehen, aber die Klassen in meinem Objektdiagramm können in externen Assemblys definiert werden, die von Klassen in der Haupt-Assembly erben und keine Komplexität in diesen konsumierenden Assemblys hinzufügen wollen, wenn dies möglich ist.
Eines der interessanten Dinge, auf die ich gestoßen bin, war das Klonen mit automatisch generierte IL . Es scheint, dass es noch nicht ganz fertig ist und ich habe geschrieben, um zu sehen, ob der Autor mehr getan hat, aber ich vermute nicht. Hat jemand anderes eine funktionellere Art des Klonens über IL entwickelt oder gesehen? Oder eine andere Methode, die schnell sein wird?
Neben der Serialisierung betrachte ich nur drei Optionen:
Wir haben einige Instanzen von Code, wo wir die binäre Serialisierung kontrollieren, so dass wir eine interne GUID-Tabelle serialisieren können (wir haben viele wiederholte GUIDs und serialisieren sehr große Listen über .NET Remoting). Es funktioniert gut für uns und wir haben kein Serialisierungsframework von Drittanbietern benötigt, aber es ist handgefertigtes Zeug mit ein wenig Code-Gen.
Das CSLA.NET-Framework enthält eine Klasse namens UndoableBase
, die die Reflektion verwendet, um ein Hashtable
der Eigenschaft zu serialisieren / Feldwerte. Wird verwendet, um Rollbacks für Objekte im Speicher zu ermöglichen. Dies könnte zu Ihrem Satz "Zurück zum Original, um es erneut zu versuchen" passen.
Persönlich würde ich mich weiter mit einer reflexionsbasierten Lösung (vorzugsweise mit emittierter IL für eine bessere Leistung) befassen, die es Ihnen dann ermöglicht, Klassen- / Mitgliedsattribute für die Kontrolle über den Klonprozess zu nutzen. Wenn Leistung die Königsklasse ist, kann es nicht schneiden.