c# - 为什么 DateTime.MinValue 不能在 UTC 之前的时区中序列化?

我在使用 WCF REST 服务时遇到问题。我尝试返回的线对象具有未设置的某些属性,导致 DateTime 类型的属性的 DateTime.MinValue。该服务返回一个空文档(HTTP 状态为 200 ???)。当我尝试自己调用 JSON 序列化时,抛出的异常是:

SerializationException: DateTime values that are greater than DateTime.MaxValue or smaller than DateTime.MinValue when converted to UTC cannot be serialized to JSON.

这可以通过在控制台应用程序中运行以下代码来重现:

DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(DateTime));
MemoryStream m = new MemoryStream();
DateTime dt = DateTime.MinValue;

// throws SerializationException in my timezone
ser.WriteObject(m, dt);
string json = Encoding.ASCII.GetString(m.GetBuffer());
Console.WriteLine(json);

为什么会出现这种行为?我认为这与我的时区(GMT+1)有关。由于 DateTime.MinValue 是默认值(DateTime),我希望这可以毫无问题地序列化。

关于如何使我的 REST 服务正常运行的任何提示?我不想更改我的 DataContract。

最佳答案

主要问题是 DateTime.MinValueDateTimeKind.Unspecified 种类。定义为:

MinValue = new DateTime(0L, DateTimeKind.Unspecified);

但这不是一个真正的问题,这个定义导致序列化过程中出现问题。 JSON DateTime 序列化通过:

System.Runtime.Serialization.Json.JsonWriterDelegator.WriteDateTime(DateTime value)

不幸的是它被定义为:

...

if (value.Kind != DateTimeKind.Utc)
{
    long num = value.Ticks - TimeZone.CurrentTimeZone.GetUtcOffset(value).Ticks;
    if ((num > DateTime.MaxValue.Ticks) || (num < DateTime.MinValue.Ticks))
    {
        throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(XmlObjectSerializer.CreateSerializationException(SR.GetString("JsonDateTimeOutOfRange"), new ArgumentOutOfRangeException("value")));
    }
}

...

所以它不考虑Unspecified,将其视为Local。为避免这种情况,您可以定义自己的常量:

MinValueUtc = new DateTime(0L, DateTimeKind.Utc);

MinValueUtc = DateTime.MinValue.ToUniversalTime();

这当然看起来很奇怪,但它有帮助。

https://stackoverflow.com/questions/4025851/

相关文章:

json - 将 JSON 序列化为查询字符串的标准化方法?

c# - asp.net asmx Web 服务返回 xml 而不是 json

database - Fabric.js - 如何使用自定义属性在服务器上保存 Canvas

javascript - 'JSON' 是 Internet Explorer 中 JavaScri

javascript - JSON 中空与空的约定是什么?

c# - 复杂类型在 ApiController 参数中为空

java - 在不知道 JSON 格式的情况下用 Java 解析 JSON

json - 从 HttpServletRequest 检索 JSON 对象文字

jquery - 如何使用 JQuery 将数据放入 Rails

java - Gson 是否必须使用默认的无参数构造函数?