2012-12-29 3 views
0

DataContractJsonSerializer 개체에서 스트림을 삼킬 수 없습니다. 주석 처리 된 행이 활성화 된 상태에서 코드를 실행하면 제공된 텍스트를 볼 수 있습니다 (파싱 가능한 JSON 객체). 따라서 스트림이 정상적으로 작동하고 있음을 알 수 있습니다.JsonSerializer가 StreamReader에서 스트림을 읽을 수 없습니다.

그러나, 어떤 이유로, 컴파일러는 Stream되지 않습니다 streamReader 내가 ReadObject에있는 그것의 목을 아래로 밀어하려고 해요 뿌려줍니다. 글쎄, 안 그래?!

인수 1 : 'System.IO.Stream'내가 놓치고이며 어떻게 그것을 해결하는 일

에 'System.IO.StreamReader'에서 변환 할 수 없습니다?

using (StreamReader streamReader = new StreamReader(...)) 
{ 
    //String responseText = reader.ReadToEnd(); 
    MyThingy thingy = new MyThingy(); 
    DataContractJsonSerializer serializer 
    = new DataContractJsonSerializer(thingy.GetType()); 
    thingy = serializer.ReadObject(streamReader); 
} 

나는 스트림 작업을 this example 적응하고 있습니다. 다른 각도에서 접근해야합니까? 그렇다면 어떻게?

답변

1

. using을 건너 뛰고 생략 부호 뒤에 숨겨진 부분 (예 : StreamReader의 인스턴스를 만들 때 인수로 입력 한 내용)을 입력하면 ReadObject에 입력 할 수 있습니다.

또한 ReadObjectObject 유형의 인스턴스를 반환하므로 데이터를 읽을 때 문제가 발생하므로 MyThingy으로 변환해야합니다. 이후 nullable (나는 가정), 당신은 캐스트를 입력하지 않아도 오히려 그것으로 ify ify.

MyThingy thingy = new MyThingy(); 
DataContractJsonSerializer serializer 
    = new DataContractJsonSerializer(thingy.GetType()); 
Stream stream = ...; 
thingy = serializer.ReadObject(stream) as MyThingy; 

물론 마지막 줄 다음을 건너 뛰고 스트림을 마지막 줄에 직접 넣을 수도 있습니다. @JohanLarsson의

씨 (모든 스웨덴 사람이 나처럼, 스톡홀름에서 특히, 중대하다) : 당신은 할 수 없습니다 또는 using 문에서 StreamReader 선언을 생략하고 싶지 않은 경우
, 내가 좋을 것 당신은 그것을 얻으려면 BaseStream 속성을 살펴보십시오.

1

이 작업을 시도 할 수 있습니다 : 당신은 스트림 대신 실제 스트림의 독자에 넣어하려는

using (StreamReader streamReader = new StreamReader(...)) 
{ 
    DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(MyThingy)); 
    MyThingy thingy = (MyThingy) serializer.ReadObject(streamReader.BaseStream); 
} 
+0

단지 그것에서 다시 스트림을 얻을 수있는 스트림의 리더의 생성을 필요가 있습니까? 어쩌면 어떤 이유로 조언을 받았습니까? –

+0

@KonradViltersten 아니, 나는 대답을 upvoted 그래서, 내 게시물에 추가 할 것이라고 생각하지 않지만 전에 대답했다. 나는 누군가가 그것이 명백한 잘못이라고 말할 때까지 내 것을 떠날 것이다. –

+0

나는 그것이 틀렸다고 생각하지 않는다. 사실, 나는 BaseStream을 사용하는 것에 대해서 생각조차하지 않았기 때문에 그것이 좋은 것이라고 생각한다. 분명히 여기에 두어야한다. +1 당신에 창의력. 또한, 나는 당신의 힌트를 털어 내고있다. :) –

0

난 항상이 사용하고 :

// get stuff here 
String json = GetJSON(); 

List<T> result; 
using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(json))) 
{ 
     var serializer = new DataContractJsonSerializer(typeof(List<T>)); 
     result = (List<T>)serializer.ReadObject(ms); 
} 
관련 문제