【问题标题】:Is DataContract attributes required for WCFWCF 是否需要 DataContract 属性
【发布时间】:2011-08-20 18:25:46
【问题描述】:

我正在编写 WCF 服务和他的客户端。我想在服务和客户端之间发送/接收我的自定义类的对象。

我有 3 个模块

  • WCF 服务
  • WCF 客户端
  • 通用类库

WCF 服务和客户端都引用了公共类库。 我不想用 DataContract 属性标记我的所有班级。

所以,我的问题是“WCF 是否需要 DataContract 属性?”

我使用 .NET 4 和 netTcpBinding。

【问题讨论】:

    标签: c# .net wcf serialization


    【解决方案1】:

    如果我没记错的话(IIRC),如果你不使用正式的数据合同标记,它默认就像一个字段序列化器。这将起作用,但不太容易进行版本控制,因为私有更改可能会破坏客户端/服务器。 IMO 您应该始终使用 data-contract/data-member 属性正式装饰 WCF 类型。没有它们它也可以工作,但是出于错误的原因(IIRC,最初它没有没有正式标记就可以工作)。

    【讨论】:

    【解决方案2】:

    "是否需要 DataContract 属性 为 WCF"

    从技术上讲,没有。这取决于您是否使用 DataContractSerializer(这是许多绑定的默认设置)。

    还有其他选择:

    1. 考虑替代序列化程序
    2. 尝试使用Data Contract Surrogates(属性仍然是必需的某处,但这确实意味着你可以保持你的课程不变,如果那是相关的)
    3. 当您序列化没有数据协定属性的类时,请依赖 serialization defaults

    【讨论】:

    • 撤回的 ContractDescription 建议。我怀疑您可以使用 ContractDescription 以某种方式更改序列化程序
    【解决方案3】:

    您可以在 WCF 中使用多种序列化技术,这是它的优点之一。看看:

    http://msdn.microsoft.com/en-us/magazine/cc163569.aspx

    【讨论】:

      【解决方案4】:

      不需要使用 DataContract 属性,没有它们你的服务也能正常工作。

      话虽如此,我真的不认为让您的服务和客户端共享一个类库是最好的设计方法。如果您通过 DataContracts 公开您的类型会更清楚。

      如果有一天,有人想要使用您的服务但无权访问共享类库,会发生什么情况?

      【讨论】:

      • 当服务有一个方法([OperationContract]),它有我的自定义类的参数并且该类没有默认构造函数时,我从 WCF 服务主机收到 InvalidDataContractException。
      • 即使您的服务和客户端共享一个类库,WCF 也会尝试序列化您的类型,为此它需要一个默认构造函数。您的设计违反了 Web 服务设计的原则,我认为您最好使用 .NET 远程处理之类的其他东西。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-04
      • 2013-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-18
      • 1970-01-01
      相关资源
      最近更新 更多