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

Mel*_*Mel 16 c# wcf serialization datetime json

有没有改变WCF中DateTime的默认JSON序列化/反序列化?

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

此服务正在处理的所有日期/时间数据均为UTC格式.当服务器使用UTC时,一切正常.但是,staging/prod环境设置为GMT + 1(Paris),并且序列化器假设日期/时间是GMT + 1,完全忽略该属性Kind.因此,您希望调用DateTime.SetKind()并将其设置为UTC将无法正常工作.实际上,序列化时间延迟了一个小时.

我可以进行双向日期对话(它在反序列化时也做出相同的假设,因此它的GMT + 1总是)对话的日期:UTC到/从服务器时间,但这是乏味的.所以我想也许我可以覆盖默认的序列化行为.

Mik*_*ill 21

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

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

应用一些更改后,这是我的JSON的样子:

在此输入图像描述

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

我的原始行看起来像这样:

[DataMember]
public DateTime? UpdateDateOriginal { get; set; }
Run Code Online (Sandbox Code Playgroud)

...以下是创建新友好UpdateDateJSON值的行.

[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);
}
Run Code Online (Sandbox Code Playgroud)

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

UpdateTime: "2014-08-24T13:02:32",
Run Code Online (Sandbox Code Playgroud)

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

并且,如果您的DateTime值以UTC格式存储,但您希望WCF服务返回用户本地时区的值,则可以按照我的提示进行操作:

在用户本地时区获取DateTime

通过几个简单的例子,生活不容易!


tde*_*ine 12

您可以在json对象定义中使用此变通方法

[IgnoreDataMember]
public DateTime dateObject;

public string dateCustomSerialize
{
 get {
//Custom get
}
set {
//Custom set
}
}
Run Code Online (Sandbox Code Playgroud)

在评估中放置您的自定义格式序列化


Ron*_*tel 4

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

但是消息格式化程序在堆栈溢出方面很难解释,而且超出了解释范围。您可以参考WCF Extensibility : Message Formatters

如果你不想搞砸这个,那么可以使用 hack。

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

例如

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

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

WCF 将跳过序列化的流输出,并将其按原样传递给您的客户端。

我希望你能得到答案。