Serialization
ويظل
SerialVersionUID
دائمًا لغزًا للعديد من مطوري Java. كثيرًا ما أرى أسئلة حول ما هو
SerialVersionUID
أو ماذا يحدث إذا لم أعلن
SerialVersionUID
في
Serializable
صفي؟
بصرف النظر عن كونه مربكًا ونادر الاستخدام، هناك سبب آخر لهذا السؤال وهو التحذير المفقود لـ 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
في صفك. في هذه المقالة، سنتعرف على سبب وجوب استخدام
SerialVersionUID
Java وكيفية استخدام أداة 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 –show
serial version
Serial version
ملخص
الآن نحن نعرف ما هو
SerialVersionUID
ولماذا من المهم الإعلان عنه في
Serializable
فئة، حان الوقت لمراجعة بعض الحقائق المهمة المتعلقة بـ Java SerialVersionUID.
SerialVersionUID
يستخدم للإشارة إلى إصدار البيانات المتسلسلة.
- عندما لا نعلن
SerialVersionUID
في فصلنا، فإن وقت تشغيل Java يقوم بذلك نيابةً عنا، ولكن هذه العملية حساسة للعديد من البيانات التعريفية للفئة بما في ذلك عدد الحقول ونوع الحقول ومعدلات الوصول إلى الحقول والواجهات التي يتم تنفيذها في الفصل وما إلى ذلك. يمكنك العثور على المعلومات الدقيقة في وثائق التسلسل من Oracle.
- يوصى بإعلان SerialVersionUID كمتغير طويل نهائي وثابت خاص لتجنب الآلية الافتراضية. بعض معرفات IDE، مثل Eclipse ، تصدر أيضًا تحذيرات إذا نسيت ذلك، على سبيل المثال: "لا يعلن عميل الفئة القابلة للتسلسل عن حقل SerialVersionUID النهائي الثابت من النوع الطويل." . على الرغم من أنه يمكنك تعطيل هذا التحذير بالانتقال إلى Window > Preferences > Java > Compiler > Errors/Warnings > Potential Programming Issues، إلا أنني أقترح عدم القيام بذلك. فقط عندما لا تكون هناك حاجة لاستعادة البيانات، يمكنني أن أكون مهملاً حيال ذلك. إليك ما يبدو عليه هذا الخطأ في Eclipse IDE، كل ما عليك فعله هو اتخاذ القرار السريع الأول.
- يمكنك أيضًا استخدام الأداة المساعدة serialver من JDK لإنشاء إصدار تسلسلي للفئات في Java. تحتوي الأداة المساعدة أيضًا على واجهة المستخدم الرسومية، والتي يتم تمكينها عند تمرير المعلمة -
show
.
- أفضل الممارسات في التسلسل هي الإعلان بشكل صريح
SerialVersionUID
، لتجنب أي مشاكل في إلغاء التسلسل، خاصة إذا كنت تعمل مع تطبيق خادم العميل الذي يعتمد على البيانات المتسلسلة، مثل RMI.
كل شيء عن
SerialVersionUID
جافا. الآن نحن نعرف سبب أهمية التصريح بشكل صحيح
SerialVersionUID
في الفصل. يمكنك شكر IDE الخاص بك على هذا التذكير، والذي قد يؤدي إلى كسر عملية إلغاء التسلسل لفصلك. إذا كنت تريد قراءة المزيد عن التسلسل والمفاهيم ذات الصلة، يمكنك أيضًا الاطلاع على هذه المقالات الرائعة.
الأصلي
هنا
GO TO FULL VERSION