سؤال

ولدي فئة maintans إشارة إلى جدول هاش ويسلسل / deserializes أن جدول هاش. بعد استدعاء SerializationInfo.GetValue، لا يتم إلغاء تسلسل في جدول هاش بالكامل لأن إلغاء التسلسل يحدث خلال calback IDeserialization.

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

وأنا أيضا تنفيذ الاستدعاء IDeserialization في الفئة الأصل، ولكن هناك أيضا من جدول هاش لا إلغاء تسلسل بشكل كامل حتى الان. كنت أتوقع أن يكون إذا كان إلغاء التسلسل يحدث من الداخل الى الخارج.

وسؤالي هو، هل هي آمنة للاتصال explicitely Hashtable.OnDeserialization من أسلوب OnDeserialization من الفئة الأصل بلدي، لذلك أستطيع أن أعدد الامر عند هذا الحد؟

public virtual void OnDeserialization(object sender)
{
    hashtable.OnDeserialization(sender);
}
هل كانت مفيدة؟

المحلول

وهذا هو في الحقيقة مسألة مثيرة للاهتمام. بعد التحقق من رمز التسلسل مع العاكس، وأعتقد أنه لا يوجد soluiton جيدة عموما إذا فئة المشار تستخدم IDeserializationCallback.

وربما رأيتم أن هناك نوعان من طرق أخرى، وكذلك لتشغيل بعض التعليمات البرمجية أثناء إلغاء التسلسل، و[OnDeserializing] و [OnDeserialized] سمات. Unfortuanately كل من يعمل قبل IDeserializationCallback.OnDeserialization (). هذا هو الترتيب المدى الطرق إذا كان لديك CLASS1 يشير إلى class2 بعد:

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

وكما ترون، و[OnDeserializing] و [OnDeserialized] سمات تعمل متناسقة، لكن الأساليب IDeserializationCallback لا حقا ...: (

ولقد راجعت أيضا تنفيذ OnDeserialization من جدول هاش وقاموس، وكلاهما يبدو أن تكون آمنة لاستدعاء OnDeserialization أكثر من مرة واحدة (فقط المكالمة الأولى وإجراء العملية اللازمة، سوف المكالمات اللاحقة تفعل شيئا).

وهكذا أخيرا يجب استدعاء OnDeserialization () من جدول هاش، و<لأ href = "http://clevercoder.wordpress.com/2006/11/30/hashtable-serialization-and-the-ideserializationcallback-interface/ "يختلط =" noreferrer "> اقترح شون و براين.

نصائح أخرى

وأظن كنت قد غوغليد بالفعل، ولكن حدث لي عبر <لأ href = "http://clevercoder.wordpress.com/2006/11/30/hashtable-serialization-and-the-ideserializationcallback-interface/" يختلط = "نوفولو noreferrer"> هذا نمط أمس.

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

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

}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top