2009-02-26 7 views
14

अगर मैं एक वर्ग के रूप में चिह्नित एक DataContract और उस पर कुछ गुण DataMember विशेषताओं के साथ चिह्नित मैं आसानी से एक्सएमएल के लिए बाहर यह क्रमानुसार सकता है, लेकिन यह की तरह उत्पादन बनाना होगा:आप .NET DataContract serialization को कैसे नियंत्रित कर सकते हैं ताकि यह तत्वों के बजाय एक्सएमएल विशेषताओं का उपयोग कर सके?

<Person> 
    <Name>John Smith</Name> 
    <Email>[email protected]</Email> 
    <Phone>123-123-1234</Phone> 
</Person> 

मैं क्या पसंद करेंगे गुण है , की तरह ...

<Person Name="John Smith" Email="[email protected]" Phone="123-123-1234" /> 

DataMember विशेषता मुझे नाम और व्यवस्था को नियंत्रित करने के नहीं, बल्कि चाहे वह एक तत्व या विशेषता के रूप में धारावाहिक की अनुमति देता है। मैंने चारों ओर देखा है और DataContractFormat और IXmlSerializable पाया है, लेकिन मुझे उम्मीद है कि वहां एक आसान समाधान है।

ऐसा करने का सबसे आसान तरीका क्या है?

+0

इसके अलावा, मुझे जेएसओएन काम करने के दौरान इस तरह काम करने के लिए एक्सएमएल की आवश्यकता है। – Brennan

उत्तर

11

आप DataContractSerializer के साथ ऐसा नहीं कर सकते हैं; यदि आप विशेषताओं को चाहते हैं तो आपको इसके बजाय XmlSerializer का उपयोग करने की आवश्यकता है। DataContractSerializer वर्ग के साथ एक्सएमएल विनिर्देश के अधिक प्रतिबंधक सबसेट की अनुमति है जो प्रदर्शन में सुधार करता है, और प्रकाशित सेवाओं की अंतःक्रियाशीलता में सुधार करता है, लेकिन आपको XML प्रारूप पर कम नियंत्रण देता है।

यदि आप डब्ल्यूसीएफ सेवाओं का उपयोग कर रहे हैं तो XmlSerializerFormatAttribute पर एक नज़र डालें जो आपको क्रमशः XmlSerializer का उपयोग करने की अनुमति देता है।

+1

इसे विशेषताओं का उपयोग करने के लिए एक आसान तरीका होना चाहिए। मुझे वेब सेवाओं की परवाह नहीं है, मैं सिर्फ एक विशिष्ट प्रारूप में एक्सएमएल आउटपुट करने के लिए। – Brennan

+0

हाय, मैं, डर ग्रेग सही है - DataContractSerializer की सीमाओं के लिए http://msdn.microsoft.com/en-us/library/ms731923.aspx देखें। – larsw

+1

यदि आपको वेब सेवाओं की परवाह नहीं है, तो आप डब्ल्यूसीएफ का उपयोग क्यों कर रहे हैं? क्या आप बस कुछ कक्षाओं को क्रमबद्ध करने की कोशिश कर रहे हैं? यदि ऐसा है, तो XmlSerializer का उपयोग स्वयं ही करें। –

34

आप DataContractSerializer के साथ ऐसा कर सकते हैं - जवाब है IXmlSerializable इंटरफेस को लागू करने से Xml क्रमबद्धता स्वयं लेना। लिखने केवल समर्थन के लिए - आप GetSchema के लिए ReadXml खाली की क्रियान्वयन, और वापसी अशक्त छोड़ सकते हैं, और इस प्रकार तो WriteXml के कार्यान्वयन लिखें:

public class MyPerson : IXmlSerializable 
{ 
    public string Name { get; set;} 
    public string Email { get; set;} 
    public string Phone { get; set;} 

    public XmlSchema GetSchema() { return null; } 
    public void ReadXml(XmlReader reader) { } 
    public void WriteXml(XmlWriter writer) 
    { 
    writer.WriteAttributeString("name", Name); 
    writer.WriteAttributeString("email", Email); 
    writer.WriteAttributeString("phone", Phone); 
    } 
} 

आप एक ही उपयोग कर रहे हैं जेएसओएन सीरियलाइजेशन के लिए टाइप करें, कहें, फिर भी आप डेटाकंट्रैक्ट और डेटामेम्बर विशेषताओं को जोड़ने के लिए स्वतंत्र हैं - डेटाकंट्रैक्टसाइराइज़र केवल एक्सएमएल लिखते समय IXmlSerializable इंटरफ़ेस कार्यान्वयन का उपयोग करेगा।

मैंने इस here के बारे में ब्लॉग किया।

+0

क्या आप निश्चित हैं कि 'DataContractSerializer' इस कोड की' WriteXml' विधि 'का आह्वान करेगा? –

+1

मुझे पता है - यह असंभव लगता है - लेकिन मैंने अभी हमारे कॉर्पोरेट ब्लॉग पर http: //www.labs.jobserve पर एक लेख पोस्ट किया है।कॉम/articles.aspx/बिल्डिंग-लैब्स - लेखन-एक-ओपनशर्च-सुझाव-प्रदाता-इन-सी-डब्ल्यूसीएफ के साथ जहां आप स्रोत कोड डाउनलोड कर सकते हैं जो इसे क्रिया में दिखाता है (ओपनशर्च सुझावों को लागू करने के लिए इसका उपयोग करके)। यह एमएसडीएन सामग्री से सुराग आया: http://msdn.microsoft.com/en-us/library/ms731923.aspx। –

+0

इसके अलावा, http://msdn.microsoft.com/en-us/library/aa347876.aspx देखना सुनिश्चित करें। –

0

सीरियलाइजिंग/deserializing जब आप गुणों और तत्वों के बीच आगे और पीछे परिवर्तित कर सकते हैं। बाद के लिए निम्नलिखित काम करता है।

private XmlReader AttributesToElements(Stream stream) 
    { 
      var root = XElement.Load(stream); 
      foreach (var element in root.Descendants()) { 
        foreach (var attribute in element.Attributes()) 
          element.Add(new XElement(root.Name.Namespace + attribute.Name.LocalName, (string)attribute)); 
        element.Attributes().Remove(); 
      } 
      return root.CreateReader(); 
    } 
संबंधित मुद्दे

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