Copy of my answer to: difference between DataContract attribute and Serializable attribute in .net
मेरा जवाब वहां से कहीं बेहतर है, हालांकि ऊपर प्रश्न समाप्त होता है:
"... या शायद गहरे क्लोन बनाने का एक अलग तरीका?"
मैंने एक बार ऑब्जेक्ट स्ट्रक्चर के लिए प्रतिबिंब के माध्यम से कुछ निरीक्षण किया ताकि वे deserialization के लिए आवश्यक सभी असेंबली ढूंढ सकें और बूटस्ट्रैपिंग के लिए उन्हें क्रमबद्ध कर सकें।
कुछ काम के साथ कोई गहरी प्रतिलिपि बनाने के लिए एक समान विधि बना सकता है। असल में आपको एक पुनरावर्ती विधि की आवश्यकता होती है जो सर्कुलर संदर्भों का पता लगाने के लिए एक शब्दकोश के साथ ले जाती है। विधि के अंदर आप इस तरह के सभी क्षेत्रों का निरीक्षण करते हैं:
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)
हालांकि यह कार्यान्वयन पंजीकृत ईवेंट हैंडलर का समर्थन नहीं करता है, जो _ un _ deserializing द्वारा समर्थित है। इसके अतिरिक्त पदानुक्रम में प्रत्येक वस्तु तोड़ दी जाएगी, अगर उसके वर्ग के निर्माता को सभी क्षेत्रों को सेट करने के अलावा कुछ भी प्रारंभ करने की आवश्यकता है। आखिरी बिंदु केवल क्रमबद्धता के साथ काम करता है, यदि कक्षा में एक संबंधित कार्यान्वयन है, उदा। विधि [ऑनडिसेरियलाइज्ड]
चिह्नित है, ISerializable
लागू करता है ...।