.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()調用沒有發生?
@Mikael:謝謝你的回覆。這仍然很奇怪。爲什麼在GetValue()調用期間不會處理這兩種序列化?我也無法重現與其他課程相同的行爲,但我會繼續嘗試。 – 2010-02-22 21:41:06
啊,算出來。關鍵是NameValueCollection實現的IDeserializableCallback。因此,這個問題可以與任何收集(或對象)一樣重現。向頁面底部的更多細節在這裏:http://msdn.microsoft.com/en-us/library/ms973893.aspx – 2010-02-23 18:51:54
MSDN文檔似乎擁有一切,如果我們只是讀得夠近:)感謝您的鏈接到那個頁面。我也有點聰明。 – 2010-02-23 20:51:37