2013-05-18 66 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#類,所以我這樣做。 我將我的類的每個參數轉換爲一個對象,然後將它們收集到對象數組中並將其發送到另一側。在另一方面,我做了相反的操作來恢復我的參數。但是這個操作會降低我認爲的性能