【问题标题】:WCF result deserializing to default values for value types in a list of key/value pairsWCF 结果反序列化为键/值对列表中值类型的默认值
【发布时间】:2011-07-29 15:07:21
【问题描述】:

我有一个 WCF 服务,结果是一个自定义的 TimeSeries 类,定义为:

[DataContract]
public class TimeSeries
{
  [DataMember]
  public string Name { get; set; }
  [DataMember]
  public List<KeyValuePair<DateTime, double>> Data { get; set; }
}

我的服务方法会创建一个包含这些对象的数组以返回。调试服务方法,我可以看到包含这些对象之一的数组被正确创建(它有一个名称和 37 个 vk 数据对)。使用 Fiddler,我可以看到对象正在被序列化和发送(HTTP 响应中的数据仍然正确)。但是,当我在客户端检查结果对象并且它不正确时,问题就来了。具体来说,我得到了一个具有正确名称的 TimeSeries 对象,以及正确的 number 个 kv 对,但它们包含每个 DateTime 和 double 的默认值(即 01/01/0001 12:00AM & 0.0)。

我的客户端是 Silverlight v4,我正在使用自动生成的服务参考。该问题似乎与反序列化有关。任何人对它为什么这样做、我缺少什么或如何解决它有任何想法?

【问题讨论】:

标签: wcf serialization silverlight-4.0 datacontract


【解决方案1】:

正如Serializing a list of Key/Value pairs to XML中所述:

KeyValuePair 不可序列化,因为它具有只读属性

所以您需要自己的课程,就像该页面上的答案所说的那样。

【讨论】:

  • 感谢多一双眼睛。我最初打算使用 Tuple,但为了语义差异,我切换到了 KeyValuePairs。我想我会换回来的。
  • 只是想我会抛出这个评论以供将来参考:DataContractSerializer 正在正确序列化 kv 对,但由于 Key 和 Value 属性是只读的,因此无法反序列化它们。从链接的帖子中可以看出,xml 序列化程序甚至不会序列化它们。
【解决方案2】:

另一种方法是使用Dictionary&lt;DateTime,double&gt;,而不是使用您自己的类,这似乎可以很好地序列化和反序列化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-21
    相关资源
    最近更新 更多