使用Web响应流和反序列化到C#对象

时间:2013-10-01 20:43:29

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

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

我从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. 我的最终目标是第二种方法的返回值应该是一个对象。
  3. 附加说明:

    1. 此功能分为2种方法的原因是因为我希望将Web响应方法和deserailization分开用于测试目的。
    2. 我没有XSD,但创建了MarketStatus Class
    3. 任何代码段/建议都会非常感谢

2 个答案:

答案 0 :(得分:3)

我们通常使用泛型方法,类似于以下(简化发布),它使用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));
    }

希望这会有所帮助。

此致

答案 1 :(得分:0)

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

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

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