2010-02-22 29 views
2

.NET(de)序列化背後發生了什麼,使它在下面的場景中表現得如此呢? (這是一個測試應用程序,只是說明我的設置。)在NameValueCollection的反序列化過程中幕後發生了什麼?

我有一個的NameValueCollection屬性的類:

[Serializable] 
public class MyClassWithNVC 
{ 
    public NameValueCollection NVC { get; set; } 
} 

它,反過來,包含在其他類:

[Serializable] 
class Wrapper : ISerializable 
{ 
    public MyClassWithNVC MyClass { get; private set; } 

    public Wrapper() 
    { 
     MyClass = new MyClassWithNVC 
         { 
          NVC = new NameValueCollection 
            { 
             {"TestKey", "TestValue"} 
            } 
         }; 
    } 

    public Wrapper(SerializationInfo info, StreamingContext context) 
    { 
     MyClass = info.GetValue("MyClass", typeof(MyClassWithNVC)) as MyClassWithNVC; 

     if(MyClass.NVC == null) 
     { 
      Console.WriteLine("NVC is null inside Wrapper's ctor."); 
     } 
    } 

    public void GetObjectData(SerializationInfo info, StreamingContext context) 
    { 
     info.AddValue("MyClass", MyClass); 
    } 
} 

我的測試程序如下:

class Program 
{ 
    static void Main(string[] args) 
    { 
     using(MemoryStream ms = new MemoryStream()) 
     { 
      Wrapper wrapper = new Wrapper(); 
      new BinaryFormatter().Serialize(ms, wrapper); 

      ms.Seek(0, SeekOrigin.Begin); 

      Wrapper loaded = new BinaryFormatter().Deserialize(ms) as Wrapper; 
      if(loaded.MyClass.NVC.Count == 1 && loaded.MyClass.NVC[0] == "TestValue") 
      { 
       Console.WriteLine("NVC is not null after Wrapper's ctor and has the correct value."); 
      } 
     } 

     Console.ReadKey(); 
    } 
} 

當我運行它時,我看到以下內容打印出來ole:

NVC在Wrapper's ctor內爲null。

雷士不是空包裝的構造函數後,具有正確的值。

這是怎麼回事嗎? NameValueCollection中顯然能夠與默認序列化反序列化本身,而是 這是爲什麼反序列化延遲,並在包裝​​的構造函數中的GetValue()調用沒有發生?

回答

2

我試圖挖的Deserialize方法有點不找出它的確切如何實現的。

看來它會首先運行ISerializable的代碼實現。一旦所有的自定義代碼完成,它將反序列化所有自動序列化的對象(如示例中的MyClassWithNVC類)。

如果你讓MyClassWithNVC繼承自ISerializable那麼它會運行你自定義的反序列化代碼,並且在包裝器解串器方法中MyClass.NVC不是NULL。

所以它不是具體行爲NameValueCollection,但它是自動序列化的任何財產。

+0

@Mikael:謝謝你的回覆。這仍然很奇怪。爲什麼在GetValue()調用期間不會處理這兩種序列化?我也無法重現與其他課程相同的行爲,但我會繼續嘗試。 – 2010-02-22 21:41:06

+1

啊,算出來。關鍵是NameValueCollection實現的IDeserializableCallback。因此,這個問題可以與任何收集(或對象)一樣重現。向頁面底部的更多細節在這裏:http://msdn.microsoft.com/en-us/library/ms973893.aspx – 2010-02-23 18:51:54

+0

MSDN文檔似乎擁有一切,如果我們只是讀得夠近:)感謝您的鏈接到那個頁面。我也有點聰明。 – 2010-02-23 20:51:37

相關問題