ما الفرق بين استخدام السمة المسلسل وتنفيذ غير قابلة للتطبيق؟
-
23-09-2019 - |
سؤال
ما الفرق بين استخدام Serializable
تنسب وتنفيذ ISerializable
واجهه المستخدم؟
المحلول
عندما تستخدم SerializableAttribute
السمة التي تضعها سمة على حقل في وقت الترجمة بطريقة في وقت التشغيل ، ستعرف المنشآت المتسلسل ما يجب أن تتصرف بناءً على السمات من خلال أداء الانعكاس على نوع الفئة/الوحدة/التجميع.
[Serializable]
public class MyFoo { … }
ما سبق يشير إلى أن المنشأة التسلسلية يجب أن يقوم بتسلسل الفئة بأكملها MyFoo
, ، بينما:
public class MyFoo
{
private int bar;
[Serializable]
public int WhatBar
{
get { return this.bar; }
}
}
باستخدام السمة ، يمكنك اختيار الحقول بشكل انتقائي التي يجب تسلسلها.
عند تنفيذ ISerializable
واجهه المستخدم, ، يتم تجاوز التسلسل بشكل فعال مع إصدار مخصص ، عن طريق تجاوز GetObjectData
و (ومن خلال توفير مُنشئ للنموذج SetObjectData
MyFoo(SerializationInfo info, StreamingContext context)
) ، سيكون هناك درجة الدقيقة من السيطرة على تسلسل البيانات.
أنظر أيضا هذا المثال للتسلسل المخصص هنا على stackoverflow. إنه يوضح كيفية الحفاظ على التسلسل متوافقًا مع الإصدارات المختلفة من البيانات المختلفة.
أتمنى أن يساعدك هذا.
نصائح أخرى
ال SerializableAttribute يرشد الإطار للقيام بعملية التسلسل الافتراضي. إذا كنت بحاجة إلى مزيد من التحكم ، يمكنك تنفيذ واجهة iserializable. ثم يمكنك وضع الكود الخاص بك لتسلسل الكائن في GetObjectData
الطريقة وتحديث SerializationInfo
كائن يتم تمريره إليه.
ال ISerializable
الواجهة تتيح لك التنفيذ التسلسل المخصص بخلاف الافتراضي. عند تنفيذ ISerializable
الواجهة ، عليك تجاوز GetObjectData
الطريقة على النحو التالي
public void GetObjectData (SerializationInfo serInfo,
StreamingContext streamContext)
{
// Implement custom Serialization
}
يجبرك iSerialize على تنفيذ منطق التسلسل سليًا ، في حين أن وضع علامة على السمة القابلة للتسلسل (هل كنت تقصد ذلك؟) سيخبر المسلسل الثنائي أن هذه الفئة يمكن تسلسلها. سوف تفعل ذلك تلقائيا.
يتيح لك الوراثة من iserializable تنفيذ التسلسل (DE) المخصص. عند استخدام السمة المتسلسلة فقط ، لا يمكن التحكم في تسلسل (DE) إلا عن طريق السمات وأقل مرونة.