2017-09-05 18 views
15

मैं सिर्फ उत्सुक था कि सी # एरे true उनके IsSerializable संपत्ति के लिए क्यों लौटते हैं। Arrays के पास Serializable विशेषता नहीं है, और वे ISerializable इंटरफ़ेस को भी लागू नहीं करते हैं, तो IsSerializable संपत्ति true पर क्यों सेट है?क्यों सी # Arrays प्रकार IsSerializable संपत्ति सच है?

जब मैं नीचे दिए गए कोड का प्रयास करें, यह "सही" आउटपुट कंसोल में:

Console.WriteLine (new string[0].GetType().IsSerializable); 

उत्पादन होता है:

True 

Try it online

मेरे .NET रनटाइम संस्करण 3.5 है

+0

https://docs.microsoft.com/en-us/dotnet/api/system.serializableattribute?view=netframework-4.7 – dahui

+1

@EdPlunkett मैं प्रलेखन आप से जुड़ा हुआ के माध्यम से देखा है, लेकिन मैं यह कर सकते हैं इस सवाल पर लागू होने वाली कुछ भी नहीं है। –

+1

@dahui कोई उपयोगी जानकारी नहीं है। [यह लिंक सही है] (https://msdn.microsoft.com/en-us/library/system.array.aspx) –

उत्तर

21

Arrays किसी भी Serializable विशेषता नहीं है और यह भी कि वे ISerializable इंटरफ़ेस

Array वर्ग, सी # सरणियों के एक अंतर्निहित आधार वर्ग, को लागू नहीं कर रहे हैं [SerializableAttribute] है:

[SerializableAttribute] 
[ComVisibleAttribute(true)] 
public abstract class Array : ICloneable, IList, ICollection, 
    IEnumerable, IStructuralComparable, IStructuralEquatable 

(reference)

यह भी ऐप कान कि संकलक सरणी [SerializableAttribute] कहते ही

foreach (var a in typeof(string[]).GetCustomAttributes(false)) { 
    Console.WriteLine(a); // Prints "System.SerializableAttribute" 
} 

पासिंग falseGetCustomAttributes को सुनिश्चित करता है कि केवल इस वर्ग के लिए जिम्मेदार बताते हैं, और इसके आधार वर्ग के लिए नहीं, लौटा दिए जाते हैं लिखें।

Demo.

+0

क्यों है, इसका मूल वर्ग 'System.Object',' [Serializable] 'विशेषता भी लेता है? रनटाइम का कौन सा संस्करण आप टाइप टाइप (स्ट्रिंग []) रखने के लिए उपयोग करते हैं। GetCustomAttributes (false) 'उस विशेषता को वापस करें? एक अंतिम प्रश्न: क्या यह आपके उत्तर में अंतर्निहित है कि 'IsSerializable' के बीच एक संबंध है जो 'System.Type' ऑब्जेक्ट के लिए देता है, और क्या यह वर्ग जो प्रतिनिधित्व करता है वह '[Serializable]' विशेषता है या नहीं? –

+0

मैंने अपनी कुछ टिप्पणियों की जांच करने की कोशिश की। ऐसा प्रतीत होता है कि 'IsSerializable' दर्शाता है कि ज्यादातर मामलों में '[Serializable]' विशेषता है, लेकिन कुछ enum प्रकार और प्रतिनिधि प्रकार अपवाद हैं। मेरे लिए यह सरणी प्रकार लगता है, जैसे 'स्ट्रिंग []', अपवाद भी हैं? विशेषता विरासत में नहीं है (यदि यह थी, तो सभी वर्ग इसे प्राप्त करेंगे क्योंकि यह 'System.Object' को सजाने के रूप में, जैसा कि मैंने कहा था)। –

+0

@JeppeStigNielsen एक महान टिप्पणी के लिए धन्यवाद! मैंने इसकी जांच भी की, और ऐसा लगता है कि कार्यान्वयन सीएलआर की गड़बड़ी में गहरा है। डेमो में कोड ideone पर चलता है, इसलिए मुझे यकीन नहीं है कि वे किस रनटाइम का उपयोग कर रहे हैं। जब मैंने माइक्रोसॉफ्ट से नवीनतम रनटाइम पर इसे चलाया, तो मुझे 'सत्य' को 'GetCustomAttributes' में पास करने के दौरान भी कोई विशेषता नहीं मिली।इस बिंदु पर मुझे लगता है कि धारावाहिक धारावाहिक चिह्नित करना एक सीएलआर जादू है, जो 'रनटाइम टाइपइप। गेटएट्रिब्यूट्स' विधि के मूल कार्यान्वयन में छिपा हुआ है। हालांकि, मैं इसके लिए स्रोत का पता नहीं लगा सकता। – dasblinkenlight

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