2014-05-14 2 views
1

이것은 이론적 인 질문이지만 파일을 읽는 두 가지 방법의 차이점과 왜 다른 파일 형식을 선택하려고하는지 궁금합니다.ReadAllTextFile 대 JSON 구문 분석 용 StreamReader

로컬 디스크의 JSON 구성 파일을 구문 분석하고 있습니다.

// Reads the entire file and deserializes. 
var json = File.ReadAllText(file); 
return JsonConvert.DeserializeObject<JsonVmrConfigurationProvider>(json); 

한 어떤 다른 것보다 더 나은가요 ..., 두 번째 옵션

// Uses JSON.NET Serializer + StreamReader 
using(var s = new StreamReader(file)) 
{ 
    var jtr = new JsonTextReader(sr); 
    var jsonSerializer = new JsonSerializer(); 
    return jsonSerializer.Deserialize<Configuration>(jtr); 
} 

... 그리고 다음은 그 일을하는 하나의 방법은? 둘 중 하나를 사용해야하는 경우가 있습니까?

다시 말하지만이 이론은 더 이론적이지만 실제로 온라인에 대한 답변을 모르는 것으로 나타났습니다. 온라인 검색은 나를 만족시키는 결과를 산출하지 못했습니다. 한 번에 메모리로 읽혀지기 때문에 파일이 크다면 두 번째 파일이 좋지 않다는 것을 알 수있었습니다. 다른 이유가 있습니까?

+0

첫 번째 *가 * 앞에있는 모든 텍스트를로드하는 대신에 디시리얼라이저로 텍스트를 스트리밍 할 수 있음을 알 수 있습니다. 이는 JSON이 매우 큰 경우에 바람직한 메모리 특성을 갖습니다. 그것은 모두 Json.net의 구현에 달려 있습니다. – spender

+1

은 JsonTextReader 삭제를 잊어 버리지 않도록 할 수 있습니다. :) – tschmit007

+0

@ tschmit007 : 아마도 일회용 리소스 (열린 파일)가 하나만있는 것처럼 보이기 때문에 두 번째 처분은 아마도 중복 될 것입니다. 유사한 BCL 구조의 경우, 이중 사용은 정확히이 이유 때문에 CA2202 경고를 발합니다. http://msdn.microsoft.com/en-us/library/ms182334.aspx 다소 혼란 스럽지만 ... CA2202가 튀는 것을보고 놀랐습니다. 이 질문을보십시오 : http://msdn.microsoft.com/en-us/library/ms182334.aspx – spender

답변

0

코드를 읽어 마침내 도달 문자열에서 그 deserializaton을 발견

JsonTextReader의 창조
public static object DeserializeObject(string value, Type type, JsonSerializerSettings settings) 
    { 
     ValidationUtils.ArgumentNotNull(value, "value"); 

     JsonSerializer jsonSerializer = JsonSerializer.CreateDefault(settings); 

     // by default DeserializeObject should check for additional content 
     if (!jsonSerializer.IsCheckAdditionalContentSet()) 
      jsonSerializer.CheckAdditionalContent = true; 

     using (var reader = new JsonTextReader(new StringReader(value))) 
     { 
      return jsonSerializer.Deserialize(reader, type); 
     } 
    } 

.

그래서 차이점은 효과적으로 거대한 파일을 처리하는 것 같습니다.

은 - 이전 코멘트 성질 :뿐만 아니라,

JsonTextReader는 JsonReader.Close()을 무시하고 (CloseInput에 해당하는 경우) 스트림을 처리합니다. StringReader를 명시 적으로 코드 File.ReadAllText()

0

이전 프래그먼트에 배치되지 않는

CloseInput 기본적으로 참이어야 전체 JSON이를 역 직렬화하기 전에 제 1 메모리에로드 될 필요가있다. StreamReader을 사용하여 파일을 점차적으로 읽고 역 직렬화합니다. 따라서 파일이 크다면 전체 파일을 메모리에로드하지 않으려면 StreamReader을 사용하는 것이 좋습니다. JSON 파일이 작 으면 (대부분의 경우) 실제로 차이가 없습니다.