사용자 지정 직렬 변환기 문제로 RestSharp 직렬화 확장
-
23-12-2019 - |
문제
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
대신에?