سؤال

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

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

المحلول

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

  • غير فعالة ؛ إذا كان هناك الحقول التي تستخدم فقط في الكفاءة في التشغيل ، ولكن يمكن إزالتها عن التسلسل (على سبيل المثال ، القاموس قد تبدو مختلفة عند تسلسل)
  • غير فعالة ؛ حتى الحقول المطلوبة فإنه يحتاج إلى تضمين الكثير من بيانات شرحية إضافية ،
  • غير صحيح ؛ إذا كان هناك حقول لا يكون تسلسل (مثل المندوبين الحدث, على الرغم من أنها يمكن أن تكون علامة [NonSerialized])
  • هشة.الخاص بك التسلسل هو الآن لا بد أن المجال أسماء - ولكن الحقول من المفترض أن يكون التنفيذ من التفصيل ؛ انظر أيضا التشويش ، التسلسل و تنفذ تلقائيا خصائص

من خلال تنفيذ ISerializable يمكنك توفير الخاصة بك ثنائي آلية التسلسل.علما بأن xml ما يعادل هذا هو IXmlSerializable, كما تستخدم من قبل XmlSerializer الخ.

بالنسبة DTO الأغراض ، BinaryFormatter وينبغي تجنب الأشياء مثل xml (عبر XmlSerializer أو DataContractSerializer) أو json جيدة ، وكذلك عبر منصة صيغ مثل بروتوكول المخازن المؤقتة.

للتأكد من اكتمالها ، protobuf-صافي لا تشمل السنانير ISerializable (مما يتيح لك استخدام جهاز محمول تنسيق ثنائي دون كتابة الكثير من الكود) ولكن BinaryFormatter لن يكون خيارك الأول هنا على أي حال.

نصائح أخرى

الطبقات يمكن أن يكون تسلسل في .صافي في واحدة من طريقتين:

  1. بمناسبة الصف مع SerializableAttribute و تزيين جميع المجالات التي كنت لا تريد أن تكون مسلسلة مع NonSerialized السمة.(مثل مارك Gravell ، BinaryFormatter, والتي هي الطبقة التي تستخدم عادة على شكل ISerializable الكائنات تلقائيا يسلسل كل المجالات إلا أنها تحمل علامات خاصة على خلاف ذلك.)
  2. تنفيذ ISerializable واجهة مخصصة بالكامل التسلسل.

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

بخصوص هذا الأخير (ISerializable) و ذلك الاستخدام ، لقد نقلت من MSDN الصفحة للواجهة:

أي الدرجة التي قد يكون تسلسل يجب أن يتم وضع علامة مع SerializableAttribute.إذا فئة تحتاج إلى السيطرة على التسلسل العملية ، فإنه يمكن تنفيذ ISerializable واجهة.النظام المنسق يدعو GetObjectData في التسلسل الوقت و ملء زودت SerializationInfo مع جميع البيانات المطلوبة لتمثيل الكائن.فإن المنسق يخلق SerializationInfo مع نوع من الكائن في الرسم البياني.الكائنات التي تحتاج إرسال الوكلاء أنفسهم يمكن استخدام على FullTypeName و AssemblyName طرق على SerializationInfo إلى تغيير المعلومات المنقولة.

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

مع ISerializable يمكنك كتابة مخصص الطرق في وجوه الخاص بك للسيطرة على التسلسل عند القيام ثنائي التسلسل إلى تسلسل الأشياء الخاصة بك بطريقة مختلفة عما الافتراضي النهج المتبع من قبل BinaryFormatter سوف تفعل.

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

XmlSerialization بطبيعة الحال سوى استخدام خصائص ISerializable لا علاقة له مع XML التسلسل.

شكرا مارك البوب التعليقات كنت متسرعا قليلا في أول الجواب.

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

ويمكنك بعد ذلك يمكن أن يتخذ تمثيل تسلسل، نقله إلى سياق آخر مثل جهاز آخر، وإعادة بناء الكائن الأصلي.

عند تنفيذ واجهة ISerializable، يجب فئة توفر طريقة GetObjectData التي يتم تضمينها في الواجهة، وكذلك منشئ المتخصصة والمتخصصة لقبول معلمتين: مثيل SerializationInfo، ومثيل StreamingContext

إذا الفصول الدراسية لا تتطلب السيطرة غرامة الحبيبات الدولة هدفها، ثم هل يمكن أن مجرد استخدام السمة [Serializable]. الفئات التي تحتاج إلى مزيد من السيطرة على عملية التسلسل يمكن تنفيذ واجهة ISerializable.

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