2013-05-18 45 views
1

我构建了许多WCF服务作为应用程序的一部分。直到最近,大多数用作服务中的许多操作的参数的类没有将DataContract或DataMember属性应用于它们。为什么WCF突然需要DataContractAttributes?

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

有没有人知道如果在配置甚至在ServiceContract,OperationContract等的任何变化可以导致WCF变得挑剔有关它可以序列化的类?

我宁愿不需要这些类中的属性(它们应该是纯C#类尽可能)。另外值得注意的是,如果我在源代码控制中返回到以前的版本,WCF将回到“正常”状态,所以我相信它不是机器/环境的东西。

+0

从.NET 3.5 SP1开始,WCF就不再需要在单个字段上使用'[DataMember]'来进行序列化。但是,如果你的班级在某处使用了“[DataMember]”,那么你需要在任何地方使用它。但据我所知,这种行为在.NET 4.5中并没有改变(例如,如果你愿意,你应该很好*没有* [DataMember]) –

回答

0

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

5

在不使用[DataContract][DataMember]属性的情况下创建WCF数据合同的功能是在.NET 3.5 SP1中添加到WCF的功能。因为当你的代码恢复到以前的版本时,一切都适合你,我假设你已经在使用至少那个版本。

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

  • 它必须是公开的。
  • 它必须有一个无参数的构造函数。
  • 它不得有任何不符合所有这些要求的数据成员。如果你确实有这样一个成员,用[IgnoreDataMember]来标记它,它将被排除在WCF序列化之外。

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

0

我知道一种方法来做到这一点。它不是专业的,但它适用于我 我也需要纯粹的C#类,所以我这样做。 我将我的类的每个参数转换为一个对象,然后将它们收集到对象数组中并将其发送到另一侧。在另一方面,我做了相反的操作来恢复我的参数。但是这个操作会降低我认为的性能