2014-04-22 1 views
0

ServiceStack.Redis가 ServiceStack.Text 대신 JSON.NET을 사용하도록 만드는 방법이 있습니까?ServiceStack.Redis가 ServiceStack.Text 대신 JSON.NET을 사용하도록 만드는 방법이 있습니까?

내가 물어 오전 이유는 정수 ServiceStack.Text의 문자열로 변환하지만 JSON.NET

에이 웹에 와이어를 통해 데이터를 전송 큰 거래는 특정 경우이다.
'오프셋'우리의 특정 경우

, JSON.NET 데이터를 저장 :
'오프셋'와 같은 0
및 ServiceStack.Text 저장 데이터를 '0'

왜이 매우 나쁘다? 자바 스크립트에서는 29 + 0 = 29이지만 29 + '0'= '290'입니다. 이것은 배열 [29 + offset]이 ServiceStack.Text를 사용하여 이상한 결과를 산출 할 수 있다는 것을 의미합니다.

이것이 특별한 사용 사례라는 것을 알았지 만, 예상대로 작동하는 JSON.NET을 사용하는 것이 훨씬 쉬울 것입니다. ServiceStack.Text (3 배 빨라지지만 예상대로 작동하지 않음) 당신은 단지 ServiceStack의 JsonSerializer 사이를 전환 할 수 있습니다 순간

+0

이것은 매우 흥미 롭습니다. C# 개체에서 redis로 직렬화하고 있습니까? 이것은 Redis에 직렬화하는 동안 네이티브 타입을 오해 한 것 같습니다. –

+0

ServiceStack.Text를 사용하여 실제 변환을 수행하는 객체를 직렬화하기 위해 ServiceStack.Redis를 사용합니다. ServiceStack.Text는 원하는대로 작동하지 않으므로 검증 된 JSON.NET을 사용하도록 ServiceStack에 알릴 수 있는지 궁금합니다. 이유는 여기에 가장 많이 사용되는 nuget 패키지입니다. – diadem

+0

이 버그가 있더라도 servicestack 소스 코드에서 수정 된 사실은 처음에 존재한다는 사실로 json.net을 통해 servicestack.text를 신뢰하지 않을만큼의 충분한 시간을줍니다. – diadem

답변

1

내장 당신이 AppHost.Configure 섹션이 추가 할 수있는 JsonDataContractSerializer :

SetConfig(new EndpointHostConfig { 
    UseBclJsonSerializers = true 
}); 

가에 대한 참조를 위해 this 스레드를 참조하십시오 위의 정보.

다른 serializer에 대해 구성 가능한 기본 제공 옵션을 단순히 지원하지 않는 것으로 보입니다.

2

이 ServiceStack.Text 텍스트, 실제 행동으로 번호를 저장하지 않습니다

public class HasOffset 
{ 
    public int Offset { get; set; } 
} 

var dto = new HasOffset { Offset = 1 }; 
string json = dto.ToJson(); 
json.Print(); //prints {"Offset":1} 

var fromJson = json.FromJson<HasOffset>(); 
Assert.That(fromJson.Offset, Is.EqualTo(1)); 

당신이 JsonObject 그것이 문자열로 강제 가져옵니다 Dictionary<string,string> 사전에 구문 분석됩니다를 사용하여 직렬화하려는 경우. 마찬가지로 object에 저장하려고하면 직렬화 기가 어떤 유형으로 변환해야하는지 모르기 때문에 문자열로 남겨 둡니다.

+0

mythz 자신의 답변을 기대하지 않았습니다! 내가 가지고있는 특정 유스 케이스는 문자열로 키가 된 객체 사전이다. 해당 사전에있는 항목 중 하나가 int 인 경우 문자열로 저장됩니다. 답장하는 시간을 보낸 사람은 당신이므로, 나는 그것을 존중하고 이것이 일어나는 곳의 코드 샘플을 작성합니다 (하루 또는 이틀이 걸릴 수도 있음). 이 문제를 일으킨 것은이 사용 사례였습니다. – diadem

관련 문제