为什么WCF突然需要DataContractAttributes?

时间:2013-05-18 19:20:30

标签: wcf

我在应用程序中构建了许多WCF服务。直到最近,用作服务中的许多操作的参数的大多数类都没有应用DataContract或DataMember属性。

现在,我连续做了一些更改,突然之间WCF抱怨他无法序列化我的类。

是否有人知道配置中的任何更改,甚至ServiceContract,OperationContract等是否会导致WCF对它可以序列化的类变得挑剔?

我宁愿不需要这些类中的属性(它们应尽可能是纯C#类)。

另外值得注意的是,如果我在源代码管理中返回到以前的版本,WCF会回到“正常”状态,所以我认为它不是机器/环境的东西。

3 个答案:

答案 0 :(得分:5)

在不使用[DataContract][DataMember]属性的情况下创建WCF数据协定的功能是在.NET 3.5 SP1中添加到WCF的功能。因为在将代码还原到以前的版本时,一切都适合您,我假设您已经使用了至少该版本。

尽管如此,为了使类可以由WCF序列化,该类必须满足几个要求listed here。数据合同类的主要要求是:

  • 必须是公开的。
  • 它必须具有无参数构造函数。
  • 不得有任何不符合所有这些要求的数据成员。如果您确实有这样的成员,请将其标记为[IgnoreDataMember],它将从WCF序列化中排除。

通过使用DataContractSerializer类手动执行序列化,您可以获得有关无法序列化的更多信息。有关详细信息和代码示例,请参阅this article。另一种方法是使用[IgnoreDataMember]标记所有成员,并逐渐从成员中删除属性,直到序列化失败,这将告诉您哪个成员导致了问题。

答案 1 :(得分:0)

WCF对具有[serializable]属性的类很宽松。您不需要[DataContract]。您必须添加一些不可序列化的内容。

答案 2 :(得分:0)

我知道这样做的方法。它不专业,但对我有用 我也需要纯粹的c#类,所以我这样做。 我将我的类的每个参数转换为一个对象,然后将它们收集到对象数组中并将其发送到另一侧。在另一边我做反向操作以获取我的参数。但是这个操作会降低我认为的性能