我有一个这样的POCO:
public class BlogEntry
{
public string Title { get; set; }
public DateTime Date { get; set; }
}
大多数时候,它是从实体框架中得到补充的,但它可以并将在实体框架之外使用。
来自EF的日期的DateTimeKind未指定,从我读取的内容来看,这是正常的。
当我在Redis中缓存这个POCO时(使用ServiceStack Redis客户端),它返回一个DateTimeKind为Local。
所以返回的对象会有抖动。第一次传递(未缓存)的ISO-8601没有偏移量(DateTimeKind.Unspecified)。第二遍(缓存)是带有偏移量的ISO-8601 (从带有DateTimeKind.Local的Redis )。
有没有办法强制ServiceStack JSON序列化程序始终将日期解释为给定的DateTimeKind?(我知道有一个"JsConfig.AppendUtcOffset“属性,但是不管它是真是假,这些值对我来说永远不会改变?)
或者在我的类型化RedisClient的反序列化过程中的某个地方,使DateTimeKind成为本地的?
我可以手动更改我的POCO来强制执行DateTimeKind -这很有效-但我希望有一些不太容易出错的东西。
发布于 2013-10-31 21:53:03
如果你需要比@mythz的答案更具可配置性的东西,你可以强制DateTimes的序列化或反序列化具有特定的DateTimeKind
,方法是覆盖DateTime和可选的DateTime?序列化和/或反序列化方法。
强制将所有序列化的DateTimes解释为UTC
JsConfig<DateTime>.SerializeFn = time => new DateTime(time.Ticks, DateTimeKind.Local).ToString();
然后,您可以更进一步,如果DateTime未采用指定的格式,则会在反序列化时出错。当我想强制客户端在所有请求中指定时区,但不一定要求它始终为Utc时,我就开始使用它。
JsConfig<DateTime>.DeSerializeFn = time =>
{
if (!IsInCorrectDateFormat(time))
throw new System.Runtime.Serialization.SerializationException(BadDateTime);
return ServiceStack.Text.Common.DateTimeSerializer.ParseDateTime(time);
};
发布于 2013-10-31 09:32:07
DateTimeKind
偏移量不会与日期一起存储,因此在默认情况下,ServiceStack序列化程序假定日期是本地的,该日期被序列化为协调时,并反序列化为本地。
您可以使用以下命令将DateTimeKind.Unspecified
假定为UTC:
JsConfig.AssumeUtc = true;
发布于 2015-06-05 00:20:11
对bpruitt-goddard解决方案的调整。一切功劳都归功于他。
JsConfig<DateTime>.SerializeFn = time => new DateTime(time.Ticks, DateTimeKind.Local).ToString("o");
JsConfig<DateTime?>.SerializeFn =
time => time != null ? new DateTime(time.Value.Ticks, DateTimeKind.Local).ToString("o") : null;
JsConfig.DateHandler = DateHandler.ISO8601;
因此,从服务堆栈传出的任何日期都将被强制转换为ISO8601日期格式,而传入的任何日期将自动从ISO8601字符串转换为C#日期。
https://stackoverflow.com/questions/19694475
复制相似问题