爲什麼不使用序列化屬性在c#中使用XMLSerializer。使用c#序列化
http://msdn.microsoft.com/en-us/library/71s92ee1.aspx
這裏OrderedItem類不序列化。是什麼原因?
爲什麼不使用序列化屬性在c#中使用XMLSerializer。使用c#序列化
http://msdn.microsoft.com/en-us/library/71s92ee1.aspx
這裏OrderedItem類不序列化。是什麼原因?
OrderedItem
是非常序列化...我猜你的意思是「爲什麼它沒有[Serializable]
屬性?」。如果是這樣,答案很簡單:串行器不要求它。它是要求BinaryFormatter
等,但他們正在做一些有點不同 - 他們序列化的對象的內部狀態。但是,大多數序列化程序這幾天不需要檢查;例子:
XmlSerializer
DataContractSerializer
(和所有變體)JavascriptSerializer
基本上,它只是沒有必要。或許關鍵的區別是,BinaryFormatter
可能意外(無屬性)最終發送不適當的數據通過遠程邊界,這可能會導致大問題。
許多「輕」框架甚至沒有定義[Serializable]
。
BinaryFormatter使用[Serializable]屬性。 但是XMLSerializer不需要這個。通過創建seralizer
XmlSerializer serializer =
new XmlSerializer(typeof(OrderedItem));
他假定OrderedItem確實是Serializable。
是我們把typeof(OrderedItem)的原因? – chathura 2013-02-27 09:02:05
@ chathura2020不,這是因爲'XmlSerializer'是一個基於契約的串行器,沒有它不知道它期望什麼數據,特別是對於反序列化。如果你不告訴它的類型,然後說「反序列化」
我發現一個解釋是,如果你的類爲[Serializable]
和序列化與例如BinaryFormatter
那麼即使這個類的一個實例的私有成員將被序列化該對象,所以它是通過它可以決定一個機制如果該類應該完整地序列化,或者使用Xml或JS序列化程序對其進行序列化,並且只獲取公共成員。
所以,如果你序列化使用XmlSerializer只有公共成員將被序列化。
「public members」的東西是不可靠的 - 這就是'XmlSerializer ',但還有其他序列化程序會序列化非公開成員,並且不需要'[Serializable]'。例如'DataContractSerializer'。 – 2013-02-27 09:04:49
@MarcGravell當然,但是您是否必須使用[DataMember]屬性手動標記每個成員以便DataContractSerializer獲取它們? – dutzu 2013-02-27 09:05:45
的確,必須有一定程度的選修配置 – 2013-02-27 09:10:52
你問爲什麼在這個例子中OrderedItem類沒有一個標記爲[Serializable]的屬性? – dutzu 2013-02-27 08:55:17
是的,使用BinaryFormatter和SoapFormatter我們使用[Serializable]。 – chathura 2013-02-27 08:57:33