سؤال

أنا أبحث عن بعض التعليمات البرمجية الموجودة في مشروع أعمل عليه ، ووجدت فصلًا يتم تنفيذه على النحو التالي:

public class ThingOne
{
    private int A;

    private int B;

    [NonSerialized]
    private System.Timers.Timer timer1;
}

ألا ينبغي أن يبدو أكثر مثل هذا؟

[Serializable]
public class ThingOne
{
    private int A;

    private int B;

    [NonSerialized]
    private System.Timers.Timer timer1;
}

أم أن هناك بعض الفوائد الإضافية لإضافة [غير متخلف] حتى عندما يكون الفصل نفسه غير قابل للتسلسل؟

هل كانت مفيدة؟

المحلول

لن يكون له أي تأثير عندما لا يتم استخدام التسلسل. بشكل افتراضي ، فصول وأعضائها غير قابلة للتنظيم.

الميزة الوحيدة لإعلان شيء غير مؤهل عندما لا يتم تسلسل الفصل في ظل الظروف التي يرثها الفصل بواسطة كائن تسلسلي ، ثم سيكون العضو الموروثة غير قابل للتطبيق.

من MSDN:

لن تؤثر السمة "غير المعروفة" على هذا العضو لأن فئة الاحتواء لا تتعرض على أنها "قابلة للتسلسل".

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

نصائح أخرى

أم أن هناك بعض الفوائد الإضافية لإضافة [غير متخلف] حتى عندما يكون الفصل نفسه غير قابل للتسلسل؟

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

تذكر أنه يمكنك التحقق من السمات حسب الانعكاس أيضًا. قد لا يتم استخدامه من قبل وقت التشغيل للتحقق من ما ينبغي ولا ينبغي أن يتم تسلسله ، يمكن استخدامه كعلامة لشيء آخر في البرنامج الذي يتعامل مع نوع من التسلسل المخصص (أنا لا أقول أن هذه فكرة جيدة في الأقل).

أستطيع أن أفكر في سببين:

  1. قد يكون من الأهمية بمكان ألا يكون الحقل متسلسلًا. وبالتالي ، إذا تم تصنيع الفصل في المستقبل ، فلن يعرض هذا خطأً أو عدم الكفاءة أو الأمن ، لأنه بدون وجود مسلسل للصف ، سيقوم أيضًا بذلك في هذا المجال.

  2. يمكن أن يفعلوا نوعًا من الاستخدام المخصص للسمات

في الحالة الثانية ، سيكون من الواضح من مكان آخر في الكود أن هذا ما يحدث. الرقم 1 هو ممارسة جيدة رغم ذلك.

الحالة 1 هي ممارسة جيدة ، قد يكون من المفيد تحقيق التوازن بين yagni ("أنت لن تحتاج إلى ذلك" - عدم القيام بالعمل "في حال كان ذلك مطلوبًا لاحقًا") مع النظر في "حسنًا ، ولكن إذا كنت في حاجة إليها لاحقًا ، فسيكون ذلك سيؤدي إلى ذلك كن كارثة إذا فقد شخص ما أن هذا الحقل هو استثناء.

لذلك ، على الرغم من أنه ليس له أي تأثير هنا ، إلا أنه بالتأكيد ممارسة جيدة للسيناريوهات حيث تبدأ في أن يكون لها تأثير.

تحرير: احتمال آخر هو أنه هو Cruft من إصدار سابق حيث كان بالفعل مسلسلًا أو كان المؤلف في عقدين في ذلك الوقت ولم يكن "انتهى" بالكامل (هل تم الانتهاء من رمز العمل تمامًا؟). لمجرد أن هناك شيئًا ما في الكود ، لا يعني أنه كان من المفترض أن يكون بهذه الطريقة. ومع ذلك ، إذا كان من المهم حقًا ألا يتم تسلسل شيء ما ، ما زلت أقول أنه من الممارسات الجيدة وضع علامة على هذا للسبب الوارد أعلاه.

MSDN SerializeAttribute ينص على أنه "تطبيق سمة SerializableAttribute على نوع للإشارة إلى أنه يمكن تسلسل الحالات من هذا النوع." هذا يعني أنه بدونه ، لا يمكن تسلسل الفصل. أعتقد أنني حاولت ذلك وسوف يلقي التسلسل استثناء إذا تمت محاولته من نوع غير قابل للتالي.

وأنا أتفق مع جريج ، يقول MSDN ذلك بطريقة مماثلة ، مشيرًا إلى المراجع فكرة جيدة ..

"بشكل افتراضي ، فإن الفئات وأعضائها غير قابلة للتنظيم. لا يلزم سوى سمة غير متصلة بالاتصالات إذا لم يكن هناك تسلسل عضو في فئة قابلة للتسلسل."

http://msdn.microsoft.com/en-us/library/dwys85sk(vs.80).aspx

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