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

C# 更改WCF中的默认日期序列化,c#,json,wcf,datetime,serialization,C#,Json,Wcf,Datetime,Serialization,是否仍然需要更改WCF中DateTime的默认JSON序列化/反序列化 目前,DateTime被序列化为/Date(1372252162657+0200)/格式,本来应该可以,但当我的服务器不在UTC时,我遇到了问题(我无法更改) 此服务正在处理的所有日期/时间数据均为UTC格式。当服务器处于UTC时,一切正常。但是,暂存/生产环境设置为GMT+1(巴黎),序列化程序假定日期/时间为GMT+1,完全忽略属性Kind。因此,正如您所期望的那样,调用DateTime.SetKind()并将其设置为U

是否仍然需要更改WCF中DateTime的默认JSON序列化/反序列化

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

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


我可以进行双向日期对话(在反序列化时,它也会做出相同的假设,所以它总是GMT+1)日期对话:UTC到/从服务器时间,但这太单调了。所以我想也许我可以重写默认的序列化行为。

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

但消息格式化程序将很难在这里解释堆栈溢出。 你可以参考

如果你不想把这件事搞砸,那么就可以进行黑客攻击

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

e、 g

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

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


我希望您能得到答案。

一种方法是使用消息格式化程序更改默认的
DataContractSerializer
,如中所述


另一种选择是编写一个扩展方法,将对象加载到流中,然后可以对对象应用任何序列化程序。有关如何执行此操作的详细信息,请参阅公认答案。

您可以在json对象定义中使用此解决方法

[IgnoreDataMember]
public DateTime dateObject;

public string dateCustomSerialize
{
 get {
//Custom get
}
set {
//Custom set
}
}
在assessor中放置自定义格式序列化

仅扩展tdelepine的代码片段,这里是我使用的代码:

在我的WCF JSON服务中,我有一个(可为空的)日期时间值,希望我的服务以更可读的格式返回日期,这样我的iPhone应用程序就能够解释它

下面是我的JSON在应用了一些更改后的样子:

请注意
UpdateDateOriginal
字段,这是WCF写入日期时间的默认方式,以及更友好的
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”

而且,如果您的日期时间值存储在UTC中,但您希望您的WCF服务返回用户本地时区中的值,您可以按照我的提示进行操作:


举几个简单的例子,生活不是更简单吗

这并不能解决你的时区问题,但我将在这里为那些正在与WCF、ticks和DateTime进行斗争的人发布它

如果您不希望使用滴答声,而是人类可读的时间格式,可以通过引入额外的
string
属性来实现。然后,在将值转换为字符串之前,只需摆弄
DateTime

    [IgnoreDataMember]    // Ignore the original tick date.
    public DateTime LastReminderDate { get { return _lastReminderDate; } set { _lastReminderDate = value; } }
    [DataMember]          // Make sure you have a public or private setter!
    public string LastReminderDateText { get { return _lastReminderDate.ToString(); } set { _lastReminderDate = DateTime.Parse(value); } }

我需要
2018-02-06T14:40:43.511Z
DateTime格式我想你需要使用:ToString(“yyy-MM-ddTHH:MM:ssK”)一些文章说“Z”部分意味着它是UTC,你试图把它包括在字符串中。我想应该是
yyy-MM-ddTHH:MM:ss.fffK
或者只是
o
。这是最好的答案。简洁明了的.dateTime.ToString(“O”)是我如何从.NET获取符合ISO 8601标准的日期的:序列化
JavaScriptSerializer
有关
dateTime
视图的问题可能使用
DataContractJsonSerializer、JsonSerializer(ServiceStack)和JsonConvert(json.NET)
。有真实世界的样本吗?
    [IgnoreDataMember]    // Ignore the original tick date.
    public DateTime LastReminderDate { get { return _lastReminderDate; } set { _lastReminderDate = value; } }
    [DataMember]          // Make sure you have a public or private setter!
    public string LastReminderDateText { get { return _lastReminderDate.ToString(); } set { _lastReminderDate = DateTime.Parse(value); } }