更改WCF中的默认日期序列化

无论如何,要改变WCF中默认的JSON序列化/反序列化DateTime?

目前,DateTime被序列化为/Date(1372252162657+0200)/格式,这应该已经很好了,但是当我的服务器不是UTC(我无法更改)时,我遇到了问题。

此服务正在处理的所有日期/时间数据均采用UTC格式。 当服务器使用UTC时,一切正常。 但是,分段/ prod环境设置为GMT + 1(Paris),并且序列化程序假定日期/时间在GMT + 1,完全忽略Kind属性。 所以如你所期望的那样,调用DateTime.SetKind()并将其设置为UTC将不起作用。 实际上,序列化时间延迟了一个小时。

我可以进行双向日期对话(它也对反向序列化进行了相同的假设,因此它始终是GMT + 1)日期对话:UTC到/从服务器时间开始,但这是乏味的。 所以我想也许我可以重写默认的序列化行为。


是的,这可以使用称为“ 消息格式化器 ”的概念完成

但是消息格式化器将会很难并且在范围之外来解释堆栈溢出。 您可以参考WCF可扩展性:消息格式化器

如果你不想搞砸这个,那么黑​​客可用。

将每种方法的返回类型设置为Stream。

例如

        public Stream GetStaticData()
        {
            var objTobeReturned = something;
            WebOperationContext.Current.OutgoingResponse.ContentType = "application/json; charset=utf-8";
            return new MemoryStream(Encoding.UTF8.GetBytes(objTobeReturned.ToJson()));
        }

这里ToJson()是我自己的扩展方法,它使用NewtonSoft库将对象转换为json字符串。

WCF将跳过序列化的流输出,并将它传递给客户端。

我希望你有你的答案。


只是扩展tdelepine的代码片段,这里是我用过的代码:

在我的WCF JSON服务中,我有一个(可为空)DateTime值,并希望我的服务以更易读的格式返回日期,所以我的iPhone应用程序将能够解释它。

这是我的JSON看起来像什么,应用了一些变化后:

在这里输入图像描述

请注意UpdateDateOriginal字段,它是WCF写入DateTimes的默认方式,以及我使用下面的代码创建的更友好的UpdateDate字段。

我的原始线条如下所示:

[DataMember]
public DateTime? UpdateDateOriginal { get; set; }

...这里是创建新的友好UpdateDate JSON值的行。

[IgnoreDataMember]
public DateTime? UpdateDate { get; set; }

[DataMember(Name = "UpdateDate")]
private string UpdateDateString { get; set; }

[OnSerializing]
void OnSerializing(StreamingContext context)
{
    if (this.UpdateDate == null)
    this.UpdateDateString = "";
    else
    this.UpdateDateString = this.UpdateDate.Value.ToString("MMM/dd/yyyy HH:mm", CultureInfo.InvariantCulture);
}

[OnDeserialized]
void OnDeserializing(StreamingContext context)
{
    if (this.UpdateDateString == null)
    this.UpdateDate = null;
    else
    this.UpdateDate = DateTime.ParseExact(this.UpdateDateString, "MMM/dd/yyyy HH:mm", CultureInfo.InvariantCulture);
}

实际上,您可能会发现以ISO8601格式返回DateTime值会更有用。 例如:

UpdateTime: "2014-08-24T13:02:32",

要做到这一点,只需使用我上面的代码,但在两个地方将字符串"MMM/dd/yyyy HH:mm"更改为"s"

而且,如果您的DateTime值以UTC格式存储,但您希望WCF服务返回用户本地时区中的值,则可以在此处查看我的提示:

在用户当地时区获取DateTime

用一些简单的例子来说明生活并不容易!


你可以在你的json对象定义中使用这个解决方法

[IgnoreDataMember]
public DateTime dateObject;

public string dateCustomSerialize
{
 get {
//Custom get
}
set {
//Custom set
}
}

评估者将您的自定义格式序列化

链接地址: http://www.djcxy.com/p/48137.html

上一篇: Change default date serialization in WCF

下一篇: Using JSON.NET to return ActionResult