2009-01-21 47 views
5

我有一種感覺,這是一個轉發,但我似乎無法找到任何有關它的好消息。我只是想知道序列化是如何工作的(實際上是反序列化)。我想知道的是,如果說我有一個實際上沒有私人領域支持的財產,即:序列化如何在.Net中工作

public string SomeProp { 
    get { 
     return GetValue("SomePropKey"); 
    } 
    set{ 
     SetValue("SomePropKey", value); 
    } 
} 

當我反序列化setter被調用? getter被調用序列化,因爲當我序列化對象時,正確的值被寫入輸出流。我知道這似乎是一個奇怪的情況,但究竟發生了什麼?或者我只是過分複雜這....

回答

7

它完全取決於您用於序列化的機制。

如果你使用的是XmlSerialization,那麼是的,setter被調用。

如果使用數據協定序列化(DataContractSerialization),那麼如果將D​​ataMember屬性應用於屬性(而不是其後臺字段),則會調用getter/setter。

如果您在.NET中使用原始序列化機制(IFormatter實現),那麼這種情況是不可能的,因爲它只會序列化存儲在字段中的值。

+0

謝謝,我們正在使用XmlSerialization。對不起,我沒有包括這一點。並再次感謝你! – 2009-01-21 19:32:02

0

你是在談論XML序列化,還是'常規'序列化(soap/binary),因爲-afaik-這兩種序列化技術是不同的。 AFAIK,如果您使用BinaryFormatter或SoapFormatter,則字段將被序列化/反序列化,而不是屬性。
關於反序列化,我相信使用具有Seri​​alizationInfo & StreamingContext參數的特殊2參數構造函數。

但是,沒有什麼能阻止你通過實現ISerializable接口來控制序列化過程。 然後,如果你希望你的價值是使用你的財產設定的,我認爲你完全可以這樣做。

0

我知道它不是你的問題的直接答案,你已經得到了你正在尋找的答案。但我不想保留這一點。您可以使用Reflector查看基類庫資源。這是瞭解更多關於.net框架內部結構並擴展知識的絕佳方式。