क्या है [क्रमिक] और मुझे इसका उपयोग कब करना चाहिए?


318

मुझे पता चला कि कुछ वर्ग [Serializable]विशेषता का उपयोग करते हैं।

  • यह क्या है?
  • मुझे इसका उपयोग कब करना चाहिए?
  • मुझे किस प्रकार के लाभ होंगे?



1
यहाँ एक व्यावहारिक उपयोग स्पष्टीकरण मैंने पाया है।
निपुण

जवाबों:


369

यह क्या है?

जब आप एक .Net फ्रेमवर्क एप्लिकेशन में एक ऑब्जेक्ट बनाते हैं, तो आपको यह सोचने की ज़रूरत नहीं है कि डेटा को मेमोरी में कैसे संग्रहीत किया जाता है। क्योंकि .Net फ्रेमवर्क आपके लिए इसका ध्यान रखता है। हालाँकि, यदि आप किसी ऑब्जेक्ट की सामग्री को किसी फ़ाइल में संग्रहीत करना चाहते हैं, तो किसी अन्य प्रक्रिया के लिए ऑब्जेक्ट भेजें या इसे पूरे नेटवर्क में प्रसारित करें, आपको यह सोचना होगा कि ऑब्जेक्ट का प्रतिनिधित्व कैसे किया जाता है क्योंकि आपको एक अलग प्रारूप में बदलने की आवश्यकता होगी । इस रूपांतरण को SERIALIZATION कहा जाता है।

सीरियलाइजेशन के लिए उपयोग

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

SerializableAttributeयह दर्शाने के लिए एक प्रकार पर लागू करें कि इस प्रकार के उदाहरणों को क्रमबद्ध किया जा सकता है। SerializableAttributeयहां तक ​​कि लागू करें यदि वर्ग भी ISerializableअनुक्रम प्रक्रिया को नियंत्रित करने के लिए इंटरफ़ेस को लागू करता है।

एक प्रकार के सभी सार्वजनिक और निजी क्षेत्र SerializableAttributeडिफ़ॉल्ट रूप से क्रमबद्ध होते हैं, जब तक कि प्रकार ISerializableक्रमांकन प्रक्रिया को ओवरराइड करने के लिए इंटरफ़ेस को लागू नहीं करता है। डिफ़ॉल्ट क्रमांकन प्रक्रिया उन क्षेत्रों को शामिल करती है जो चिह्नित हैं NonSerializedAttribute। यदि किसी अनुक्रमिक प्रकार के क्षेत्र में एक सूचक, एक हैंडल या कुछ अन्य डेटा संरचना होती है जो किसी विशेष वातावरण के लिए विशिष्ट होती है, और एक अलग वातावरण में सार्थक रूप से पुनर्गठित नहीं की जा सकती है, तो आप NonSerializedAttributeउस फ़ील्ड पर लागू करना चाह सकते हैं ।

अधिक विवरण के लिए MSDN देखें ।

संपादित करें 1

क्रमिक रूप से कुछ चिह्नित नहीं करने का कोई कारण

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


1
@dwbartz आपके प्रश्न का उत्तर यहां दिया गया है लिंक
jayasurya_j

2
अच्छा अन्वेषण, MSDN =) में इस विशेषता को जोड़ने के लिए अच्छा होगा
मार्टी

@jayasurya_j बहुत खराब स्वीकार किए जाते हैं, निजी भागों के
अलेक्जेंडर

1
अच्छा स्पष्टीकरण
जाकिर HC

42

