【问题标题】:WCF Serialised List object giving strange names for objectsWCF序列化列表对象为对象提供奇怪的名称
【发布时间】:2014-11-21 00:37:53
【问题描述】:

这是 WCF 服务中的方法签名:

APIMessageList<APISimpleContact> GetMembers(string apiKey, APIContactSearchFilter filter);


APIMessageList 继承自 IList。一旦我针对这个 WCF 服务构建了一个代理,类名就是 APIMessageListOfAPISimpleContactjHldnYZV

为什么我没有收到:APIMessageListOfAPISimpleContact

它将随机文本添加到界面中每个 APIMessageList 对象的末尾(有几个)它们都以相同的几个字符结尾 - jHldnYZV。我在网上查找了可能的原因,但我找不到任何有此问题的人的帖子。

这纯粹是一个表面问题,但这个界面会暴露给我们的外部客户,所以它的外观很重要。

有人知道我为什么会遇到这个问题吗?

非常感谢

【问题讨论】:

  • 能否请您从服务合同中发布运营合同属性?

标签: wcf serialization


【解决方案1】:

您的解决方案将在http://msdn.microsoft.com/en-us/library/ms731045.aspx。基本上,由于您可以有多个“SimpleContract”类(在不同的命名空间中),WCF 将在合同名称的末尾添加一个消歧散列,这就是您在合同名称末尾的 8 个字符中所拥有的内容。但是您可以通过使用 CollectionDataContract 及其 Name 属性来控制它:

[CollectionDataContract(Name = "APIMessageListOfSimpleContract")]
public class APIMessageList : IList<SimpleContract> { ... }

【讨论】:

    【解决方案2】:

    我们在使用泛型类型作为返回值时遇到了类似的问题。如果我们未指定具体类型,则默认数据协定序列化程序或 WCF 序列化程序无法推断返回实体的确切类型。因此,它为返回的类型生成一个随机类名。

    在我们的项目中,我们通过构建一个特定类型的数据合约克服了这个问题,并作为 WCF 操作调用的结果返回相同的数据。

    我的猜测是您使用的是泛型类型,而序列化程序无法推断返回对象的类型。

    我建议您创建一个数据传输对象 (DTO) 并从 WCF 服务返回该对象。这应该可以解决您的问题。

    【讨论】:

    • 为泛型设置序列化规则包含在@carlosfigueira 答案中给出的链接中——你只需给它一个这样的模板; [DataContract(Name = "Drawing_using_{1}_brush_and_{0}_shape")] public class Drawing&lt;Shape, Brush&gt; { // Code not shown. }
    • ps。为什么 cmets 中的代码格式在这个网站上如此垃圾!!?
    猜你喜欢
    • 2019-03-01
    • 1970-01-01
    • 2017-08-29
    • 2014-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多