문제

Json.net 라이브러리를 사용하여 기본 RestSharp 직렬화를 개선하려고 합니다.직렬화를 사용자 정의하려면 ISerializer 인터페이스를 구현해야 합니다.

public class LowerCaseSerializer : ISerializer{
    public LowerCaseSerializer(){
        ContentType = "application/json";
    }

    public string Serialize(object obj){
         var settings = new JsonSerializerSettings{
            ContractResolver = new LowerCaseResolver()
        };
        return JsonConvert.SerializeObject(obj, Formatting.None, settings);
    }

    string ISerializer.RootElement { get; set; }
    string ISerializer.Namespace { get; set; }
    string ISerializer.DateFormat { get; set; }
    public string ContentType { get; set; }
}

보시다시피 ContractResolver도 확장하고 있습니다.이것은 소문자를 수행하는 실제 코드입니다.

public class LowerCaseResolver : DefaultContractResolver{
    protected override string ResolvePropertyName(string propertyName){
        return propertyName.ToLower();
    }
}

이 모든 설정이 완료되면 RestSharp와 함께 사용할 수 있습니다.

var request = new RestRequest(url, method);
if (ShouldAddBody(method)){
    request.JsonSerializer = new LowerCaseSerializer();
    request.AddObject(body);
}
var response = client.Execute<T>(request);

속성이 소문자로 되어 있지 않다는 점을 제외하면 모든 것이 작동합니다.디버깅할 때 디버거는 직렬 변환기의 생성자로 이동하지만 해당 메서드는 호출되지 않습니다.역직렬화(클라이언트에 연결되는 IDeserialize 인터페이스)에 대해 정확히 동일한 작업을 시도했을 때 각 속성에 대해 소문자 케이스에 대한 메서드가 호출되었습니다.

내가 시도한 것:

request.RequestFormat = DataFormat.Json;  // no change
// this correctly lower cases the properties
var json = new LowerCaseSerializer().Serialize(body);
// wrong request sent to the server, it tells me that some property is missing
request.AddBody(json);
// the exact same thing with this
request.AddParameter("application/json", json, ParameterType.RequestBody);

지난 두 가지에서 제가 주목한 점은 다음과 같습니다.소문자 속성이 있고 RestSharp가 직렬화하도록 하면 요청에 5개의 매개변수(각 속성에 하나씩)가 있습니다.상위 두 가지 방법을 통해 추가하면 속성이 하나만 있고 이는 전체 json입니다.

RestSharp 문제를 아무 소용이 없는지 확인합니다.어떤 제안이 있으십니까?

업데이트:

이것은 매우 이상합니다.

  • RestSharp를 분기하고 Json.net을 설치하면 정상적으로 작동합니다.
  • RestSharp 포크에서 RestRequest 클래스를 복사하여 내 애플리케이션에 붙여넣고 사용했는데 잘 작동합니다.
  • 새 프로젝트 시작, 패키지 관리자를 통해 RestSharp 및 Json.net 설치, 정상적으로 작동

그런 다음 기본 응용 프로그램에서 모든 패키지를 제거하고 다시 다운로드했지만 작동하지 않습니다.이건 포기하는 편이에요.

업데이트 2:포크된 버전을 통해 디버깅하면서 다음과 같은 사실을 발견했습니다.RequestFormat은 Dataformat.Json이어야 하며 그렇지 않으면 Xml 직렬 변환기를 사용합니다.그러나 그것은 문제를 해결하지 못합니다.두 가지 직렬 변환기를 모두 null로 설정해 보았습니다.

request.JsonSerializer = null;
request.XmlSerializer = null;

새 프로젝트에서 예상대로 NullReferrenceException이 발생했습니다.그러나 오래된 것에서는 아무 일도 일어나지 않습니다.변수 이름을 바꾸고 동일한 유형의 다른 변수를 만들어 보았지만 아무것도 수정되지 않았습니다.프로젝트에 있는 RestRequest 클래스에 버그가 있는 것 같습니다.

또한 솔루션에 새 프로젝트를 추가했습니다.그리고 거기에서도 코드는 작동합니다.따라서 문제가 있는 것은 단지 하나의 프로젝트일 뿐입니다.

도움이 되었습니까?

해결책

새 프로젝트에서 재현할 수 없기 때문에 이 특정 프로젝트에서 뭔가 다른 일이 벌어지고 있는 것이 틀림없으며, 이로 인해 문제가 발생한다고 설명하고 있습니다.

시도해 볼 수 있는 몇 가지 작업(특정 순서 없음):

  • 두 프로젝트(작동하는 프로젝트와 작동하지 않는 프로젝트)에서 정확히 동일한 버전의 라이브러리를 사용하고 있는지 확인하세요.패키지 버전 및 대상 플랫폼(net4, net35...).

  • 삭제 packages NuGet이 모든 패키지를 강제로 다시 다운로드하도록 작동하지 않는 프로젝트의 폴더입니다.

  • 참조 노드에서 RestSharp를 선택한 경우 Visual Studio 속성 창에서 참조 라이브러리에 대한 정확한 경로를 조회합니다.작업 중인 프로젝트와 작동하지 않는 프로젝트에서 참조하는 라이브러리 간에 바이너리 비교를 수행합니다.

  • 불행히도 RestSharp에 대한 기호 패키지는 없습니다. 심볼소스, 따라서 작동하지 않는 프로젝트에서 RestSharp를 직접 디버깅할 수 없습니다.당신은 사용할 수 있습니다 Reflector.NET VSPro 라이센스가 있거나 이전에 평가판을 사용한 적이 없는 경우.

  • 작동하지 않는 프로젝트의 일부를 작동이 멈출 때까지 작동 중인 프로젝트로 이동하세요.

편집하다:

을 보면서 소스 코드 ~의 RestRequest, AddObject 사용하지 않는 것 같습니다. JsonSerializer 당신은 설정하고 있습니다.사용해 보셨나요? AddBody 대신에?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top