تحليل خوارزمية تسلسل جافا
التسلسل هو عملية وصف كائن كسلسلة من البايتات؛ وإلغاء التسلسل هو عملية إعادة بناء هذه البايتات في كائن. توفر Java Serialization API آلية قياسية للتعامل مع تسلسل الكائنات. هنا يمكنك معرفة كيفية إجراء تسلسل لكائن ما، عندما يكون التسلسل مطلوبًا، ونستخدم خوارزمية تسلسل Java كمثال لتوضيح كيف تصف البايتات بعد التسلسل معلومات الكائن.
الحاجة إلى التسلسل
في Java، كل شيء هو كائن. في البيئة الموزعة، غالبًا ما يكون من الضروري نقل الكائنات من شبكة أو جهاز إلى آخر. وهذا يتطلب بروتوكولًا يمكنه نقل البيانات على كلا الطرفين. تم إنشاء آلية تسلسل Java لحل هذه المشكلة.
كيفية إجراء تسلسل للكائن
الشرط الأساسي لكي يكون الكائن قابلاً للتسلسل هو تنفيذ واجهة قابلة للتسلسل. لا تحتوي الواجهة القابلة للتسلسل على طرق وهي أشبه بالعلامة. يمكن معالجة الفئات التي تحمل هذه العلامة من خلال آلية التسلسل.
100.
تنسيق التسلسل للكائن
كيف يبدو الكائن بعد تسلسله؟ افتح ملف temp.out الذي قمنا للتو بتسلسل الكائن وإخراجه، وعرضه بالنظام الست عشري. يجب أن يكون المحتوى كما يلي:
73 74 A0 0C 34 00 FE B1 DD F9 02 00 02 42 00 05
63 6F 75 6E 74 42 00 07 76 65 72 73 69 6F 6E 78
70 00 64
إصدار البايت العام = 100؛
عدد البايتات العامة = 0؛
كلاهما من نوع البايت، من الناحية النظرية، هناك حاجة إلى 2 بايت فقط لتخزين هذين الحقلين، ولكن في الواقع يشغل temp.out 51 بايت، مما يعني أنه بالإضافة إلى البيانات، فإنه يتضمن أيضًا أوصافًا أخرى للكائن المتسلسل.
خوارزمية تسلسل جافا
تقوم خوارزمية التسلسل بشكل عام بالخطوات التالية:
◆بيانات تعريف فئة الإخراج المتعلقة بمثيلات الكائن.
◆ قم بإخراج وصف الطبقة الفائقة للفئة بشكل متكرر حتى لا يكون هناك المزيد من الفئات الفائقة.
◆بعد اكتمال البيانات التعريفية للفئة، يتم إخراج قيم البيانات الفعلية لمثيل الكائن بدءًا من الفئة الفائقة ذات المستوى الأعلى.
◆إخراج بيانات المثيل بشكل متكرر من الأعلى إلى الأسفل
دعونا نوضح بمثال آخر يغطي جميع المواقف المحتملة بشكل كامل:
تحتوي الفئة على أدوات قابلة للتسلسل {
int يحتوي على الإصدار = 11؛
}
يقوم SerialTest من الفئة العامة بتوسيع الأدوات الرئيسية Serializable {
نسخة كثافة العمليات = 66؛
تحتوي على يخدع = جديد يحتوي على ()؛
كثافة العمليات العامة getVersion () {
نسخة العودة؛
}
public static void main(String args[]) يلقي IOException {
FileOutputStream fos = new FileOutputStream("temp.out");
ObjectOutputStream oos = new ObjectOutputStream(fos);
SerialTest st = new SerialTest();
oos.writeObject(st);
oos.flush();
oos. Close();
}
}
التنسيق التسلسلي هو كما يلي:
أس إد 00 05 7372 00 0A 53 65 72 69 61 6C 54 65
73 74 05 52 81 5A التيار المتناوب 66 02 F6 02 00 0249 00 07
76 65 72 73 69 6F 6E4C00 03 63 6F 6E74 00 09
4C63 6F 6E 74 61 69 6E 3B 7872 00 06 70 61 72
65 6E 74 0E DB D2 دينار بحريني 85 EE 63 7A 02 00 0149 00
0 د 70 61 72 65 6 إي 74 56 65 72 73 69 6 ف 6 إي 78 70
0000000أ 0000004273 72 00 07 63 6F 6E 74
61 69 6E FC BB E6 0E FB CB 60 C7 02 00 0149 00
0E 63 6F 6E 74 61 69 6E 56 65 72 73 69 6F 6E 78
700000000ب
دعونا نلقي نظرة فاحصة على ما تمثله هذه البايتات. بداية، انظر اللون:
الخطوة الأولى في خوارزمية التسلسل هي إخراج وصف للفئة المرتبطة بالكائن. الكائن الموضح في المثال هو مثيل لفئة SerialTest، لذلك يتم إخراج وصف فئة SerialTest بعد ذلك. انظر الألوان:
بعد ذلك، تقوم الخوارزمية بإخراج أحد الحقول، inversion=66;
بعد ذلك، تقوم الخوارزمية بإخراج المجال التالي، con = new contain(); وهذا خاص بعض الشيء، وهو كائن. عند وصف مراجع نوع الكائن، تحتاج إلى استخدام تدوين توقيع الكائن القياسي لـ JVM، راجع اللون:
.ثم ستقوم الخوارزمية بإخراج وصف الفئة الفائقة، وهي الفئة الأصلية، انظر اللون:
بعد ذلك، قم بإخراج وصف المجال للفئة الأصلية، intparentVersion=100؛ انظر أيضًا اللون:
حتى الآن، قامت الخوارزمية بإخراج أوصاف جميع الفئات. الخطوة التالية هي إخراج القيمة الفعلية لكائن المثيل. في هذا الوقت، يبدأ من مجال الفصل الأصلي، راجع اللون:
هناك أيضًا حقول لفئة SerialTest:
البايتات التالية أكثر إثارة للاهتمام، تحتاج الخوارزمية إلى وصف معلومات فئة الاحتواء. تذكر أن فئة الاحتواء لم يتم وصفها بعد.
.أخرج وصف المجال الفريد للمحتوى، intcontainVersion=11;
في هذا الوقت، ستتحقق خوارزمية التسلسل مما إذا كان الاحتواء يحتوي على فئة فائقة، وإذا كان الأمر كذلك، فسوف يقوم بإخراجها.
أخيرًا، يتم إخراج قيمة المجال الفعلية لفئة الاحتواء.
حسنًا، لقد ناقشنا آلية ومبادئ تسلسل جافا، ونأمل أن يكون ذلك مفيدًا للطلاب.