9

DataContractSerializer要求類和成員用DataContractDataMember屬性標記。但是,就我而言,這些類是使用EFPocoAdapater框架自動生成的,並且這些屬性不存在。DataContractSerializer:如何在沒有DataContract/DataMember屬性的情況下序列化類/成員

如何在不存在這些屬性的情況下強制使用DataContractSerializer對所有成員進行序列化?

從Alexdej:

這3.5SP1改變,希望大家看到 說: http://www.pluralsight.com/community/blogs/aaron/archive/2008/05/13/50934.aspx

回答

6

你不能 - 簡單明瞭。 DataContractSerializer需要該屬性來獲取要序列化的元素。與XmlSerializer相比,它基本上只是序列化所有的東西(除非你明確地告訴它忽略它),DataContractSerializer是「選入」的 - 你必須明確地告訴它(通過屬性)哪些字段和/或屬性序列化。正如幾位人士指出的那樣,在.NET 3.5 SP1中,Microsoft放寬了這些規則 - 任何公共讀/寫屬性都將由DataContractSerializer自動序列化。與此同時,你的類也需要有一個參數的默認構造函數 - 聽起來像我們不得不對XmlSerializer的方式回來時的精確要求....

當然,這樣的:

  • 不允許你序列化一些私有的東西 - 如果你想序列化它,你必須公開它作爲公共讀/寫屬性
  • 不允許你指定一個定義的選擇的參數排序 - 它只會在爲了讓它們出現在類中
  • 現在要求您在類中再次使用無參數構造函數fo r反序列化

我仍然認爲這些東西應該是明確和清晰的,這使得不再需要的開闢了懶惰/馬虎編程的道路 - 我不喜歡它。但是,如果你願意,你現在可以使用它,而[DataMember]標註明確標識您的屬性.....

馬克

+0

我真的很希望你會錯,但經過​​大量的谷歌搜索,我擔心你是對的。無法使用XmlSerializer(與實體框架一起使用的循環引用問題)。嗯,匿名的課程是。 – aleemb 2009-04-24 18:54:28

0

我相信這是可能的。如果你實現了ISerializable接口,那麼序列化程序將使用你的實現而不是屬性。儘管我認爲你仍然需要標記類[Serializable]。

它比添加屬性多一點工作,但它確實有效。

0

只需用[Serializable]屬性標記該類即可。 任何您不想序列化的成員都使用[NonSerialized]標記。請注意,[Serializable]會導致默認序列化所有字段,默認情況下[DataContract]沒有序列化字段,除了標有[DataMember]的字段。

相關問題