[Serializable]विशेषता के लिए कुछ व्यावहारिक उपयोग :

  • बाइनरी क्रमांकन का उपयोग करके वस्तु स्थिति को सहेजना; आप फ़ाइल या नेटवर्क स्ट्रीम में अपने एप्लिकेशन में संपूर्ण ऑब्जेक्ट इंस्टेंस को बहुत आसानी से 'सेव' कर सकते हैं और फिर उन्हें डीसर्लाइजिंग द्वारा रीक्रिएट कर सकते हैं - BinaryFormatterSystem.Runtime.Serialization.Formatters.Binary में क्लास देखें।
  • उन कक्षाओं को लिखना जिनके ऑब्जेक्ट इंस्टेंस का उपयोग करके क्लिपबोर्ड पर संग्रहीत किया जा सकता है Clipboard.SetData()- गैर- उपयोग योग्य कक्षाएं क्लिपबोर्ड पर नहीं रखी जा सकती हैं।
  • लेखन कक्षाएं जो .NET रीमोटिंग के साथ संगत हैं; आम तौर पर, आप जिस भी एप्लिकेशन इंस्टेंस के बीच से गुजरते हैं, (उन्हें छोड़कर जो भी विस्तार करते हैं MarshalByRefObject) धारावाहिक होना चाहिए।

ये सबसे आम उपयोग के मामले हैं जो मुझे सामने आए हैं।


41

चूंकि मूल प्रश्न SerializableAttribute के बारे में था, इसलिए यह ध्यान दिया जाना चाहिए कि यह विशेषता केवल BinaryFormatter या SoapFormatter का उपयोग करते समय लागू होती है।

यह थोड़ा भ्रामक है, जब तक आप वास्तव में विवरणों पर ध्यान नहीं देते हैं, जैसे कि इसका उपयोग कब करना है और इसका वास्तविक उद्देश्य क्या है।

इसका XML या JSON क्रमांकन के साथ कुछ भी नहीं है।

SerializableAttribute के साथ उपयोग ISerializable इंटरफ़ेस और SerializationInfo वर्ग हैं। ये भी केवल बाइनरीफ़ॉर्मेटर या सोपफ़ॉर्मेटर के साथ उपयोग किए जाते हैं।

जब तक आप बाइनरी या साबुन का उपयोग करके अपनी कक्षा को क्रमबद्ध करने का इरादा नहीं करते हैं, तब तक अपनी कक्षा को [सीरियल योग्य] के रूप में चिह्नित करने से परेशान न करें। एक्सएमएल और जेएसएन धारावाहिकों को इसके अस्तित्व के बारे में भी पता नहीं है।


16
"यह XML या JSON क्रमांकन के साथ करने के लिए कुछ भी नहीं है" - धन्यवाद! अंत में एक स्पष्टीकरण क्यों मैं खुशी के साथ किसी भी वर्ग को एक्सएमएल के साथ या इस विशेषता के बिना
अनुक्रमित कर सकता हूं

1
क्या इसके लिए आपके पास स्रोत है?
माइकल वैन ओस्टरहॉट

"XML और JSON धारावाहिकों को इसके अस्तित्व के बारे में पता भी नहीं है"। मैं उस बारे में नहीं जानता। जब मैंने JSON को WCF के माध्यम से एक वर्ग तैयार किया, तो संपत्ति के नाम एक पूर्ववर्ती अंडरस्कोर के साथ सामने आए यदि वर्ग था Serializable, और जब विशेषता को हटा दिया गया था। तो कुछ हस्तक्षेप संभव है।
जेन्स

@ जेन्स अगर मैं सही ढंग से समझ गया तो JSON.net को इसके बारे में एक सा भी ध्यान नहीं है लेकिन asp.net इस व्यवहार को थोड़ा बदल देता है। मेरा मानना ​​है कि आप इसे JsonObject / JsonProperty विशेषताओं के साथ बदल सकते हैं।
आधार

29

सीरियलाइज़ेशन किसी वस्तु को बाइट्स की धारा में परिवर्तित करने की प्रक्रिया है ताकि ऑब्जेक्ट को स्टोर किया जा सके या इसे मेमोरी, एक डेटाबेस, या एक फ़ाइल में प्रसारित किया जा सके।

कैसे काम करता है सीरियलाइजेशन

यह चित्रण क्रमबद्धता की समग्र प्रक्रिया को दर्शाता है।

यहां छवि विवरण दर्ज करें

ऑब्जेक्ट को एक धारा में क्रमबद्ध किया जाता है, जो न केवल डेटा को ले जाता है, बल्कि ऑब्जेक्ट के प्रकार, जैसे कि इसके संस्करण, संस्कृति और विधानसभा के नाम के बारे में जानकारी प्राप्त करता है। उस स्ट्रीम से, इसे डेटाबेस, फ़ाइल या मेमोरी में स्टोर किया जा सकता है।

