2009-04-02 12 views
8

क्रमबद्धता पर अधिक नियंत्रण प्राप्त करने के लिए, मैंने [डेटाकंट्रैक्ट] से [सीरियलज़ेबल] में एक वर्ग को परिवर्तित किया है, जो GetObjectData और विशेष deserializing कन्स्ट्रक्टर दोनों को कार्यान्वित करता है। जब मैं ऐसा करता हूं, तो अब उत्सर्जित एक्सएमएल में सभी तत्वों पर लागू प्रकार की जानकारी होती है। मुझे यह अनिवार्य जानकारी नहीं चाहिए, और मैं सोच रहा हूं कि सीरिएलाइज़र को इसे आउटपुट करने के लिए कैसे सूचित किया जाए। (- इस वांछित आउटपुट है पर Nullable संख्या और संख्या कोई प्रकार की जानकारी नोटिस)DataContractSerializer के साथ ISerializable का उपयोग करते समय, मैं serializer को प्रकार की जानकारी आउटपुट से कैसे रोकूं?

[DataContract(Namespace = "")] 
class Test 
{ 
    public Test() { } 
    [DataMember] 
    public Nullable<int> NullableNumber = 7; 
    [DataMember] 
    public int Number = 5; 

    public static void Go() 
    { 
     var test = new Test(); 
     var dcs = new DataContractSerializer(typeof(Test)); 
     using (var s = new StreamWriter("test.xml")) 
     { 
      dcs.WriteObject(s.BaseStream, test); 
     } 
    }   
} 

यह निम्न XML आउटपुट:

<Test xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <NullableNumber>7</NullableNumber> 
    <Number>5</Number> 
</Test> 

यहाँ नमूना कोड का उपयोग करता है [DataContract] है

इस प्रकार मैं ऊपर कोड को संशोधित करते हैं (जोड़ने [Serializable],: ISerializable, और दो क्रमबद्धता विधि):

[Serializable] 
class Test : ISerializable 
{ 
    public Test() { } 
    public Nullable<int> NullableNumber = 7; 
    public int Number = 5; 

    public static void Go() 
    { 
     var test = new Test(); 
     var dcs = new DataContractSerializer(typeof(Test)); 
     using (var s = new StreamWriter("test.xml")) 
     { 
      dcs.WriteObject(s.BaseStream, test); 
     } 
    }   
    public Test(SerializationInfo info, StreamingContext context) 
    { 
     NullableNumber = info.GetInt32("NullableNumber"); 
     Number = info.GetInt32("Number"); 
    } 

    public void GetObjectData(SerializationInfo info, StreamingContext context) 
    { 
     info.AddValue("NullableNumber", NullableNumber); 
     info.AddValue("Number", Number); 
    } 
} 

अब यह निम्नलिखित एक्सएमएल उत्सर्जित करता है। प्रकार की जानकारी पर ध्यान दें (i: type = "x: int") प्रत्येक तत्व में जोड़ा गया है।

<Test xmlns="http://schemas.datacontract.org/2004/07/XMLSerialization" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:x="http://www.w3.org/2001/XMLSchema"> 
    <NullableNumber i:type="x:int" xmlns="">7</NullableNumber> 
    <Number i:type="x:int" xmlns="">5</Number> 
</Test> 

ऐसा क्यों कर रहा है? मैं इसे करने से कैसे रोकूं?

धन्यवाद!

+0

प्रश्न के लिए धन्यवाद, क्योंकि यह मेरा प्रश्न हल करता है :-) "क्यों" के लिए - पहले उदाहरण में प्रत्येक प्रविष्टि एक फ़ील्ड की गारंटी थी, इसलिए आप केवल देखकर मैदान का प्रकार प्राप्त कर सकते हैं 'टेस्ट' प्रकार पर। दूसरे मामले में ** आप ** नियंत्रण में हैं, इसलिए उन प्रविष्टियों को फ़ील्ड होने की ज़रूरत नहीं है, आप केवल यादृच्छिक डेटा लिख ​​/ पढ़ सकते हैं। – astrowalker

उत्तर

0

क्या आपको यहां ISerializable की आवश्यकता है? नियमित DataContractSerializer आपको क्या नहीं दे रहा था? यदि आप इस पर वापस स्विच करते हैं, तो इसे ठीक काम करना चाहिए।

असल में, कस्टम क्रमिकरण को कार्यान्वित करके, डेटा अब अनुबंध आधारित नहीं है - इसलिए में है ताकि यह अतिरिक्त जानकारी शामिल हो सके कि यह बाद में इसे समझने में सक्षम है।

तो: क्या इस मामले में ISerializable लागू करने का कोई कारण है?

+0

मैंने प्रश्न को आसान बनाने के लिए उदाहरण को छीन लिया। मुझे उन कारणों के लिए कस्टम क्रमबद्धता की आवश्यकता है जो मैं यहां नहीं दिखाता हूं। – Eric

+0

कारणों की (लंबी सूची) में मुझे कस्टम क्रमिकरण की आवश्यकता है, सबसे बड़ी बात यह है कि मुझे अन्य जानकारी के आधार पर कुछ गुणों को सशर्त रूप से आउटपुट करने की आवश्यकता है। – Eric

+1

मुझे "यह" इस अतिरिक्त जानकारी को शामिल करने के बारे में आपकी टिप्पणी को समझ में नहीं आता है। दरअसल, उपरोक्त पहला एक्सएमएल उदाहरण [सीरियलज़ेबल] deserializer के साथ बस ठीक है, इसलिए deserializer इस प्रकार की जानकारी की आवश्यकता नहीं है। – Eric

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

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