صافي ثنائي تسلسل الكائن مع إشارات إلى كائنات أخرى ...ماذا يحدث?

StackOverflow https://stackoverflow.com/questions/4905768

سؤال

إذا كان لديك مثيل كائن أ يشير إلى كائنات أخرى (على سبيل المثال المثيلات ب و ج), وأنت تسلسل ثنائي أ إلى ملف, ماذا يحدث?هل لديك الآن بيانات متسلسلة تتضمن أ, ب و ج?

كيف يعمل بالضبط?ماذا سأحصل إذا قمت بإلغاء تسلسل البيانات?ا, ب, وج??

(لا تتردد في تضمين تفسيرات الأعمال الداخلية كذلك).

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

المحلول

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

إذا كان أي من الفئات الأخرى الكائن الخاص بك يحمل إشارة إلى لم يتم وضع علامة مع [Serializable] السمة, ، ستحصل على SerializationException في وقت التشغيل (الصورة التي سرقت بلا خجل من الويب;أخطاء وقت التشغيل لا تبدو حتى مثل هذا بعد الآن في الإصدارات الحالية من فس):

    Example of an unhandled SerializationException

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

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

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

نصائح أخرى

أولاً ، يجب تمييز نوع الكائن "أ" بالسمة [Serializable].سيعمل التسلسل A على إجراء تسلسل لجميع بيانات أعضائه ، خاصة أو عامة ، شريطة أن يتم تمييز أنواع الأعضاء أيضًا بـ [Serializable] (أو لاستخدام مثالك ، بشرط أن يتم تمييز أنواع B و C بـ [Serializable]).محاولات تسلسل البيانات ، بشكل مباشر أو غير مباشر ، من نوع غير [Serializable] ستؤدي إلى استثناء.

تم بالفعل وضع علامة على عدد من أنواع .NET المضمنة على أنها [Serializable] ، بما في ذلك System.Int32 (int) ، System.Boolean (منطقي) ، إلخ.

يمكنك قراءة المزيد حول تسلسل .NET هنا: http:// msdn.microsoft.com/en-us/library/4abbf6k0.aspx .

يجب أن تكون الكائنات المشار إليها بواسطة الكائن الرئيسي [قابلة للتسلسل] أيضًا.يتم توفير كل ذلك تلقائيًا بواسطة المنسق.

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