ServiceStack.Text JsonSerializer - SerializeToString失败惠特DateTime.Max

问题描述:

我在使用c#的Web应用程序上使用ServiceStack.Text JsonSerializer。问题在于,对于特定的功能,我需要将日期值序列化为json,但当值为DateTime.MaxValue时,目前失败。ServiceStack.Text JsonSerializer - SerializeToString失败惠特DateTime.Max

下面是一些代码示例复制此(它的一个简单的控制台应用程序):

class Program 
{ 
    static void Main(string[] args) 
    { 
     var jsonResultMin = JsonSerializer.SerializeToString<DateTime>(DateTime.MinValue); 
     var deJsonMin = JsonSerializer.DeserializeFromString<DateTime>(jsonResultMin); 
     Console.WriteLine("jsonResultMin" + jsonResultMin); 
     Console.WriteLine("deJsonMin" + deJsonMin); 

     var jsonResultMax = JsonSerializer.SerializeToString<DateTime>(DateTime.MaxValue); 
     var deJsonMax = JsonSerializer.DeserializeFromString<DateTime>(jsonResultMax); 
     Console.WriteLine("jsonResultMax" + jsonResultMax); 
     Console.WriteLine("deJsonMax" + deJsonMax); 

     Console.ReadLine(); 

    } 
} 

堆栈跟踪为:

System.ArgumentOutOfRangeException was unhandled 
    HResult=-2146233086 
    Message=The added or subtracted value results in an un-representable DateTime. 
Parameter name: value 
    Source=mscorlib 
    ParamName=value 
    StackTrace: 
     at System.DateTime.Subtract(TimeSpan value) 
     at ServiceStack.Text.DateTimeExtensions.ToDateTimeSinceUnixEpoch(DateTime dateTime) 
     at ServiceStack.Text.DateTimeExtensions.ToUnixTimeMs(DateTime  dateTime) 
     at ServiceStack.Text.Common.DateTimeSerializer.WriteWcfJsonDate(TextWriter writer,  DateTime dateTime) 
     at ServiceStack.Text.Json.JsonTypeSerializer.WriteDateTime(TextWriter writer, Object oDateTime) 
     at ServiceStack.Text.Json.JsonWriter`1.WriteRootObject(TextWriter writer, Object value) 
     at ServiceStack.Text.JsonSerializer.SerializeToString[T](T value) 
     at ConsoleApplication1.Program.Main(String[] args) 
     at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 
     at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 
     at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
     at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
     at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
     at System.Threading.ThreadHelper.ThreadStart() 

我明白,错误是因为与日期的发生这是ServiceStack库在内部执行的时间转换。

此外,我发现如果您从最大值中减去一天(addDays(-1)),库不会失败。

但有没有一种解决方法,使这项工作无需修改日期?

从UNIX时间转换导致的错误,你可以跳过它,如果你设置了DateHandler,如:

JsConfig.DateHandler = DateHandler.ISO8601DateTime 

如果你想检查所有可能的转换检查source code

您可以跳过与UTC日期时间转换:

JsConfig.SkipDateTimeConversion = true; 
+0

感谢您的快速答案,但它没有奏效......在添加该行后,它保持与相同的异常失败 –