2010-07-13 40 views
33

我有一个关于datacontractserializer的快速问题。也许它更像是一个流问题。我找到了一段将xml写入文件流的代码。我基本上不需要该文件,只需要输出字符串。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()显然不是我在找的东西。什么流或作家等,我可以使用只是为了返回正确的字符串,而不是创建一个文件?我确实查看了文件流创建的XML,这正是我正在寻找的。 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 2012-07-26 08:29:24

+0

@xar:是的,你是对的 - 感谢你发现了这个错误 - 我现在修复了它 – 2012-07-26 08:32:13

+0

这个解决方案不必要地编码到/从utf8。 – 2017-03-07 19:37:17

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

你的StringWriter也应该被丢弃。 – xr280xr 2013-12-11 20:56:49

+5

堆叠的使用者可以做到这一点。 – StingyJack 2015-02-05 21:33:46

+0

这也将成为DataContractSerializer的一个很好的扩展方法(并且类似于XmlSerializer)。 '公共静态字符串WriteObjectToString(此DataContractSerializer序列化程序,对象obj){...}' – JamesFaix 2016-05-18 15:32:09

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

我建议组合由Patmarc_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

这是Pat的marc_s方法签名方法。 – HappyNomad 2014-03-12 04:15:30

0

@根的答案的一种变体:

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

return sb.ToString(); 
相关问题