2013-12-16 44 views
0

我想将来自响应流的流数据转换为自定义对象。将流数据转换为C#中的自定义对象.net

我想将respose流转换为自定义对象,我按照这些步骤。

我的代码如下。

myMethod()    
{ 
    state s = new state(); 
    Stream receiveStream; 
    StreamReader readStream; 
    HttpWebRequest request; 
    HttpWebResponse response; 
    try 
    { 
     request = (HttpWebRequest)WebRequest.Create (url); 
     request.Method = "GET"; 
     request.ContentType = "application/json"; 
     response = (HttpWebResponse)request.GetResponse(); 
     receiveStream = response.GetResponseStream(); 

     readStream = new StreamReader(receiveStream); 
     Console.WriteLine (readStream.ReadToEnd()); 
     serializer = new DataContractJsonSerializer(typeof(state)); 
     s = serializer.ReadObject(readStream.BaseStream)as state; 
     Console.Write(s.name+"\n"); 

     response.Close(); 
     readStream.Close();  

    } 
    catch (Exception ex) 
    { 
    } 
} 

对象小号返回什么。 任何人都可以帮助我吗?

+1

你是什么意思“无返回”?返回一个空引用或对一切为空的对象的引用? (顺便说一下,我鼓励你使用cast而不是'as'。) –

+0

它返回null引用。我按照你的说法做了修改,但仍然收到空引用。 – Suraj

+1

你收到的数据是什么样的? (我注意到你正在设置一个请求内容类型,但实际上并没有提供任何内容,这很奇怪......) –

回答

5

麻烦的是,你要反序列化对象时,你已经读过所有的只是事先数据:

readStream = new StreamReader(receiveStream); 
Console.WriteLine (readStream.ReadToEnd()); 

那些线后,流将是空的,所以没有什么反序列化。摆脱这些线(然后使用下面的receiveStream),你可能会发现它的工作原理。

此外,一些建议:

  • 比显式关闭流相反,使用using语句
  • 添加using语句响应本身,作为实现IDisposable
  • 保持每个变量的作用域尽可能小,在声明处指定一个值
  • 捕获Exception几乎不是一个好主意,它几乎是从来没有一个好主意,只吞下,你正在做的方式例外,没有日志记录等
  • 关注.NET命名约定,其中stateState(也可能使名称更具描述性的一点无论如何)
  • 使用模型而不是as - 请参阅my blog post on the topic原因
相关问题