【问题标题】:Working With Web Response Stream and De-serialization into C# object使用 Web 响应流和反序列化为 C# 对象
【发布时间】:2013-10-08 03:57:11
【问题描述】:

关于传递 System.IO.Stream(来自方法)和反序列化到对象(另一种方法),我有 2 个具体问题。

我从WebRequest 得到的 XML 响应(请注意没有根标签)

<?xml version="1.0" encoding="UTF-8"?>
<response id="-2d953936:14174bb0cf3:-5213">
      <date>2013-10-01 12:01:55.532999</date>
      <status>
             <current>open</current>
             <next>after</next>
             <change_at>16:00:00</change_at>
      </status>
      <message>Market is open</message>
      <unixtime>1380643315</unixtime>
</response>

方法 1 - ResponseMethod - 当前返回字符串

private static string GetResponse(HttpWebRequest request)
{
      var v_Response = request.GetResponse();
      var v_DataStream = v_Response.GetResponseStream();

      var v_Reader = new System.IO.StreamReader(v_DataStream);
      var x_XMLResponse = v_Reader.ReadToEnd();

       //Close all Stream logic
       v_Reader.Close(); v_DataStream.Close(); v_Response.Close();

       return x_XMLResponse;
}

方法 2 - 将 XML 转换为对象

// I would use XDocument and Lin2XML to get my typed object - for example MarketStatus

问题是:

  1. 我目前正在从方法 1 传递字符串。这对我从 XML 到对象的反序列化没有帮助。我是否应该将返回值作为StreamReader 传递,然后将其用作方法2 的输入来获取我的类型化对象。这是标准方法还是有更好的方法?
  2. 我的最终目标是第二种方法的返回值应该是一个对象。

补充说明:

  1. 之所以将此功能分解为 2 种方法,是因为我希望将 Web 响应方法和脱轨分离用于测试目的。
  2. 我没有 XSD,但创建了一个 MarketStatus

任何代码 sn-ps/建议都会非常感激

【问题讨论】:

    标签: c# .net xml web-services serialization


    【解决方案1】:

    我们通常使用一个泛型方法,类似于以下(为发布而简化),它使用 XMLSerializer 将 XML 字符串表示反序列化为相应的对象。

        public T ReturnObjectfromXml<T>(string xmlForm)
        {
            XmlSerializer xs = new XmlSerializer(typeof(T));
            StringReader sr = new StringReader(xmlForm);
            XmlTextReader xts = new XmlTextReader(sr);
            return ((T)xs.Deserialize(xts));
        }
    

    希望这会有所帮助。

    问候,

    【讨论】:

    • 感谢这个通用类。它实际上可以工作,但问题是看到我上面的 xml - 它没有 xmlns,因此我真的无法对它进行反序列化。这让我在这里使用 LINQ2XML 代码,但它不再是通用方法。对此有何建议?请注意我已经接受了你的回答,因为它是正确的,但对我不起作用,因为我没有完整的 XML
    【解决方案2】:

    看起来你正在做某种类型的message passing。最好使用 WCF 或 ASP.NET Web API,而不是滚动自己的基础结构代码(序列化和反序列化)。

    要回答问题 1:不,最好是返回一个字符串并在您完成阅读器后立即处理它。见When should I dispose my objects in .NET?

    注释 1:在大多数情况下,您不希望对序列化/反序列化进行单元测试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-13
      • 2018-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多