我在应用程序中构建了许多WCF服务。直到最近,用作服务中的许多操作的参数的大多数类都没有应用DataContract或DataMember属性。
现在,我连续做了一些更改,突然之间WCF抱怨他无法序列化我的类。
是否有人知道配置中的任何更改,甚至ServiceContract,OperationContract等是否会导致WCF对它可以序列化的类变得挑剔?
我宁愿不需要这些类中的属性(它们应尽可能是纯C#类)。
另外值得注意的是,如果我在源代码管理中返回到以前的版本,WCF会回到“正常”状态,所以我认为它不是机器/环境的东西。
答案 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#类,所以我这样做。 我将我的类的每个参数转换为一个对象,然后将它们收集到对象数组中并将其发送到另一侧。在另一边我做反向操作以获取我的参数。但是这个操作会降低我认为的性能