2013-02-27 49 views

回答

2

OrderedItem是非常序列化...我猜你的意思是「爲什麼它沒有[Serializable]屬性?」。如果是這樣,答案很簡單:串行器不要求它。它要求BinaryFormatter等,但他們正在做一些有點不同 - 他們序列化的對象的內部狀態。但是,大多數序列化程序這幾天不需要檢查;例子:

  • XmlSerializer
  • DataContractSerializer(和所有變體)
  • JavascriptSerializer
  • JSON.net
  • protobuf網
  • 和大量其他的

基本上,它只是沒有必要。或許關鍵的區別是,BinaryFormatter可能意外(無屬性)最終發送不適當的數據通過遠程邊界,這可能會導致大問題。

許多「輕」框架甚至沒有定義[Serializable]

0

BinaryFormatter使用[Serializable]屬性。 但是XMLSerializer不需要這個。通過創建seralizer

XmlSerializer serializer = 
    new XmlSerializer(typeof(OrderedItem)); 

他假定OrderedItem確實是Serializable。

+0

是我們把typeof(OrderedItem)的原因? – chathura 2013-02-27 09:02:05

+1

@ chathura2020不,這是因爲'XmlSerializer'是一個基於契約的串行器,沒有它不知道它期望什麼數據,特別是對於反序列化。如果你不告訴它的類型,然後說「反序列化」'...它使用什麼類型?你不能只說'Foo',因爲a:可以可以使用多個'Foo'和b:'[XmlRoot]'來爲'Bar'類創建''。 – 2013-02-27 09:03:06

0

我發現一個解釋是,如果你的類爲[Serializable]和序列化與例如BinaryFormatter那麼即使這個類的一個實例的私有成員將被序列化該對象,所以它是通過它可以決定一個機制如果該類應該完整地序列化,或者使用Xml或JS序列化程序對其進行序列化,並且只獲取公共成員。

所以,如果你序列化使用XmlSerializer只有公共成員將被序列化。

+0

「public members」的東西是不可靠的 - 這就是'XmlSerializer ',但還有其他序列化程序會序列化非公開成員,並且不需要'[Serializable]'。例如'DataContractSerializer'。 – 2013-02-27 09:04:49

+0

@MarcGravell當然,但是您是否必須使用[DataMember]屬性手動標記每個成員以便DataContractSerializer獲取它們? – dutzu 2013-02-27 09:05:45

+0

的確,必須有一定程度的選修配置 – 2013-02-27 09:10:52