2010-06-05 10 views
33

मेरी समझ के आधार पर, SerializableAttribute कोई संकलन समय जांच प्रदान नहीं करता है, क्योंकि यह सब रनटाइम पर किया जाता है। यदि ऐसा है, तो कक्षाओं को धारावाहिक के रूप में चिह्नित करने के लिए क्यों आवश्यक है?किसी ऑब्जेक्ट को क्रमबद्ध करने के लिए सीरियलज़ेबल विशेषता क्यों है

सीरिएलाइज़र बस किसी ऑब्जेक्ट को क्रमबद्ध करने का प्रयास नहीं कर सका और फिर असफल रहा? क्या यह अभी नहीं करता है? जब कुछ चिह्नित किया जाता है, तो यह कोशिश करता है और विफल रहता है। क्या यह बेहतर नहीं होगा अगर आपको चीजों को क्रमबद्ध करने के बजाय अनियमित करने के रूप में चिह्नित करना पड़े? इस तरह आपको पुस्तकालयों की समस्या नहीं होगी जो चीज़ों को क्रमबद्ध करने के रूप में चिह्नित नहीं करते हैं?

+0

संभावित डुप्लिकेट [आपको विशेषता \ [serializable \] के साथ कक्षा को चिह्नित क्यों करना है?] (Http://stackoverflow.com/ प्रश्न/2595104/क्यों-करें-आप-टू-मार्क-ए-क्लास-द-द-एट्रिब्यूट-सीरियलज़ेबल) – nawfal

+0

आप [postsharp] (https: // का उपयोग करके अपने सभी वर्गों के लिए विशेष रूप से विशेषताओं को जोड़ने का प्रयास कर सकते हैं www.postsharp.net/)। इस प्रश्न में एक समान उपयोग दिखाया गया है: http://stackoverflow.com/questions/7851365/how-to-inject-an-attribute-using-a-postsharp-attribute –

उत्तर

34

जैसा कि मैं इसे समझता हूं, SerializableAttribute के पीछे विचार बाइनरी क्रमबद्धता के लिए सिस्टम ऑप्ट-इन करना है।

ध्यान रखें कि, XML गुणों के विपरीत, जो सार्वजनिक गुणों का उपयोग करता है, बाइनरी क्रमबद्धता डिफ़ॉल्ट रूप से सभी निजी फ़ील्ड को पकड़ती है।

इतना ही नहीं इस ऑपरेटिंग सिस्टम संरचनाओं और निजी डेटा कि संपर्क में होना चाहिए नहीं है, लेकिन शामिल हो सकते हैं deserializing यह भ्रष्ट राज्य में परिणाम सकता है कि एक आवेदन पत्र (मूर्ख उदाहरण दुर्घटना कर सकते हैं: एक फ़ाइल के लिए एक संभाल एक में खुला अलग कंप्यूटर)।

+1

+1 - मूल रूप से गैर-सार्वजनिक की सुरक्षा और जोखिम जानकारी यहां मुद्दा है। – TomTom

+0

केवल उत्तर दें जो बताता है कि बाइनरी क्रमिकरण के लिए क्यों आवश्यक है। अच्छी नौकरी, यह सभी उत्तरों में याद आ रही थी। –

19

यह केवल BinaryFormatter (और एसओएपी समकक्ष के लिए एक आवश्यकता है, लेकिन कोई भी इसका उपयोग नहीं करता है)। डिएगो सही है; व्यक्तिगत रूप से मैं केवलAppDomains के बीच बात करने के लिए BinaryFormatter की सिफारिश वास्तव में, - - यह क्या करता है के मामले में इस के लिए अच्छे कारण देखते हैं, लेकिन यह दूर ही एकमात्र विकल्प से है यह है नहीं (IMO) एक अच्छा तरीका करने के लिए डेटा (डिस्क पर, कैश में, डेटाबेस BLOB, आदि) पर बने रहें।

इस व्यवहार आपको परेशानी का कारण बनता है, तो विकल्प के किसी भी उपयोग करने पर विचार:

  • XmlSerializer है, जो सार्वजनिक सदस्यों (न सिर्फ खेतों) पर काम करता है, लेकिन एक सार्वजनिक parameterless निर्माता और सार्वजनिक प्रकार की मांग
  • DataContractSerializer, जो काम पूरी तरह से शामिल हो सकते हैं ([DataContract]/[DataMember] का उपयोग कर), लेकिन जो भी (3.5 और इसके बाद के संस्करण में) क्षेत्रों के खिलाफ बजाय काम कर सकते हैं

इसके अलावा - एक तृतीय पक्ष विकल्प के लिए (मैं तीसरी पार्टी हूं); प्रोटोबफ-नेट में विकल्प हो सकते हैं; "v2" (अभी तक पूरी तरह से रिलीज़ नहीं हुआ है, लेकिन स्रोत के रूप में उपलब्ध है) मॉडल (जो सदस्यों को क्रमबद्ध करने के लिए आदि) को स्वतंत्र रूप से वर्णित करने की अनुमति देता है, ताकि इसे उन प्रकारों पर लागू किया जा सके जिन्हें आप नियंत्रित नहीं करते हैं। और बाइनरीफॉर्मेटर के विपरीत आउटपुट संस्करण-सहिष्णु, ज्ञात सार्वजनिक प्रारूप इत्यादि है।

+0

भयानक।अपने फायदे और उनके नुकसान के साथ सी # में क्रमबद्ध करने के लिए आपके पास विकल्पों का अद्भुत सारांश है। वास्तव में जो मैं पिछले सप्ताह के दौरान देख रहा था ... Merci मार्क। – Arthis

संबंधित मुद्दे

 संबंधित मुद्दे