JavaRush /مدونة جافا /Random-AR /لماذا نستخدم SerialVersionUID داخل فئة Serializable في Ja...
0xFF
مستوى
Донецк

لماذا نستخدم SerialVersionUID داخل فئة Serializable في Java

نشرت في المجموعة
Serializationويظل SerialVersionUIDدائمًا لغزًا للعديد من مطوري Java. كثيرًا ما أرى أسئلة حول ما هو SerialVersionUIDأو ماذا يحدث إذا لم أعلن SerialVersionUIDفي Serializableصفي؟ لماذا نستخدم SerialVersionUID داخل فئة Serializable في Java - 1بصرف النظر عن كونه مربكًا ونادر الاستخدام، هناك سبب آخر لهذا السؤال وهو التحذير المفقود لـ Eclipse IDE SerialVersionUID، على سبيل المثال: " لا يعلن عميل الفئة القابلة للتسلسل عن حقل SerialVersionUID نهائي ثابتSerializable من Customerالنوع SerialVersionUIDالطويل " في هذه المقالة، لن تتعلم أساسيات Java فحسب SerialVersionUID، بل ستتعلم أيضًا تأثيرها على عملية التسلسل وإلغاء التسلسل. عند الإعلان عن فئة ما، كما هو الحال Serializableمن خلال تنفيذ واجهة رمز مميز java.io.Serializable، يقوم وقت تشغيل Java بتخزين مثيل لتلك الفئة على القرص باستخدام آلية التسلسل الافتراضية ما لم تقم بتكوين العملية لاستخدام الواجهة القابلة للخارج . أثناء عملية التسلسل، يقوم وقت تشغيل Java بإنشاء رقم إصدار للفئة بحيث يمكن إلغاء تسلسلها لاحقًا. في Java، يُعرف رقم الإصدار هذا باسم SerialVersionUID. إذا SerialVersionUIDلم يكن هناك أي تطابق أثناء عملية إلغاء التسلسل، فستخرج العملية مع استثناء InvalidClassExceptionفي المجرى " main" java.io.InvalidClassExceptionوستطبع أيضًا اسم الفئة وما يقابله من SerialVersionUID. الحل السريع لإصلاح هذه المشكلة هو نسخها SerialVersionUIDوتعريفها كنوع ثابت private static final longفي صفك. في هذه المقالة، سنتعرف على سبب وجوب استخدام SerialVersionUIDJava وكيفية استخدام أداة serialver JDK لإنشاء هذا المعرف. إذا كنت جديدًا في مجال التسلسل، فيمكنك أيضًا مشاهدة أفضل 10 أسئلة في مقابلة تسلسل Java لتقييم معرفتك والعثور على الثغرات في فهمك لمزيد من القراءة. مثل Concurrency(التزامن) و Multi-threading(تعدد الخيوط)، Serialization(التسلسل) موضوع آخر يستحق القراءة عدة مرات.

لماذا نستخدم SerialVersionUID في Java

كما قلت، عندما لا نحدد قيمة SerialVersionUIDكما هو static final longالحال في فئتنا، فإن آلية التسلسل ستقوم بذلك نيابةً عنا. هذه الآلية حساسة للعديد من التفاصيل، بما في ذلك مجالات الفصل الخاص بك، ومعدلات الوصول الخاصة بهم، والواجهات التي تنفذها، وحتى تطبيقات المترجم المختلفة؛ أي تغييرات في الفصل أو استخدام مترجم مختلف قد تؤدي إلى نتيجة مختلفة، SerialVersionUIDوالتي سوف تؤدي في النهاية إلى إيقاف إعادة تحميل البيانات المتسلسلة. من الخطر الاعتماد على آلية التسلسل في Java لإنشاء هذا المعرف، ولهذا السبب من الجيد تعريفه بشكل صريح SerialVersionUIDفي الفئة القابلة للتسلسل . أوصي بشدة بقراءة كتاب Java الكلاسيكي - Joshua Bloch "Effective Java" لفهم تسلسل Java ومشاكل التعامل معها بشكل غير صحيح. بالمناسبة، يوفر JDK أيضًا أداة serialverموجودة في دليل bin لدليل JAVA_HOME على جهاز الكمبيوتر الخاص بي، C:\Program Files\Java\jdk1.6.0_26\bin\serialver.exe ، والتي يمكن استخدامها لإنشاء SerialVersionUIDللفصول القديمة . يعد هذا مفيدًا جدًا في حالة قيامك بإجراء تغييرات على الفصل الدراسي الخاص بك مما يؤدي إلى كسر التسلسل وكان تطبيقك غير قادر على إعادة تحميل المثيلات المتسلسلة. يمكنك بسهولة استخدام هذه الأداة المساعدة لإنشاء SerialVersionUIDمثيلات قديمة، ثم استخدامها بشكل صريح من خلال الإعلان عن الحقل باعتباره خاصًا ثابتًا نهائيًا طويلًا SerialVersionUID . بالمناسبة، يوصى بشدة لأسباب تتعلق بالأداء والأمان باستخدام التنسيق الثنائي العادي للتسلسل؛ مرة أخرى، يحتوي "Effective Java" على عدة فقرات توضح مزايا التنسيق العادي بقدر كبير من التفصيل.

