DataContractSerializer - 如何将 xml 输出到字符串(而不是文件)
Posted
技术标签:
【中文标题】DataContractSerializer - 如何将 xml 输出到字符串(而不是文件)【英文标题】:DataContractSerializer - how can I output the xml to a string (as opposed to a file) 【发布时间】:2011-03-15 09:40:23 【问题描述】:我有一个关于 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 的输出。谁能指出我正确的方向?
【问题讨论】:
【参考方案1】:类似这样的东西 - 将您的输出放入 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;
【讨论】:
看来你调换了参数,应该是memStm.Seek(0,SeekOrigin.Begin); @xar: 是的,你是绝对正确的 - 感谢您发现这个错误 - 我现在修复了它【参考方案2】:感谢 @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();
【讨论】:
你的 StringWriter 也应该被处理掉。 堆叠使用就是这样做的。 这也将成为 DataContractSerializer 的一个很好的扩展方法(同样适用于 XmlSerializer)。public static string WriteObjectToString(this DataContractSerializer serializer, object obj)...
【参考方案3】:
甚至更简单:
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();
【讨论】:
【参考方案4】:我建议结合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();
【讨论】:
这是 Pat 的方法,带有 marc_s 的方法签名。【参考方案5】:@root 答案的变体:
var serializer = new DataContractSerializer(typeof(T));
var sb = new StringBuilder();
using (var writer = XmlWriter.Create(sb))
serializer.WriteObject(writer, objectToSerialize);
return sb.ToString();
【讨论】:
以上是关于DataContractSerializer - 如何将 xml 输出到字符串(而不是文件)的主要内容,如果未能解决你的问题,请参考以下文章
使用 DataContractSerializer 自定义序列化
DataContractSerializer - 如何将 xml 输出到字符串(而不是文件)
通过 DataContractSerializer 跳过 DataMember
使用 DataContractSerializer 时设置属性的初始值
使用 DataContractSerializer 和 XmlDictionaryWriter 序列化 JObject 后崩溃