2010-07-13 19 views
33

Datacontractserializer ile ilgili hızlı bir soruyla karşılaştım. Belki daha çok bir akış sorusu. Xml'yi bir filestream'e yazan bir kod parçası buldum. Temelde dosyayı istemiyorum ve sadece string çıktısına ihtiyacım var.DataContractSerializer - xml'yi bir dizeye nasıl gönderebilirim (bir dosyanın karşıtı olarak)

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() kesinlikle aradığım şey değil. Hangi akışı veya yazarı vs., sadece uygun dizeyi döndürmek ve bir dosya oluşturmamak için kullanabilir miyim? Ben oluşturulan filestream XML baktım ve tam olarak ne aradığımı. XmlSerializer XML'i biraz garip yazdı ve bu durumda DataContractSerializer'ın çıktısını tercih ediyorum. Beni doğru yöne yönlendiren var mı? Böyle

cevap

60

şey - o geri okunan ardından MemoryStream içine çıkışını koyup: @ xr280xr için

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

görünüyor senin gibi Parametreyi değiştirdi, memStm.Seek (0, SeekOrigin.Begin) olmalıdır; – xar

+0

@xar: evet, kesinlikle haklısınız - bu hatayı fark ettiğiniz için teşekkürler - şimdi düzeltdim –

+0

Bu çözüm gereksiz yere utf8 kodlar. –

22

Teşekkür ilk taslakta benim unutulmuş StringWriter bertarafını işaret için.

/// <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

StringWriter'iniz de atılmalıdır. – xr280xr

+5

Yığılmış kullanımlar sadece bunu yapar. – StingyJack

+0

Bu, DataContractSerializer için (ve XmlSerializer için benzer şekilde) büyük bir uzantı yöntemi de yapar. public statik dize WriteObjectToString (bu DataContractSerializer serializer, object obj) {...} ' – JamesFaix

18

Ve daha da kolay:

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

Ben Pat ve marc_s tarafından verilen yöntemleri birleştirerek öneririz:

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

Bu, marc_s yöntem imzasıyla Pat'ın yöntemidir. – HappyNomad

0

@ root cevabı bir varyantı:

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

return sb.ToString(); 
İlgili konular