2012-06-21 8 views
11

से सी # डब्ल्यूसीएफ डेटा कंट्रैक्ट को क्रमबद्ध/deserialize कैसे करें मैं एक डब्ल्यूसीएफ सेवा विकसित कर रहा हूं जो कई अलग-अलग क्लाइंट अनुप्रयोगों द्वारा उपभोग किया जाएगा। एक कार्यक्षमता कार्य करने के लिए, सर्वर को एक XML फ़ाइल को C# DataContract में पढ़ने की आवश्यकता होती है जिसे बाद में संबंधित क्लाइंट को पास किया जाता है। जहां तक ​​मैं एमएसडीएन वेबसाइट से समझता हूं, यह संभव है लेकिन मुझे कोई पूरा उदाहरण नहीं मिला। विशेष रूप से, वेबसाइट 'स्ट्रीम' पैरामीटर के बारे में बात करती है जिसे मैं अभी तक नहीं मिला हूं।एक्सएम

मेरे डेटा अनुबंध में एक संपत्ति क्षेत्र है जो एक अन्य डेटा अनुबंध की एक सूची है जिसमें कई साधारण संपत्ति फ़ील्ड हैं।

उदा।

[DataContract] 
    public class MyClass1 { 
     [DataMember] 
     public string name; 
     [DataMember] 
     public int age; 
    } 

    [DataContract] 
    public class MyClass2 { 
     [DataMember] 
     public List<MyClass1> myClass1List; 
    } 

मेरी कक्षाएं इस तरह कुछ दिखती हैं।

+0

डुप्लिकेट: http://stackoverflow.com/questions/4858798/datacontract-xml-serialization-and-xml-attributes – DarthVader

उत्तर

13

यहाँ एक उदाहरण

MyClass1 obj = new MyClass1(); 
DataContractSerializer dcs = new DataContractSerializer(typeof(MyClass1)); 

using (Stream stream = new FileStream(@"C:\tmp\file.xml", FileMode.Create, FileAccess.Write)) 
{ 
    using (XmlDictionaryWriter writer = 
     XmlDictionaryWriter.CreateTextWriter(stream, Encoding.UTF8)) 
    { 
     writer.WriteStartDocument(); 
     dcs.WriteObject(writer, obj); 
    } 
} 

Books b = new Books(); 

DataContractSerializer dcs = new DataContractSerializer(typeof(Books)); 

try 
{ 
    Stream fs = new FileStream(@"C:\Users\temelm\Desktop\XmlFile.xml", FileMode.Create, FileAccess.Write); 

    XmlDictionaryWriter xdw = XmlDictionaryWriter.CreateTextWriter(fs, Encoding.UTF8); 
    xdw.WriteStartDocument(); 
    dcs.WriteObject(xdw, b); 
    xdw.Close(); 
    fs.Flush(); 
    fs.Close(); 
} 
catch (Exception e) 
{ 
    s += e.Message + "\n"; 
} 
+0

@KirkWoll क्या क्या करता है? और क्या होगा यदि मैं केवल एक्सएमएल फ़ाइल में 1 तत्व जोड़ना चाहता हूं? – temelm

+0

[मेटाडाटा से] - जब व्युत्पन्न कक्षा में ओवरराइड किया गया है, तो संस्करण "1.0" के साथ एक्सएमएल घोषणा लिखता है। और यह कोड फ़ाइल के लिए केवल 1 ऑब्जेक्ट लिखता है, यदि आपका यही मतलब है। – Bond

+0

यह एक वस्तु लिखता है लेकिन वह वस्तु अन्य वस्तुओं की एक सूची है, इसलिए यह ठीक है। एक मौजूदा XML दस्तावेज़ को डेटाकंट्रैक्ट में पढ़ने के बारे में कैसे। कोई विचार? – temelm

0

NetDataContractSerializer जो समस्याओं जब WCF का उपयोग कर की एक पूरी गुच्छा हल करती है है।

यहाँ देखें MSDN NetDataContractSerializer

यह आमतौर पर वस्तुओं के सभी प्रकार लपेटकर और WCF से अधिक इसे पारित करने के लिए प्रयोग किया जाता है।

आप एक byte[] में वस्तुओं लपेटकर के लिए इसका इस्तेमाल करते हैं और serverside पर WCF, से अधिक परिवहन कर सकते हैं, आप आसानी से वस्तुओं deserialize और जो कुछ भी आप उनके साथ चाहते हैं कर सकते हैं। MSDN Social

कोड के टुकड़े वहाँ भी प्रदान की जाती हैं:

यहाँ कैसे सही ढंग से इस Serializer उपयोग करने के लिए पर एक चर्चा है!

+1

डब्ल्यूटीएफ, जर्मनी के माइक्रोसॉफ्ट साइट के लिंक के लिए फ्लश नहीं किया गया ??? आप शायद मतलब था: http://msdn.microsoft.com/library/system.runtime.serialization.netdatacontractserializer.aspx – Luuk

2

यह आपके लिए उपयोगी हो सकता है। जब आपको XElement की आवश्यकता होती है। उदाहरण के लिए जब आप XDocument में नोड संलग्न करते हैं या इस दस्तावेज़ के XElement को दोहराते हैं।

private XElement objectToXElement(SomeContractType obj) 
     { 
      DataContractSerializer dcs = new DataContractSerializer(typeof(SomeContractType); 

      var ms = new MemoryStream(); 
      var xw = XmlWriter.Create(ms); 
      dcs.WriteObject(xw, obj); 
      xw.Flush(); 
      xw.Close(); 
      ms.Position = 0; 
      XElement xe = XElement.Load(ms); 

      return xe; 
     } 
संबंधित मुद्दे