【问题标题】:DataContractSerializer - how can I output the xml to a string (as opposed to a file)DataContractSerializer - 如何将 xml 输出到字符串(而不是文件)
【发布时间】: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 的输出。谁能指出我正确的方向?

【问题讨论】:

    标签: c# xml-serialization stream iostream 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】:

      我建议结合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();
          }
      }
      

      【讨论】:

      • 这是 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();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-11
        • 1970-01-01
        • 2010-10-08
        相关资源
        最近更新 更多