2009-12-19 60 views
4

我有一些簡單的POCO對象:C# - 使用XMLSerializer和DataContractSerializer支持序列化的屬性?

public class ProductCategoryDTO 
{ 
     public string Name { get; set; } 
     public DateTime ModifiedDate { get; set; } 
} 

由於有時場順序是很重要的(例如,如果發送到InfoPath表單),我需要保持元件順序串行化時。

現在我很困惑,我應該爲類和每個字段使用哪些屬性。我知道:

  • DataContractSerializer的使用[DataContract]和[數據成員(訂單= N)]
  • XMLSerializer的用途[序列化]和[XmlElementAttribute(訂單= N)]。

然後,如果我想同時支持XMLSerializer和DataContractSerializer,那麼可以使用哪些屬性,因此可以同時用於WCF或ASP。網頁服務?

回答

3

我看不出有什麼理由不能把這兩個屬性放在類和成員屬性上,如果你真的必須的話。不好看,但如果它適合你,那就好了!

[DataContract(Namespace="....")] 
[XmlType] 
public class ProductCategoryDTO 
{ 
     [DataMember(Order=1)] 
     [XmlElementAttribute(Order=1)] 
     public string Name { get; set; } 

     [DataMember(Order=2)] 
     [XmlElementAttribute(Order=2)] 
     public DateTime ModifiedDate { get; set; } 
} 
+0

是的,我也有這個想法。我只是希望DataContract也可以使用[XmlElementAttribute(Order = n)] – JustAMartin 2009-12-19 17:33:30

+0

@Martin:沒有那兩個序列化器是完全獨立的,完全不同,並且不使用彼此的屬性。 – 2009-12-19 17:34:24

+0

你可能是指'class'上的XmlType,順便說一句。 – 2009-12-19 18:32:28

1

XML元素的順序應該由WSDL規定,您不必擔心。從.NET 3.5 SP1開始,不再需要使用DataContractAttributeDataMemberAttribute。序列化器將自動包含所有公共屬性。至於而言,SerializableAttribute不起作用。該屬性用於BinaryFormatter的二進制序列化。因此,爲了繼續,您可以將該類作爲POCO離開,將其暴露在WCF或ASP.NET Web服務中,並讓客戶端根據WSDL使用它。

+0

我指的是這個: http://stackoverflow.com/questions/612160/any-way-to-make-xmlserializer-output-xml-in-a-defined-order 也有一個話題關於Adobe/flex開發人員 - 他們抱怨說,對於.NET Web方法,每次重建類庫或Web服務時,字段順序都會發生變化。 另外,我對Infopath表單有不好的體驗 - 他們期望以某種順序接收元素。爲了避免實現我們自己的解決方案,最簡單的方法是將Order屬性或我們的Infopath表單開發人員在每個構建中瘋狂地調整xsl:D – JustAMartin 2009-12-19 17:31:59

6

嚴格說,你不需要用於任何;-p它曾經是DataContractSerializer會要求[DataContract]/[DataMember](他們絕對應該使用)的任何屬性,但你可以沒有使用它(但它然後以非常可疑的方式類似於BinaryFormatter)。同樣,XmlSerializer不需要需要任何東西,除非你想控制的東西。然而,有一些差異你應該注意:

  • XmlSerializer要求(和使用)一個公共無參數構造函數; DataContractSerializer不使用構造函數(完全)。所以要小心,不要(對於WCF)依靠ctor中的代碼 - 如果您有必要的init代碼,請爲WCF使用序列化回調。
  • XmlSerializer要求公共領域(yeuch)或公共財產getset(即使列表); DataContractSerializer將愉快地對私人成員,與(例如)公衆get和私人set和集合沒有'集(只要您的類型初始化它)的屬性。
  • XmlSerializer要求公共類型; IIRC DataContractSerializer不太挑剔

所以,是的;你可以同時支持兩個序列化器,並且你可以並行地添加的任意數量的屬性,但是如果你想要完全兼容,請注意上面的內容。

另一種選擇是隻使用XmlSerializer;您可以使用[XmlSerialzerFormat]將WCF配置爲使用XmlSerializer。這兩個選項都支持繼承,通過[XmlInclude][KnownType]

最後,請注意,如果您實施IXmlSerializable,則優先於兩者之一,但很難正確。除非必須,否則不要這樣做。

相關問題