【问题标题】:Serializing xml to object while keeping the original xml?在保留原始 xml 的同时将 xml 序列化为对象?
【发布时间】:2012-06-23 15:51:58
【问题描述】:

我正在使用外部 API 来接收 xml 并将其序列化为一个对象,但我想要一种能够保留用于序列化的原始 xml 以进行调试和审计的方法。

这是我如何序列化的示例:

XmlReader reader = this.Execute(url);
return Read<Property>(reader, "property");

Execute() 例程的摘录:

StringBuilder sb = new StringBuilder();
Stream s = response.GetResponseStream();
XmlReader reader = XmlReader.Create(s);
return reader;

Read() 简单地包装了原生 xml 序列化:

private T Read<T>(XmlReader reader, string rootElement)
{
  XmlRootAttribute root = new XmlRootAttribute();
  root.ElementName = rootElement;
  root.IsNullable = true;
  XmlSerializer xmlSerializer = new XmlSerializer(typeof(T), root);
  object result = xmlSerializer.Deserialize(reader);
  return (T)result;
}

我查看了一下,一旦你使用了阅读器,你就不能再使用它了(只转发阅读流?)。在不尝试进行太多更改的情况下,如何将阅读器的内容提取为 xml,同时仍然受益于阅读器的内置序列化?

最好用 out 参数调整 Read:

private T Read<T>(XmlReader reader, string rootElement, out string sourceXml);

【问题讨论】:

    标签: c# xml xml-serialization xmlreader


    【解决方案1】:

    您没有共享 this.Execute(url) 的代码,但大概是您从流中构建了一个阅读器。首先将该流写入字符串,然后在某处使用它。如果流不可搜索,则将其释放并从中创建一个新流。

    另外,请注意,XmlSerializer 可以采用流而不是读取器,因此您永远不会打扰读取器,只需在您的方法之间传递流。

    【讨论】:

    • 好的,感谢有关流的提示 - 我将删除构建阅读器的额外逻辑,直接使用流。当您说将其写入字符串时,这是否意味着我可以重复使用它?
    • 好吧,我假设 XML 的字符串形式非常小,因为您正在执行此操作,并且将其保存在内存中不会有什么大不了的。鉴于此假设,首先将其全部读入一个字符串(大概是您希望它所在的字符串。然后将该字符串读入一个新的 MemoryStream。有关字符串流转换,请参阅此链接:csharp411.com/c-convert-string-to-stream-and-stream-to-string
    • 感谢您的帮助,我已尝试克隆流,但它似乎不起作用 - 我会将 xml 提取为字符串并使用它而不是读取器(无论如何在调试时) .
    【解决方案2】:

    使用fiddler

    Fiddler 是一个 Web 调试代理,它记录您的计算机和 Internet 之间的所有 HTTP(S) 流量。 Fiddler 允许您检查流量、设置断点以及“摆弄”传入或传出数据。 Fiddler 包含一个强大的基于事件的脚本子系统,并且可以使用任何 .NET 语言进行扩展。

    【讨论】:

      猜你喜欢
      • 2015-05-23
      • 1970-01-01
      • 1970-01-01
      • 2011-05-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多