为什么WCF突然需要DataContractAttribute?

为什么WCF突然需要DataContractAttribute?,wcf,Wcf,作为应用程序的一部分,我构建了许多WCF服务。直到最近,大多数用作服务中许多操作参数的类都没有应用DataContract或DataMember属性 现在,我已经连续做了一些更改,突然WCF抱怨他不能序列化我的类 有人知道配置中的任何更改,甚至ServiceContract、OperationContract等中的任何更改是否会导致WCF对它可以序列化的类变得挑剔吗 我宁愿不需要这些类中的属性,它们应该尽可能是纯C类 同样值得注意的是,如果我在源代码管理中返回到以前的版本,WCF将恢复正常,因此

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

现在,我已经连续做了一些更改,突然WCF抱怨他不能序列化我的类

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

我宁愿不需要这些类中的属性,它们应该尽可能是纯C类


同样值得注意的是,如果我在源代码管理中返回到以前的版本,WCF将恢复正常,因此我相信这不是机器/环境问题

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

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

在.NET 3.5 SP1中,WCF添加了一项功能,即不使用[DataContract]和[DataMember]属性创建WCF数据协定。由于在将代码还原到以前的版本时,一切都可以正常工作,因此我假设您至少已经在使用该版本

然而,为了使类能够被WCF序列化,该类必须满足几个要求。数据合同类的主要要求是:

它必须是公开的。 它必须有一个无参数构造函数。 它不能有任何不符合所有这些要求的数据成员。如果您确实有这样一个成员,请用[IgnoreDataMember]标记它,它将从WCF序列化中排除。
通过使用DataContractSerializer类手动执行序列化,可以获得有关序列化失败的内容的更多信息。有关更多详细信息和代码示例,请参阅。另一种方法是使用[IgnoreDataMember]标记所有成员,并逐渐从成员中删除属性,直到序列化失败,这将告诉您是哪个成员导致了问题。

不使用[DataContract]和[DataMember]创建WCF数据协定的能力属性是.NET3.5SP1中添加到WCF的一项功能。由于在将代码还原到以前的版本时,一切都可以正常工作,因此我假设您至少已经在使用该版本

然而,为了使类能够被WCF序列化,该类必须满足几个要求。数据合同类的主要要求是:

它必须是公开的。 它必须有一个无参数构造函数。 它不能有任何不符合所有这些要求的数据成员。如果您确实有这样一个成员,请用[IgnoreDataMember]标记它,它将从WCF序列化中排除。
通过使用DataContractSerializer类手动执行序列化,可以获得有关序列化失败的内容的更多信息。有关更多详细信息和代码示例,请参阅。另一种方法是用[IgnoreDataMember]标记所有成员,并逐渐从成员中删除属性,直到序列化失败,这将告诉您是哪个成员导致了问题。

我知道一种方法。这不专业,但对我来说很管用 我也需要纯c类,所以我这样做。
我将类的每个参数转换为一个对象,然后将它们聚集到对象数组中,并将其发送到另一端。在另一侧,我执行反向操作以恢复参数。但是这个操作会降低性能,我想我知道一种方法。这不专业,但对我来说很管用 我也需要纯c类,所以我这样做。
我将类的每个参数转换为一个对象,然后将它们聚集到对象数组中,并将其发送到另一端。在另一侧,我执行反向操作以恢复参数。但是,我认为这个操作会降低性能。

从.NET 3.5 SP1开始,WCF取消了在要序列化的单个字段上使用[DataMember]的要求。但是如果您的类在某个地方使用[DataMember],那么您需要在任何地方都使用它。但据我所知,这种行为在.NET 4.5中没有改变,例如,如果您选择了.NET 3.5 SP1,则不使用[DataMember]也可以,WCF取消了在要序列化的单个字段上使用[DataMember]的要求。但是如果您的类在某个地方使用[DataMember],那么您需要在任何地方都使用它。但据我所知,这种行为在.NET 4.5中没有改变,例如,如果您选择不使用[DataMember],您应该可以