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 后崩溃

在原语列表上使用 DataContractSerializer 的自定义元素名称