2010-05-10 2 views
9

JSON에 직렬화하고 다시하고 싶은 간단한 .NET 객체가 있습니다. 직렬화 할 객체 세트는 매우 작으며 구현을 제어하므로 모든 작업에 사용할 수있는 일반적인 솔루션이 필요하지 않습니다. 내 어셈블리가 라이브러리로 배포되기 때문에 일부 타사 DLL에 대한 의존성을 피하고 싶습니다. 사용자에게 참조 할 수있는 어셈블리를 하나만 제공하려고합니다..NET에서 실제로 매우 간단한 JSON 직렬화

.NET에서 JSON으로 변환하는 것과 JSON에서 변환 할 때 찾을 수있는 다른 질문을 읽었습니다. 물론 JSON.NET의 권장 솔루션은 작동하지만 별도의 DLL을 배포해야합니다.

JSON.NET의 멋진 기능은 필요하지 않습니다. 문자열, 정수, DateTimes 및 문자열과 바이트의 배열을 포함하는 간단한 객체 (또는 사전) 만 처리하면됩니다. deserialize 할 때 나는 사전을 돌려 주어서 기쁩니다. 객체를 다시 만들 필요가 없습니다.

이 간단한 작업을 수행하기 위해 내 어셈블리에 컴파일 할 수있는 코드가 실제로 있습니까?

나는 또한 System.Web.Script.Serialization.JavaScriptSerializer을 시도했지만 바이트 배열은 어디까지 떨어지는가? base64 인코딩을 사용하고 심지어 변환기를 등록한다고해서 API가 작동하는 방식으로 쉽게 달성 할 수는 없다. 들판의 이름으로 전달되지 않는다).

+1

는 [ILMerge]를 사용하여 고려 유무 (http://research.microsoft.com/en-us/people/mbarnett/ilmerge.aspx) JSON.NET을 어셈블리에 임베드 할 수 있습니까? –

+0

아니,하지만 나에게 지적 해 주셔서 감사합니다. 나는 이것이 과도 할 수 있다고 생각하지만, 매우 흥미로운 도구처럼 보입니다. 그리고 제가 작업하고있는 다른 것에 그것을 사용하는 것을 고려할 것입니다. +1 – EMP

+1

JSON 데이터에 문자열이 포함되어 있다면 JSON.NET과 같은 패키지를 사용하여 문자열을 처리하는 것이 좋습니다. 예를 들어, 문자열에서 공백을 어떻게 처리합니까? 또는 문자열의 단일/이중 따옴표? 뉴 라인? –

답변

4

Json.NET은 MIT 라이센스가 있습니다. 소스를 다운로드하고 응용 프로그램에 필요한 파일 만 포함시킬 수 있습니다.

+0

'System.Web.Script.Serialization.JavaScriptSerializer'에서이 문제를 해결했지만 결국 받아 들일 수있었습니다. 왜냐하면 아마 내가 다르게 할 것이기 때문입니다. – EMP

+0

@Evgeny - 바이트 배열을 인코딩하는이 문제를 어떻게 해결했는지 조금 자세히 설명해 주시겠습니까? 나는 동일한 문제가 있으며 가능한 경우 JSON.net과 같은 제 3 자 라이브러리를 사용하지 않는 것을 선호합니다. – InSane

+0

@InSane 불행히도이 단계에서는 기억이 나지 않으며 더 이상 해당 코드에 액세스 할 수 없습니다. 객체를 직접 base-64로 인코딩했거나 서브 필드가있는 변환기를 사용하여 끝났습니다. 방금 게시 한 답변을 참조하십시오. – EMP

4

같이,베이스 (64)는 서브 필드에 바이트 배열을 코딩하는 변환기를 등록 .NET 프레임 워크 JavaScriptSerializer이다하여 허용 가능한 해결 :

class ByteArrayBase64Converter : JavaScriptConverter 
{ 
    public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer) 
    { 
     return Convert.FromBase64String((string)dictionary["b64"]); 
    } 

    public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer) 
    { 
     return new Dictionary<string, object> { { "b64", Convert.ToBase64String((byte[])obj) } }; 
    } 

    public override IEnumerable<Type> SupportedTypes 
    { 
     get { return new[] { typeof(byte[])}; } 
    } 
} 


var serializer = new JavaScriptSerializer(); 
serializer.RegisterConverters(new JavaScriptConverter[] { new ByteArrayBase64Converter() });