Jor*_*ris 7 datetime json datacontract wcf-client deserialization
我已经在网上搜索了这方面的信息,但大多数结果都是关于创建WCF服务或服务在您控制之下的情况.
我正在为RESTful JSON服务构建一个WCF客户端代理,这是我无法控制的.我正在使用基本的ServiceContract/DataContract模式,并试图让框架尽可能多地完成工作.
大多数情况下,这工作正常,但来自此外部服务的所有日期时间字段都采用特定格式,例如
{"SomeObject":
{"details":"blue and round", "lastmodified":"2013/01/02 23:14:55 +0000"}
}
Run Code Online (Sandbox Code Playgroud)
所以我收到一个错误:
反序列化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; }
}
}
Run Code Online (Sandbox Code Playgroud)
我的服务合同是:
[ServiceContract]
public interface ICoolExternalApi
{
[OperationContract]
[WebGet(UriTemplate = "/something.json",
ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.Wrapped)]
[return: MessageParameter(Name = "SomeObject")]
SomeObject GetAccount();
}
Run Code Online (Sandbox Code Playgroud)
我想知道的是,在哪里可以添加一些代码来定义WCF如何反序列化lastmodified字段(从字符串中生成DateTime对象)?
或者更好的是,定义如何为所有DataContracts反序列化所有DateTime DataMembers.我不想要很多重复的代码.
我也不想求助于某些第三方反序列化器,也不想通过自定义反序列化方法开始放置其他所有内容,如果可以避免的话.
到目前为止,这是我想出的最好的:
我有一个内部字符串扩展方法:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
这是 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; }
Run Code Online (Sandbox Code Playgroud)
如果您想使用此 DataContract 来发送数据(使其成为可写属性),则必须编写一个 DateTime 扩展方法 (GetSerializedDateString),扩展 setter/getter 并引入私有成员作为中间人。
它有点剪切和粘贴的味道,并且没有利用任何 WCF 框架功能。比尔·盖茨会做什么?
| 归档时间: |
|
| 查看次数: |
3274 次 |
| 最近记录: |