J'utilise une classe d'instance à partir d'une DLL tiers et je dois faire une copie profonde sur une instance particulière. La classe n'est pas marquée comme Comment puis-je obtenir une copie profonde de cet objet sans utiliser la sérialisation? P> sérialisable code>, et donc je ne peux pas utiliser cette méthode suggérée à l'aide de
Binarinformatter code>
. P>
3 Réponses :
Vous ne pouvez pas (ou peut-être ne devrait-il pas être ce que je cherche). p>
Si la classe n'est pas conçue pour être sérialisée et que cela ne vous fournit pas un moyen de le cloner (c'est-à-dire sous la forme d'une méthode clone ou copie), vous ne pouvez pas facilement le faire automatiquement. (Et en outre, si cette installation n'est pas fournie, vous ne devriez probablement pas faire cela, car la classe n'est probablement pas conçue avec ce type d'utilisation à l'esprit.) P>
Toutefois, si vous voulez vraiment le faire et que vous êtes dans un environnement de confiance complet, vous pouvez bien sûr faire des choses sales en utilisant formatterservices.getunitializedObject code>, puis en utilisant la réflexion pour copier le champ valeurs d'un objet à l'autre. Mais c'est presque certainement une mauvaise idée. P>
Je n'ai pas fini, mais je pense que vous devriez voir la réponse de Kenny.
J'utilise copible avec un grand succès. Il utilise la réflexion sous la hotte. Il est ouvert à proximité. Assurez-vous de lire Limitations et pièges EM> pour voir si vous pouvez l'utiliser. P>
Je crois que cela fonctionnera pour moi, merci! Je comprends les pièges, et heureusement ce que je travaille actuellement n'a absolument aucune ressource non gérée. Merci encore, je vous ferai savoir comment ça marche.
(Mise à jour de votre réponse pour inclure SEO-Link et confirmé que la bibliothèque utilise la réflexion)
Une mise en garde non mentionnée avec Copée i> est que les classes comme il ne savent rien sur des références extérieures dans une structure de données. Supposons, par exemple, que dans une classe, il y a une référence à une gamme de chaîne unique, et supposons que chaque seconde, une autre classe met la période actuelle de la journée dans le premier (uniquement) élément de cette matrice. Un clone de l'objet de classe d'origine contiendrait une chaîne avec l'heure de la journée que l'objet a été copié, plutôt qu'un autre en changeant en continu.
Vous pouvez utiliser un mapper, je suggère Ultramapper Github.com/Maurosampietro/ultramapper . Il utilise des expressionniers au lieu de réflexion et il est donc 1000 fois plus rapide que la réflexion
Une suggestion est d'utiliser la sérialisation JSON (qui utilise la réflexion, et ne s'appuie pas sur le [Serializable] code> attribut) pour sérialiser et désérialiser dans une copie. Par exemple, à l'aide de la bibliothèque JSON.NET:
var copiedObject = JsonConvert.DeserializeObject<Snapshot>(
JsonConvert.SerializeObject(sourceSnapshotObject));
"Copier" n'a pas nécessairement de sens pour toutes les classes.
@Mehrdad s'il vous plaît élaborer, je ne sais pas ce que vous voulez dire.
L'exemple canonique est une classe Singleton. Vous ne devriez pas (et ne devrait pas être capable de) le copier.
@Mehrdad je comprends ce que vous voulez dire maintenant. Je suis convaincu que l'absence de
sérialisable code> dans ce cas était un manque de prévoyance avec l'API Devs.
En outre, en faisant des copies approfondies telles que les connexions de base de données, les connexions réseau ou les transactions peuvent entraîner une perte massive.
Vous pouvez utiliser un mapper, je suggère Ultramapper Github.com/Maurosampietro/ultramapper
Cochez cette case Réponse : Stackoverflow. COM / A / 52097307/4707576 À propos de: Clonage Objets sans sérialisation