Copy of my answer to: difference between DataContract attribute and Serializable attribute in .net
Răspunsul meu se potrivește mult mai bine aici decât acolo, deși întrebarea de mai sus se încheie cu:
"... sau poate o altă modalitate de a crea o clonă profundă?"
Am efectuat o dată o inspecție la o structură obiect prin Reflection pentru a găsi toate ansamblurile necesare pentru deserializare și pentru a le serializa alături de bootstrapping.
Cu un pic de lucru s-ar putea construi o metodă similară pentru copierea profundă. Practic aveți nevoie de o metodă recursivă care să transporte un Dicționar pentru a detecta referințele circulare. În interiorul metodei inspectați toate câmpurile despre aceasta:
private void InspectRecursively(object input,
Dictionary
To get it working you need to add an output object and something like System.Runtime.Serialization.FormatterServices.GetUninitializedObject(Type type)
to create the most shallowest copy (even without copying references) of each field's value. Finally you can set each field with something like field.SetValue(input, output)
Cu toate acestea, această implementare nu suportă gestionarea evenimentului înregistrat, care este _ un _supported și de deserializarea. În plus, fiecare obiect din ierarhie va fi rupt, în cazul în care constructorul său de clasă trebuie să inițializeze orice, dar să stabilească toate câmpurile. Ultimul punct funcționează numai cu serializare, dacă clasa are o implementare respectivă, de ex. metoda marcată [OnDeserialized]
, implementează ISerializable
, ....