我遇到了WCF REST服务的问题。我尝试返回的wire对象没有设置某些属性,导致DateTime类型的属性为DateTime.MinValue。该服务返回一个空文档( HTTP状态为200?)。当我自己尝试调用JSON序列化时,抛出的异常是:
SerializationException:转换为DateTime时大于DateTime.MaxValue或小于DateTime.MinValue的JSON值无法序列化为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。
发布于 2010-10-27 01:27:44
主要的问题是DateTime.MinValue
有DateTimeKind.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();
当然,这看起来很奇怪,但它很有帮助。
发布于 2012-09-06 17:43:22
尝试在任何DateTime成员上添加此内容
[DataMember(IsRequired = false, EmitDefaultValue = false)]
大多数这些错误的发生是因为datetime
的默认值是DateTime.MinValue
,它来自年份1,而JSON序列化是来自1970年。
发布于 2010-10-27 00:46:37
如果您的时区为GMT+1,则您所在时区的DateTime.MinValue
的UTC值将比DateTime.MinValue
小一个小时。
https://stackoverflow.com/questions/4025851
复制相似问题