एमएसडीएन में विवरण।


19

यहाँ संक्षिप्त उदाहरण है कि कैसे क्रमांकन काम करता है। मैं भी उसी के बारे में सीख रहा था और मुझे दो लिंक उपयोगी लगे। Serialization क्या है और इसे .NET में कैसे किया जा सकता है

क्रमांकन की व्याख्या करने वाला एक नमूना कार्यक्रम

यदि आप उपरोक्त कार्यक्रम को नहीं समझते हैं, तो स्पष्टीकरण के साथ एक बहुत सरल कार्यक्रम यहां दिया गया है


14

क्रमबद्धता

सीरियलाइज़ेशन एक ऑब्जेक्ट या ऑब्जेक्ट्स ग्राफ के एक सेट को एक स्ट्रीम में परिवर्तित करने की प्रक्रिया है, यह बाइनरी क्रमांकन के मामले में एक बाइट सरणी है

सीरियलाइजेशन के उपयोग

  1. किसी फ़ाइल, डेटाबेस आदि में किसी वस्तु की स्थिति को बचाने के लिए और बाद में इसका उपयोग करने के लिए।
  2. एक मशीन पर एक प्रक्रिया से दूसरे (ऐप डोमेन) पर एक वस्तु भेजने के लिए और एक मशीन पर चल रही प्रक्रिया के लिए इसे तार पर भी भेजें।
  3. मुख्य ऑब्जेक्ट पर काम करते समय बैकअप के रूप में मूल वस्तु का एक क्लोन बनाने के लिए।
  4. ऑब्जेक्ट का एक सेट आसानी से सिस्टम के क्लिपबोर्ड पर कॉपी किया जा सकता है और फिर उसी या किसी अन्य एप्लिकेशन में पेस्ट किया जा सकता है

नीचे कुछ उपयोगी कस्टम विशेषताएँ दी गई हैं जो किसी ऑब्जेक्ट के क्रमांकन के दौरान उपयोग की जाती हैं

[Serializable] -> इसका उपयोग तब किया जाता है जब हम किसी वस्तु के क्रमिक [NonSerialized] को चिह्नित करते हैं -> इसका उपयोग तब किया जाता है जब हम किसी वस्तु के क्षेत्र को क्रमबद्ध नहीं करना चाहते। [OnSerializing] -> इसका उपयोग तब किया जाता है जब हम किसी वस्तु को क्रमबद्ध करते हुए कुछ क्रिया करना चाहते हैं [OnSerialized] -> इसका उपयोग तब किया जाता है जब हम किसी वस्तु को धारा में प्रवाहित करने के बाद कुछ क्रिया करना चाहते हैं।

नीचे क्रमबद्धता का उदाहरण दिया गया है

[Serializable]
    internal class DemoForSerializable
    {
        internal string Fname = string.Empty;
        internal string Lname = string.Empty;

        internal Stream SerializeToMS(DemoForSerializable demo)
        {
            DemoForSerializable objSer = new DemoForSerializable();
            MemoryStream ms = new MemoryStream();
            BinaryFormatter bf = new BinaryFormatter();
            bf.Serialize(ms, objSer);
            return ms;
        }

        [OnSerializing]
        private void OnSerializing(StreamingContext context) {
            Fname = "sheo";
            Lname = "Dayal";
        }
        [OnSerialized]
        private void OnSerialized(StreamingContext context)
        {
       // Do some work after serialized object
        }

    }

यहाँ कॉलिंग कोड है

class Program
    {
        string fname = string.Empty;
        string Lname = string.Empty; 

       static void Main(string[] args)
        {
            DemoForSerializable demo = new DemoForSerializable();

            Stream ms = demo.SerializeToMS(demo);
            ms.Position = 0;

            DemoForSerializable demo1 = new BinaryFormatter().Deserialize(ms) as DemoForSerializable;

            Console.WriteLine(demo1.Fname);
            Console.WriteLine(demo1.Lname);
            Console.ReadLine();
        }

    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.