C# 为什么RestSharp反序列化两个日期的方式不同?

C# 为什么RestSharp反序列化两个日期的方式不同?,c#,.net,asp.net-web-api,deserialization,restsharp,C#,.net,Asp.net Web Api,Deserialization,Restsharp,我有一个rest调用返回此消息(使用Chrome中的AdvanceREST客户端进行测试): 获取响应并将其序列化为对象的代码如下所示: IRestResponse<List<MyObject>> response = client.Execute<List<MyObject>>(request); IRestResponse response=client.Execute(请求); 当我查看响应对象时,其中一个日期是错误的。如果我检查它或以任

我有一个rest调用返回此消息(使用Chrome中的AdvanceREST客户端进行测试):

获取响应并将其序列化为对象的代码如下所示:

IRestResponse<List<MyObject>> response = client.Execute<List<MyObject>>(request);
IRestResponse response=client.Execute(请求);
当我查看响应对象时,其中一个日期是错误的。如果我检查它或以任何方式使用对象,我会得到:

UTC1: 4/19/2013 3:12     
UTC2: 4/18/2013 9:12:36 PM <--CONVERTED!!
UTC1:4/19/2013 3:12
UTC2:4/18/2013 9:12:36 PM用于执行反序列化,而不是内置的RestSharp反序列化程序

response = client.Execute(request);    
var myObjects = JsonConvert.Deserialize<List<MyObject>>(response)
response=client.Execute(请求);
var myObjects=JsonConvert.Deserialize(响应)

为方便起见发布此消息:

private class CustomRestClient : RestClient
        {
            public CustomRestClient(string baseUrl) : base(baseUrl) { }

            private IRestResponse<T> Deserialize<T>(IRestRequest request, IRestResponse raw)
            {
                request.OnBeforeDeserialization(raw);
                var restResponse = (IRestResponse<T>)new RestResponse<T>();
                try
                {
                    restResponse = ResponseExtensions.toAsyncResponse<T>(raw);
                    restResponse.Request = request;
                    if (restResponse.ErrorException == null)
                    {

                        restResponse.Data = JsonConvert.DeserializeObject<T>(restResponse.Content);
                    }
                }
                catch (Exception ex)
                {
                    restResponse.ResponseStatus = ResponseStatus.Error;
                    restResponse.ErrorMessage = ex.Message;
                    restResponse.ErrorException = ex;
                }
                return restResponse;
            }



            public override IRestResponse<T> Execute<T>(IRestRequest request)
            {
                return Deserialize<T>(request, Execute(request));
            }
        }
私有类CustomRestClient:RestClient
{
公共CustomRestClient(字符串baseUrl):基(baseUrl){}
私有IRestResponse反序列化(IRestRequest请求,IRestResponse原始)
{
请求。onbefore反序列化(原始);
var restreponse=(IRestResponse)new restreponse();
尝试
{
restResponse=ResponseExtensions.toAsyncResponse(原始);
resresponse.Request=请求;
if(resresponse.ErrorException==null)
{
restResponse.Data=JsonConvert.DeserializeObject(restResponse.Content);
}
}
捕获(例外情况除外)
{
resresponse.ResponseStatus=ResponseStatus.Error;
restResponse.ErrorMessage=ex.Message;
restResponse.ErrorException=ex;
}
返回重响应;
}
公共覆盖IRestResponse执行(IRestRequest请求)
{
返回反序列化(请求、执行(请求));
}
}

这是我编写的一个简单代码,它只覆盖
Execute
,并在后台使用Json.net。

两者都是UTC日期时间的有效ISO8601表示形式(部分中的位数没有限制)。尝试使用逗号作为分隔符-我相信最初的分隔符是点,但根据更新版本的建议,使用逗号…在MyObject中,UTC1和UTC2定义为相同的类型吗?@cgotberg,是的,它们是相同的类型(DateTime)。我在Newtonsoft.Json中尝试了您的示例,但它没有执行奇怪的datetimeoffset切换。您可以使用RestSharp获取原始响应,然后使用var myObject=JsonConvert.Deserialize(jsonString)进行反序列化。@cgotberg,谢谢。如果你想把它作为答案,我会接受的——除了改变当前计算机的时区,我想不出其他方法来解决这个问题
private class CustomRestClient : RestClient
        {
            public CustomRestClient(string baseUrl) : base(baseUrl) { }

            private IRestResponse<T> Deserialize<T>(IRestRequest request, IRestResponse raw)
            {
                request.OnBeforeDeserialization(raw);
                var restResponse = (IRestResponse<T>)new RestResponse<T>();
                try
                {
                    restResponse = ResponseExtensions.toAsyncResponse<T>(raw);
                    restResponse.Request = request;
                    if (restResponse.ErrorException == null)
                    {

                        restResponse.Data = JsonConvert.DeserializeObject<T>(restResponse.Content);
                    }
                }
                catch (Exception ex)
                {
                    restResponse.ResponseStatus = ResponseStatus.Error;
                    restResponse.ErrorMessage = ex.Message;
                    restResponse.ErrorException = ex;
                }
                return restResponse;
            }



            public override IRestResponse<T> Execute<T>(IRestRequest request)
            {
                return Deserialize<T>(request, Execute(request));
            }
        }