更改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