2011-08-31 48 views
12

我發現[DataContract][DataMember]屬性有點麻煩,寧願在配置方法或代碼中使用代碼。這可能嗎?設置DataContract和DataMember不具備所有屬性

+4

什麼是凌亂的前期裝修? –

+0

不知道如何回答。只是凌亂。 –

+3

我有很多實體,並且大多數情況下我想擴展它們,包括所有屬性,因此重複屬性數百次只會讓人覺得很麻煩。我希望找出拉迪斯洛夫在下面幫助我的「退出」方法。我寧願裝飾我不想包含的成員。 –

回答

14

根本不需要使用這些屬性。 DataContractSerializer將使用getter和setter序列化所有公共屬性,但在序列化具有導航屬性的實體的情況下,由於「循環引用」,您將很容易以異常結束。

爲了避免這種情況的例外您必須對您的實體類上要serilize或IgnoreDataMember你不想序列化的每個屬性的每個屬性使用[DataContract(IsReference = true)]DataMember

最後一個也是最複雜的選項是完全避免屬性,而自定義類實現IDataContractSurrogate來控制類型之外的序列化。

您還可以編寫完全自定義的序列化過程,或使用XML序列化或二進制序列化及其所有要求。

+2

但是我在我的類中添加了[DataContract],並且我可以從WCF操作中返回它...但內容是空白的,所以我將[DataMember]添加到幾個屬性中,並且突然那些(並且只有那些)是在序列化結果中返回。那麼,爲什麼我的工作不如你說默認所有屬性被返回? –

+0

順便說一下,它們是{get;設置;} –

+5

一旦添加了'DataContract'屬性,**必須**用'DataMember'屬性標記要序列化的屬性。我描述的默認序列化只有在您根本不使用'DataContract'屬性的情況下才有效。 –

1

不,DataContractSerializer是一個可選的串行器 - 你必須告訴它你想包括什麼。

與其他序列化程序一樣,您需要使用諸如NonSerializedAttribute或XmlIgnoreAttribute之類的東西來告訴序列化程序將事情放在一邊。

相關問題