Nous avons une application qui effectue des comparaisons sur des objets de données pour déterminer si une version de l'objet est différente d'une autre. Notre application effectue également une mise en cache étendue de ces objets, et nous avons rencontré un léger problème de performances lors de ces comparaisons.Clonage efficace des objets mis en cache
est ici le flux de travail:
- élément de données 1 est l'élément en cours dans la mémoire. Cet élément a été initialement récupéré du cache et cloné en profondeur (tous les sous-objets tels que les dictionnaires, etc.). L'élément de données 1 est ensuite modifié et ses propriétés sont modifiées.
- Nous comparons ensuite cet objet avec la version d'origine stockée dans le cache. Étant donné que l'élément de données 1 a été cloné et que ses propriétés ont été modifiées, ces objets doivent être différents.
Il y a quelques problèmes ici.
Le problème principal est que notre méthode de clonage profond est très coûteuse. Nous l'avons profilé contre un clone peu profond et il était 10 fois plus lent. Ce n'est pas bon. Voici notre méthode pour clone profond:
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);
}
}
Nous utilisions d'abord ce qui suit pour cloner:
public object Clone()
{
return this.MemberwiseClone();
}
C'était plus performant, mais parce qu'il fait un clone peu profond tous les objets complexes qui étaient propriétés cet objet, tel que Dictionnaires, etc., n'a pas été cloné. L'objet contiendrait toujours la même référence que l'objet qui se trouvait dans le cache, donc les propriétés seraient les mêmes lors de la comparaison.
Alors, est-ce que quelqu'un a un moyen efficace de faire un clone profond sur des objets C# qui couvrirait l'ensemble du clonage objet graphique?
En supposant que vous voulez que la méthode Clone générique() parce que vous ne voulez pas mettre en œuvre ICloneable sur tout? –
Ceci est un clonage juste un objet spécifique. Cet objet est l'objet de données principal de notre application. Est-ce que cela répond à votre question? –