1

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

现在,我连续进行了一些更改,突然间 WCF 抱怨他无法序列化我的课程。

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

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

另外值得注意的是,如果我在源代码管理中返回到以前的版本,WCF 会恢复为“正常”,所以我相信这不是机器/环境的事情。

4

3 回答 3

5

[DataContract]无需使用and[DataMember]属性即可创建 WCF 数据协定的功能是 .NET 3.5 SP1 中添加到 WCF 的一项功能。由于在将代码恢复到以前的版本时一切都对您有用,我假设您至少已经在使用该版本。

然而,为了使 WCF 可序列化类,该类必须满足此处列出的几个要求。数据契约类的主要要求是:

  • 它必须是公开的。
  • 它必须有一个无参数的构造函数。
  • 它不能有任何不满足所有这些要求的数据成员。如果您确实有这样的成员,请将其标记为[IgnoreDataMember],它将被排除在 WCF 序列化之外。

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

于 2013-05-18T21:18:47.400 回答
0

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

于 2013-05-18T20:16:35.330 回答
0

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

于 2013-05-19T07:03:13.023 回答