我已经在网上搜索了这方面的信息,但大部分结果都是关于创建WCF服务或服务在您控制之下的情况。
我正在为RESTful JSON服务构建一个WCF客户端代理,这是我无法控制的。我正在使用基本的ServiceContract / DataContract模式,并尝试让框架尽可能多地完成工作。
大多数情况下,此工作正常,但来自此外部服务的所有日期时间字段都采用特定格式,例如
{"SomeObject":
{"details":"blue and round", "lastmodified":"2013/01/02 23:14:55 +0000"}
}
所以我收到一个错误:
反序列化MyNamespace.SomeObject类型的对象时出错。 DateTime内容'2013/01/02 23:14:55 +0000'不以'/ Date('和'以'结尾')开头,如JSON所示。'。
我的数据是:
namespace Marshmallow.WebServices.ServiceModels
{
[DataContract]
public class SomeObject
{
[DataMember(Name = "details")]
public string Details { get; set; }
[DataMember(Name = "lastmodified")]
public DateTime LastModified { get; set; }
}
}
我的服务合同是:
[ServiceContract]
public interface ICoolExternalApi
{
[OperationContract]
[WebGet(UriTemplate = "/something.json",
ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.Wrapped)]
[return: MessageParameter(Name = "SomeObject")]
SomeObject GetAccount();
}
我想知道的是,在哪里可以添加一些代码来定义WCF如何反序列化lastmodified字段(从字符串中生成DateTime对象)?
或者更好的是,定义如何为所有DataContracts反序列化所有DateTime DataMembers。我不想要很多重复的代码。
我也不想诉诸某些第三方反序列化程序,也不想通过自定义反序列化方法开始使用其他所有内容,如果可以避免的话。
答案 0 :(得分:2)
我能想到的两件事:
答案 1 :(得分:1)
到目前为止,这是我提出的最好的:
我有一个内部字符串扩展方法:
internal static class DeserializationHelper
{
internal static DateTime GetDeserializedDateTime(this string @string)
{
if (string.IsNullOrEmpty(@string)) return default(DateTime);
//insert complex custom deserialization logic here
return DateTime.Parse(@string);
}
}
这是DataMember设置:
[DataMember(Name = "lastmodified")]
internal string _LastModified
{
set { LastModified = value.GetDeserializedDateTime(); }
//getter is not needed for receiving data but WCF requires one
get { return default(string); }
}
public DateTime LastModified { get; private set; }
如果您想使用此DataContract发送数据(使其成为可写属性),则必须编写DateTime Extension方法(GetSerializedDateString),展开setter / getters并将私有成员作为中间人。
它有剪切和粘贴的气味,并且它没有利用任何WCF框架功能。比尔盖茨会怎么做?