2008-11-10 3 views
10

Hashtable'a bir referans veren ve Hashtable'ı serileştiren/serileştiren bir sınıfa sahibim. SerializationInfo.GetValue çağrıldıktan sonra Hashtable, seri hale getirme geri bildirimi sırasında seri hale getirildiğinden, tam olarak serileştirilmemiştir.Hashtable.OnDeserialization

Hashtable hashtable = (Hashtable) info.GetValue("hash", typeof(Hashtable)); 

Ben de üst sınıfta IDeserialization geri arama uyguladık ama orada çok Hashtable'a henüz tam serisi kaldırılan değildir. Desantizasyonun içeriden dışarı çıkması halinde olmasını beklerdim.

Sorum şu ki, Hashtable.OnDeserialization öğesini üst sınıfımın OnDeserialization yönteminden açık bir şekilde çağırmak güvenli midir, bu yüzden bu noktada numaralandırma yapabilirim?

public virtual void OnDeserialization(object sender) 
{ 
    hashtable.OnDeserialization(sender); 
} 
+0

Bu ilginç bir sorundur. Her zaman bazı sınır değerler belirleyebilir ve neler olduğunu görebilirsiniz. –

+0

Microsoft Connect ile sözlük genel koleksiyonunda benzer bir sorunla karşılaştım. Bunun bir hata olduğunu kabul ettiler. Doğrudan OnDeserialization'u denemedim, ancak her durumda işe yaramayacağından şüpheleniyorum. –

cevap

5

Bu gerçekten ilginç bir sorundur. Serileştirme kodunu Reflector ile kontrol ettikten sonra, referans verilen bir sınıf IDeserializationCallback kullanıyorsa genel olarak iyi bir çözümün olmadığını düşünüyorum.

Muhtemelen gördünüz ki, serileştirme sırasında bazı kodları çalıştırmak için iki farklı yol daha var: [OnDeserializing] ve [OnDeserialized] öznitelikleri. Talihsiz hem IDeserializationCallback.OnDeserialization() önce çalışır. Bu, bir Class2 atıfta sınıfı1 varsa yöntemlerin çalışma sırası: Gördüğünüz gibi

Class1: [OnDeserializing] 
Class2: [OnDeserializing] 
Class2: [OnDeserialized] 
Class1: [OnDeserialized] 
Class1: IDeserializationCallback.OnDeserialization 
Class2: IDeserializationCallback.OnDeserialization 

, [OnDeserializing] ve [OnDeserialized] nitelikler tutarlı çalışır ancak IDeserializationCallback yöntemleri pek değil. .. :(

Ayrıca, Hashtable ve Dictionary'in OnDeserialization uygulamasını kontrol ettim ve OnDeserialization'u birden çok kez çağırmak için güvenli görünüyor (sadece ilk arama gerekli işlemi gerçekleştirecek, sonraki çağrılar hiçbir şey yapmaz

Son olarak OnDeserialization() öğesini çağırmalısınız. Hashtable, Sean ve Brian'ın önerdiği gibi.

3

Ben zaten googled var ama dünkü this modeline karşı oldu sanıyorum.

public BoringClass(SerializationInfo info, StreamingContext context) 
{ 
    Hashtable hashtable = (Hashtable) info.GetValue("hash", typeof(Hashtable)); 
    hashtable.OnDeserialization(this); 

    Console.WriteLine("Value is: " + hashtable["testItem"]); 

} 
+0

İyi bir fikir, bu benim sahip olduğum benzer bir problemle yardımcı oluyor. Ancak OnDeserialization'un iki kez aramak için güvenli olduğundan emin olmalısınız. –