33

मुझे डेटाकॉन्ट्राक्टेरियलाइज़र के बारे में एक त्वरित प्रश्न था। शायद यह एक स्ट्रीम सवाल है। मुझे कोड का एक टुकड़ा मिला जो एक फाइलस्ट्रीम में एक्सएमएल लिखता है। मैं मूल रूप से फ़ाइल नहीं चाहता और केवल स्ट्रिंग आउटपुट की आवश्यकता है।DataContractSerializer - मैं xml को एक स्ट्रिंग में कैसे आउटपुट कर सकता हूं (फ़ाइल के विपरीत)

public static string DataContractSerializeObject<T>(T objectToSerialize) 
{ 
    var fs = new FileStream("test.xml", FileMode.OpenOrCreate); 
    var serializer = new DataContractSerializer(typeof(T)); 
    serializer.WriteObject(fs, objectToSerialize); 
    fs.Close(); 
    return fs.ToString(); 
} 

fs.ToString() स्पष्ट रूप से वह नहीं है जिसे मैं ढूंढ रहा हूं। क्या स्ट्रीम या लेखक इत्यादि, क्या मैं सिर्फ उचित स्ट्रिंग को वापस करने और फ़ाइल बनाने के लिए उपयोग नहीं कर सकता? मैंने एक्सएमएल को फाइलस्ट्रीम बनाया है और यह वही है जो मैं ढूंढ रहा हूं। XmlSerializer ने XML को थोड़ा अजीब लिखा और मैं इस मामले में DataContractSerializer के आउटपुट को प्राथमिकता देता हूं। क्या कोई मुझे सही दिशा दिखा सकता है?

उत्तर

60

कुछ इस तरह - एक MemoryStream में अपने उत्पादन में डाल दिया और फिर वापस पढ़ा है कि में:

public static string DataContractSerializeObject<T>(T objectToSerialize) 
{ 
    using(MemoryStream memStm = new MemoryStream()) 
    { 
     var serializer = new DataContractSerializer(typeof(T)); 
     serializer.WriteObject(memStm, objectToSerialize); 

     memStm.Seek(0, SeekOrigin.Begin); 

     using(var streamReader = new StreamReader(memStm)) 
     { 
      string result = streamReader.ReadToEnd(); 
      return result; 
     } 
    } 
} 
+2

लग रहा है आप की तरह इंटर पैरामीटर बदल दिया, यह memstm.Seek होना चाहिए (0, SeekOrigin.Begin); – xar

+0

@xar: हाँ, आप बिल्कुल सही हैं - उस गलती को खोजने के लिए धन्यवाद - मैंने इसे अभी तय किया है –

+0

यह समाधान अनावश्यक रूप से utf8 से/एन्कोड करता है। –

22

@ xr280xr के लिए धन्यवाद पहले मसौदे में मेरी भूल StringWriter निपटान ओर इशारा करते हुए के लिए।

/// <summary> 
/// Converts this instance to XML. 
/// </summary> 
/// <returns>XML representing this instance.</returns> 
public string ToXml() 
{ 
    var serializer = new DataContractSerializer(this.GetType()); 
    using (var output = new StringWriter()) 
    using (var writer = new XmlTextWriter(output) { Formatting = Formatting.Indented }) 
    { 
     serializer.WriteObject(writer, this); 
     return output.GetStringBuilder().ToString(); 
    } 
} 
+1

आपका स्ट्रिंगवाइटर भी निपटान किया जाना चाहिए। – xr280xr

+5

स्टैक्ड यूजिंग बस यही करते हैं। – StingyJack

+0

यह DataContractSerializer (और XmlSerializer के लिए समान रूप से) के लिए एक महान एक्सटेंशन विधि भी बना देगा। 'सार्वजनिक स्थैतिक स्ट्रिंग WriteObjectToString (यह डेटा कंट्रैक्टसाइराइज़र सीरियलाइज़र, ऑब्जेक्ट ओबीजे) {...} ' – JamesFaix

18

और भी आसान:

var serializer = new DataContractSerializer(typeof(T)); 
var sb = new StringBuilder(); 
using (var writer = XmlWriter.Create(sb)) 
{ 
    serializer.WriteObject(writer, objectToSerialize); 
    writer.Flush(); 
    return sb.ToString(); 
} 
2

मैं Pat और marc_s द्वारा दिए गए तरीकों के संयोजन का सुझाव:

public static string DataContractSerializeObject<T>(T objectToSerialize) 
{ 
    using (var output = new StringWriter()) 
    using (var writer = new XmlTextWriter(output) {Formatting = Formatting.Indented}) 
    { 
     new DataContractSerializer(typeof (T)).WriteObject(writer, objectToSerialize); 
     return output.GetStringBuilder().ToString(); 
    } 
} 
+0

यह मार्क की विधि के साथ पैट की विधि है। – HappyNomad

0

@ जड़ के जवाब का एक प्रकार:

var serializer = new DataContractSerializer(typeof(T)); 
var sb = new StringBuilder(); 
using (var writer = XmlWriter.Create(sb)) 
{ 
    serializer.WriteObject(writer, objectToSerialize); 
} 

return sb.ToString(); 
संबंधित मुद्दे

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