C# DataContractSerializer-如何将xml输出为字符串(与文件相反)
我有一个关于datacontractserializer的快速问题。也许这更像是一个流问题。我发现了一段将xml写入文件流的代码。我基本上不需要文件,只需要字符串输出C# DataContractSerializer-如何将xml输出为字符串(与文件相反),c#,xml-serialization,stream,iostream,datacontractserializer,C#,Xml Serialization,Stream,Iostream,Datacontractserializer,我有一个关于datacontractserializer的快速问题。也许这更像是一个流问题。我发现了一段将xml写入文件流的代码。我基本上不需要文件,只需要字符串输出 public static string DataContractSerializeObject<T>(T objectToSerialize) { var fs = new FileStream("test.xml", FileMode.OpenOrCreate); var serializer
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();
}
公共静态字符串DataContractSerialize对象(T objectToSerialize)
{
var fs=new FileStream(“test.xml”,FileMode.OpenOrCreate);
var serializer=新的DataContractSerializer(typeof(T));
WriteObject(fs,objectToSerialize);
fs.Close();
返回fs.ToString();
}
fs.ToString()显然不是我想要的。我可以使用什么流或编写器等返回正确的字符串而不创建文件?我确实看过文件流创建的XML,它正是我要寻找的。XmlSerializer编写的XML有点奇怪,在本例中,我更喜欢DataContractSerializer的输出。有人能给我指出正确的方向吗?类似这样的内容-将您的输出放入
内存流中,然后读回:
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;
}
}
}
公共静态字符串DataContractSerialize对象(T objectToSerialize)
{
使用(MemoryStream memStm=new MemoryStream())
{
var serializer=新的DataContractSerializer(typeof(T));
WriteObject(memStm,objectToSerialize);
memStm.Seek(0,SeekOrigin.Begin);
使用(var streamReader=newstreamreader(memStm))
{
字符串结果=streamReader.ReadToEnd();
返回结果;
}
}
}
感谢@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();
}
}
//
///将此实例转换为XML。
///
///表示此实例的XML。
公共字符串ToXml()
{
var serializer=新的DataContractSerializer(this.GetType());
使用(var输出=新的StringWriter())
使用(var writer=newxmltextwriter(输出){Formatting=Formatting.Indented})
{
serializer.WriteObject(writer,this);
返回output.GetStringBuilder().ToString();
}
}
甚至更简单:
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();
}
我建议结合和给出的方法:
公共静态字符串DataContractSerialize对象(T objectToSerialize)
{
使用(var输出=新的StringWriter())
使用(var writer=newxmltextwriter(输出){Formatting=Formatting.Indented})
{
新的DataContractSerializer(typeof(T)).WriteObject(writer,objectToSerialize);
返回output.GetStringBuilder().ToString();
}
}
@root答案的变体:
var serializer = new DataContractSerializer(typeof(T));
var sb = new StringBuilder();
using (var writer = XmlWriter.Create(sb))
{
serializer.WriteObject(writer, objectToSerialize);
}
return sb.ToString();
看起来您交换了参数,它应该是memStm.Seek(0,SeekOrigin.Begin)@xar:是的,你完全正确-感谢你发现了这个错误-我现在已经修复了你的StringWriter也应该被处理掉。堆叠的using就是这样做的。这也将成为DataContractSerializer(和XmlSerializer类似)的一个很好的扩展方法<代码>公共静态字符串WriteObjectToString(此DataContractSerializer序列化程序,对象obj){…}
这是Pat的方法,带有marc_的方法签名。
var serializer = new DataContractSerializer(typeof(T));
var sb = new StringBuilder();
using (var writer = XmlWriter.Create(sb))
{
serializer.WriteObject(writer, objectToSerialize);
}
return sb.ToString();