DataContractJsonSerializer와 JavaScriptSerializer의 차이점은 무엇입니까?


88

.NET Framework는 System.Runtime.Serialization.Json.DataContractJsonSerializerSystem.Web.Script.Serialization.JavaScriptSerializer 와 함께 제공되며 둘 다 JSON을 de / serialize합니다. 이러한 유형 중 하나를 다른 유형보다 선택해야하는시기를 어떻게 알 수 있습니까? MSDN은 상대적인 이점이 무엇인지 명확하지 않습니다.

JSON을 사용하거나 내보내는 여러 프로젝트가 있으며 지금까지 선택한 클래스는 각 프로젝트에 대한 기본 개발자의 의견에 따라 달라졌습니다. 일부는 간단하고, 둘은 JSON에서 관리되는 유형을 생성하는 것과 관련된 복잡한 논리를 가지고 있지만 (유형은 스트림에 가깝게 매핑되지 않음) 속도에 중점을 두지 않고 하나는 속도가 필요합니다. 적어도 지금은 WCF와 상호 작용하지 않습니다.

대체 도서관에 관심이 있지만 누군가 내 질문에 대한 답변을 얻길 바랍니다.


8
Json.Net json.codeplex.com을 사용하십시오 . 직렬화 / 역 직렬화 프로세스를 훨씬 더 많이 제어 할 수 있습니다.
LB

사용 방법에 따라 다릅니다. DataContractJsonSerializer는 WCF와 잘 작동하는 경향이 있습니다. JavaScriptSerializer는 훨씬 간단합니다. 무엇을하려고합니까?
jrummell

ServiceStack.JsonSerializer 사용-가장 빠릅니다. 그러나 [ScriptIgnore] 속성을 존중하지 않습니다. 필요하지 않으면 문제가되지 않습니다. 여기에 대한 긴 설명을 참조하십시오 : stackoverflow.com/questions/9150920/...
오퍼 Zelig

18
왜 모든 사람들이 댓글에 답을 올리나요? 답변에 투표하거나 댓글을 달기가 어렵습니다.
Justin R.

3
@JustinR. 아마도 여기에있는 일부 경찰이 한 줄의 대답에 반대표를 던지고 "이것은 주석이어야합니다"라고 말했기 때문일 것입니다.
nawfal

답변:


68

DataContractJsonSerializer는 직렬화 된 형식이 일반적으로 DataContract 특성이 적용된 POCO 클래스 인 WCF 클라이언트 응용 프로그램과 함께 사용하기위한 것입니다. DataContract 없음, 직렬화 없음. WCF의 매핑 메커니즘은 플랫폼이 동종인 경우에만 송수신을 매우 간단하게 만듭니다. 다른 도구 세트에서 믹싱을 시작하면 프로그램이 옆으로 갈 수 있습니다.

JavaScriptSerializer는 익명 유형 (단방향)을 포함하여 모든 유형을 직렬화 할 수 있으며보다 순응적인 방식으로 수행합니다. WCF의 "자동 기능"을 잃어 버리지 만 더 많은 통합 옵션을 얻게됩니다.

의견에서 알 수 있듯이 AJAX 직렬화에 대한 많은 옵션이 있으며 속도 대 유지 관리 문제를 해결하기 위해 모든 팀의 요구 사항을 충족하는 솔루션을 찾기 위해 조사 할 가치가 있습니다. 모두가 자신의 방식으로 작업을 수행하므로 장기적으로 유지 관리 문제를 줄일 수 있습니다.

2014-04-07 업데이트 : 가능하면 JSON.NET을 사용하는 것이 좋습니다. 이 질문에서 고려한 3 개의 라이브러리에 대한 검토는 http://james.newtonking.com/json 기능 비교를 참조하십시오 .

2015-05-26 업데이트 : 회사에서 상업적으로 라이선스 가능한 제품을 사용해야하거나 모든 성능이 필요한 경우 https://servicestack.net/ 을 확인할 수도 있습니다 .


2
둘 사이 의 직렬화 성능 차이 는 무엇입니까 ? 동일한 수의 속성을 가진 동일한 수의 엔티티를 직렬화한다고 가정 해 보겠습니다.
Adrian Salazar 2013 년

20

둘 다 거의 동일하지만 매우 다른 인프라를 사용하므로 직렬화 / 역 직렬화하려는 클래스에 다른 제한을 적용하고 직렬화 / 역 직렬화 프로세스를 조정하는 데 다른 수준의 유연성을 제공합니다.

들어 DataContractJsonSerializer당신은 당신이 사용하는 직렬화하고자하는 모든 클래스를 표시해야합니다 DataContract사용 atrtibute을 모든 회원을 DataMember속성. 일부 클래스에 열거 형 멤버가있는 경우뿐만 아니라 열거 형도로 표시되어야하며 DataContract각 열거 형 멤버는 EnumMember특성 으로 표시되어야 합니다. 또한 DataContractJsonSerializer유형 확인 논리를 변경하고 직렬화하는 유형을 서로 게이트로 대체하여 직렬화 / 역 직렬화의 전체 프로세스를 세부적으로 제어 할 수 있습니다.

들어 JavaScriptSerializer당신이 JSON 문자열에서 개체를 직렬화 복원 계획이라면 당신은 매개 변수가없는 생성자를 제공해야합니다.

저에게는 일반적으로 JavaScriptSerializer추가 아약스 요청없이 Json에서 페이지와 함께 렌더링하려는 간단한 모델이있는 프레젠테이션 로직에서 사용 합니다. 그리고 일반적으로 C #으로 역 직렬화 할 필요가 없으므로 오버 헤드가 전혀 없습니다. 그러나 객체를 데이터 저장소 (일반적으로 SQL이없는 저장소)에 저장하고 나중에로드하려는 지속성 논리 인 경우 DataContractJsonSerializer속성을 넣는 오버 헤드가 직렬화 / 역 직렬화 프로세스 튜닝에서 유연성의 가치가 있기 때문에 사용하는 것을 선호 합니다. 특히 업데이트 된 정의를 사용하여 직렬화 된 데이터를 최신 버전의 개체에로드 할 때


2

개인적으로 나는 그것이 DataContractJsonSerializer과도한 엔지니어링의 냄새 라고 생각합니다 . 나는 그것을 건너 뛰고 JavaScriptSerializer. 경우에는 JavaScriptSerializer사용할 수 없습니다, 당신은 사용할 수 있습니다 FridayThe13th (; P 내가 쓴 라이브러리).


Json.Net은 어디에나 있습니다. .Net 2.0, 3.5, 4.0, Silverlight, WindowsPhone
LB
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.