बिना सेटर के संपत्तियों को सीरियस क्यों नहीं किया जाता है


101

मेरे पास एक अनुक्रमिक वर्ग है और मेरी कक्षा में गुणों में से एक Guidगेटटर में एक उत्पन्न करता है । संपत्ति बिना किसी सेटर को लागू करती है और क्रमांकन के दौरान अनदेखी की जाती है। ऐसा क्यों है और क्या मुझे हमेशा अपनी संपत्ति को क्रमबद्ध करने के लिए एक सेटर को लागू करना पड़ता है।

[Serializable]
public class Example
{
    [XmlAttribute("id")]
    public string Id
    {
        get
        {
             return Guid.NewGuid().ToString();
        }
    }
}

मैंने एक खाली सेटर को लागू करने की कोशिश की और यह सही ढंग से क्रमबद्ध हो गया।

[Serializable]
public class Example
{
    [XmlAttribute("id")]
    public string Id
    {
        get
        {
             return Guid.NewGuid().ToString();
        }
        set {}
    }
}

अपडेट :

क्या आप बता सकते हैं कि मुझे ऐसे गुणों को कैसे परिभाषित करना चाहिए जिनके मूल्य कभी नहीं बदलते हैं या जिनके लिए मूल्य आंतरिक रूप से उत्पन्न होता है?


1
दूसरा उदाहरण सही ढंग से क्रमबद्ध है ... लेकिन क्या होता है जब आप इसे deserialize करने की कोशिश करते हैं?
लाइटस्ट्राइकर

YAXLib [+ , + ] को
आज़माएं

3
FYI करें, XML Serializer अनदेखा करता है [Serializable]
जॉन सॉन्डर्स

@ जॉनसनर्स मुझे इस बारे में जानकारी नहीं थी।
कोन्स्टेंटिन दिनेव

जवाबों:


60

यह XmlSerializerकेवल पढ़ने योग्य गुणों को क्रमबद्ध नहीं करता है , इसकी एक सीमा यह है कि आपने अपने दूसरे उदाहरण में क्या किया है, यह अनिवार्य रूप से इसे क्रमबद्ध करने के लिए प्राप्त करने के लिए हैक है, हालांकि, यदि आप इसे बाद में डिसेर्बलाइज करना चाहते हैं, तो यह बेकार है।

वैकल्पिक रूप से आप DataContractSerializer का उपयोग करने के लिए स्विच कर सकते हैं , यह अधिक लचीला है।


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

7
@ryadavilli के रूप [DataMember]में चिह्नित कुछ भी अनुक्रमित है DataContractSerializer(केवल पढ़ने के लिए या नहीं) का उपयोग कर ।
जेम्स

1
@ जेम्स मैंने ऊपर लिखा है क्योंकि जब मैंने एक ही कोशिश की तो मुझे कुछ संकलन समय त्रुटियां मिलीं। अब, जब मैं अपने कोड पर वापस आ गया और सेटर को हटा दिया, तो यह ठीक संकलन लगता है। यह इस पर अधिक शोध करने के लिए मेरे लिए बहुत ही अजीब और शायद होमवर्क है।
रियादिल्ली

3
अहह आखिरकार मेरी उलझन का स्रोत मिल गया। क्रमांकन के लिए एक संपत्ति सेटर की आवश्यकता नहीं है। हालाँकि, यदि किसी प्रॉपर्टी में सेटर नहीं है, तो XML किसी ऑब्जेक्ट के लिए डीसर्विलाइज़ नहीं होगा। वहां, होमवर्क खत्म हुआ।
रियादिल्ली

1
@ryadavilli हां ठीक है, यह सिर्फ XmlSerializerकार्यान्वयन की एक सीमा है , यह सार्वजनिक सेटर विधि पर निर्भर करता है। DataContractSerializerउस अर्थ में थोड़ा अधिक चतुर है (शायद पर्दे के पीछे के क्षेत्र को सेट करने के लिए प्रतिबिंब का उपयोग करके)।
जेम्स

10

MSDN प्रलेखन में " एक्सएमएल सीरियल का परिचय दें " देखें । अन्य बातों के अलावा, यह कहता है:

आइटम जो सीरियल हो सकते हैं

निम्नलिखित आइटम XmlSerializer वर्ग का उपयोग करके क्रमबद्ध किए जा सकते हैं:

Public read/write properties and fields of public classes.

Classes that implement ICollection or IEnumerable.

ध्यान दें:

Only collections are serialized, not public properties.
XmlElement objects.

XmlNode objects.

DataSet objects.

इसके अलावा, देखें " एक्सएमएल-सीरियल योग्य वर्ग को एक पैरामीटर रहित निर्माता की आवश्यकता क्यों है "


इसके अलावा, IXmlSerializable

उपरोक्त प्रकारों के अलावा जो एक्सएमएल सीरियललाइज़र द्वारा क्रमबद्ध किया जा सकता है, किसी भी प्रकार जो IXmlSerializable इंटरफ़ेस को लागू करता है, को क्रमबद्ध और deserialized किया जा सकता है। विशेष रूप से, इसका मतलब है कि XElement और XDocument प्रकारों को क्रमबद्ध किया जा सकता है।

" IXmlSerializable इंटरफ़ेस " देखें ।


6

की सीमा XMLSerializer- बिना सेटर के गुणों को क्रमबद्ध नहीं किया जा सकता है।

लेकिन आप DataContractSerializerधारावाहिक बनाने के लिए उपयोग कर सकते हैं private setter properties-

[DataMember]
public string Id
{
    get
    {
         return Guid.NewGuid().ToString();
    }
    private set {}
}

संपत्ति को xml- विशेषता के रूप में क्रमबद्ध किया जाना चाहिए (मूल पोस्ट देखें)। आपका कोड (DataMember विशेषता) एक xml- तत्व पैदा करता है। जहाँ तक मुझे पता है कि DataContractSerializer को गुण को एक गुण में बदलने के लिए और कोई तत्व नहीं बताने का कोई (साफ) तरीका नहीं है। DataContractSerializer अच्छा है लेकिन आपको हमेशा इस सीमा को ध्यान में रखना होगा।
sth_Weird

2

यदि आप निजी बसावट चाहते हैं, और वस्तु क्रमिक / वांछनीय है, तो इसका मतलब यह है कि इसका उपयोग करने योग्य है, और MyObject (SerializationInfo जानकारी, StreamingContext संदर्भ) की तरह एक निर्माता बनाएँ। एक उदाहरण यहाँ मिलता है


0

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

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