كيفية استخدام الأداة المساعدة serialver JDK لإنشاء SerialVersionUID

يمكنك استخدامها serialverلإنشاء SerialVersionUIDالفصول الدراسية. وهذا مفيد بشكل خاص لتطوير الفئات؛ حيث تعود الأداة SerialVersionUIDبتنسيق سهل النسخ. يمكنك استخدام serialverالأداة المساعدة JDK كما هو موضح في المثال:
$ serialver
use: serialver [-classpath classpath] [-show] [classname...]
$ serialver -classpath . Hello
Class Hello is not Serializable.
$ serialver -classpath . Hello
Hello: static final long SerialVersionUID = -4862926644813433707L;
يمكنك أيضًا استخدام الأداة المساعدة كأمر serialver، سيؤدي هذا إلى فتح مفتش يأخذ اسم الفئة بالكامل ويعرضه . GUI$ serialver –showserial versionSerial version

ملخص

الآن نحن نعرف ما هو SerialVersionUIDولماذا من المهم الإعلان عنه في Serializableفئة، حان الوقت لمراجعة بعض الحقائق المهمة المتعلقة بـ Java SerialVersionUID.
  1. SerialVersionUIDيستخدم للإشارة إلى إصدار البيانات المتسلسلة.

  2. عندما لا نعلن SerialVersionUIDفي فصلنا، فإن وقت تشغيل Java يقوم بذلك نيابةً عنا، ولكن هذه العملية حساسة للعديد من البيانات التعريفية للفئة بما في ذلك عدد الحقول ونوع الحقول ومعدلات الوصول إلى الحقول والواجهات التي يتم تنفيذها في الفصل وما إلى ذلك. يمكنك العثور على المعلومات الدقيقة في وثائق التسلسل من Oracle.

  3. يوصى بإعلان SerialVersionUID كمتغير طويل نهائي وثابت خاص لتجنب الآلية الافتراضية. بعض معرفات IDE، مثل Eclipse ، تصدر أيضًا تحذيرات إذا نسيت ذلك، على سبيل المثال: "لا يعلن عميل الفئة القابلة للتسلسل عن حقل SerialVersionUID النهائي الثابت من النوع الطويل." . على الرغم من أنه يمكنك تعطيل هذا التحذير بالانتقال إلى Window > Preferences > Java > Compiler > Errors/Warnings > Potential Programming Issues، إلا أنني أقترح عدم القيام بذلك. فقط عندما لا تكون هناك حاجة لاستعادة البيانات، يمكنني أن أكون مهملاً حيال ذلك. إليك ما يبدو عليه هذا الخطأ في Eclipse IDE، كل ما عليك فعله هو اتخاذ القرار السريع الأول. لماذا نستخدم SerialVersionUID داخل فئة Serializable في Java - 2

  4. يمكنك أيضًا استخدام الأداة المساعدة serialver من JDK لإنشاء إصدار تسلسلي للفئات في Java. تحتوي الأداة المساعدة أيضًا على واجهة المستخدم الرسومية، والتي يتم تمكينها عند تمرير المعلمة - show.

  5. أفضل الممارسات في التسلسل هي الإعلان بشكل صريح SerialVersionUID، لتجنب أي مشاكل في إلغاء التسلسل، خاصة إذا كنت تعمل مع تطبيق خادم العميل الذي يعتمد على البيانات المتسلسلة، مثل RMI.
كل شيء عن SerialVersionUIDجافا. الآن نحن نعرف سبب أهمية التصريح بشكل صحيح SerialVersionUIDفي الفصل. يمكنك شكر IDE الخاص بك على هذا التذكير، والذي قد يؤدي إلى كسر عملية إلغاء التسلسل لفصلك. إذا كنت تريد قراءة المزيد عن التسلسل والمفاهيم ذات الصلة، يمكنك أيضًا الاطلاع على هذه المقالات الرائعة. الأصلي هنا
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION