JavaRush /وبلاگ جاوا /Random-FA /چرا از SerialVersionUID در کلاس Serializable در جاوا استف...
0xFF
مرحله
Донецк

چرا از SerialVersionUID در کلاس Serializable در جاوا استفاده کنیم؟

در گروه منتشر شد
Serializationو SerialVersionUIDهمیشه برای بسیاری از توسعه دهندگان جاوا یک رمز و راز باقی می ماند. من اغلب سؤالاتی در مورد اینکه چه چیزی است می بینم یا اگر در کلاس خود SerialVersionUIDاعلام نکنم چه اتفاقی می افتد ؟ جدا از اینکه گیج کننده است و به ندرت مورد استفاده قرار می گیرد، دلیل دیگری برای این سوال اخطار گمشده Eclipse IDE است ، به عنوان مثال: " مشتری کلاس Serializable یک فیلد نهایی SerialVersionUID ثابت از نوع طولانی " اعلام نمی کند . در این مقاله نه تنها با اصول اولیه جاوا آشنا می شوید بلکه تاثیر آن بر روند سریال سازی و سریال زدایی را نیز خواهید آموخت. وقتی کلاسی را اعلام می‌کنید، مانند اجرای یک رابط نشانه ، زمان اجرا جاوا نمونه‌ای از آن کلاس را با استفاده از مکانیسم سریال‌سازی پیش‌فرض ذخیره می‌کند، مگر اینکه فرآیند را برای استفاده از رابط Externalizable پیکربندی کنید . در طول سریال‌سازی، زمان اجرا جاوا یک شماره نسخه برای کلاس ایجاد می‌کند تا بتواند بعداً آن را deserialize کند. در جاوا این شماره نسخه با نام . اگر در حین deserialization هیچ تطبیقی ​​وجود نداشته باشد، آنگاه فرآیند با یک استثنا در جریان " " خارج می شود و همچنین نام کلاس و متن مربوطه را چاپ می کند . یک راه حل سریع برای رفع این مشکل این است که آن را به عنوان یک ثابت نوع در کلاس خود کپی و تعریف کنید . در این مقاله با چرایی استفاده در جاوا و نحوه استفاده از ابزار JDK سریال برای تولید این شناسه آشنا خواهیم شد. اگر در سریال سازی تازه کار هستید، می توانید 10 سوال برتر مصاحبه سریال سازی جاوا را نیز تماشا کنید تا دانش خود را ارزیابی کرده و برای مطالعه بیشتر، شکاف هایی در درک خود پیدا کنید. مانند (همراهی) و (چند نخ) (سریال سازی) موضوع دیگری است که شایسته چندین بار مطالعه است. SerialVersionUIDSerializableچرا از SerialVersionUID در کلاس Serializable در جاوا - 1 استفاده کنیدSerialVersionUIDSerializableCustomerSerialVersionUIDSerialVersionUIDSerializablejava.io.SerializableSerialVersionUIDSerialVersionUIDInvalidClassExceptionmainjava.io.InvalidClassExceptionSerialVersionUIDSerialVersionUIDprivate static final longSerialVersionUIDConcurrencyMulti-threadingSerialization

چرا از SerialVersionUID در جاوا استفاده کنیم؟

همانطور که گفتم، وقتی مقداری را SerialVersionUIDدر static final longکلاس خود تعریف نکرده‌ایم، مکانیسم سریال‌سازی این کار را برای ما انجام می‌دهد. این مکانیزم به جزئیات زیادی از جمله فیلدهای کلاس شما، اصلاح کننده های دسترسی آنها، رابط هایی که پیاده سازی می کند و حتی پیاده سازی های مختلف کامپایلر حساس است؛ هر گونه تغییر در کلاس یا استفاده از یک کامپایلر متفاوت ممکن است نتیجه متفاوتی ایجاد کند SerialVersionUIDکه در نهایت نتیجه متفاوتی خواهد داشت. از بارگذاری مجدد داده های سریالی جلوگیری کنید. تکیه بر مکانیسم سریال سازی جاوا برای تولید این شناسه خطرناک است، به همین دلیل است که ایده خوبی است که آن را به صراحت در کلاس SerializableSerialVersionUID خود تعریف کنید . خواندن جاوا کلاسیک - Joshua Bloch "Effective Java" را برای درک سریال سازی جاوا و مشکلات مدیریت نادرست آنها به شدت توصیه می کنم. به هر حال، JDK همچنین ابزاری را ارائه می دهد که در فهرست bin دایرکتوری JAVA_HOME در رایانه من قرار دارد، C:\Program Files\Java\jdk1.6.0_26\bin\serialver.exe که می تواند برای تولید استفاده شود. برای کلاس های قدیمی این بسیار مفید است در صورتی که تغییراتی در کلاس خود ایجاد کرده اید که سریال سازی را به هم می زند و برنامه شما قادر به بارگیری مجدد نمونه های سریالی نیست. می‌توانید به راحتی از این ابزار برای ایجاد نمونه‌های قدیمی استفاده کنید و سپس با اعلام فیلد به‌عنوان طولانی استاتیک خصوصی ، از آن صریحاً استفاده کنید . به هر حال، به دلایل عملکردی و امنیتی استفاده از فرمت باینری معمولی برای سریال سازی بسیار توصیه می شود؛ باز هم، "جاوا موثر" چندین پاراگراف دارد که مزایای فرمت معمولی را با جزئیات زیاد نشان می دهد. serialverSerialVersionUIDSerialVersionUID SerialVersionUID

نحوه استفاده از Serialver JDK Utility برای تولید 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 را مرور کنیم.
  1. SerialVersionUIDبرای نشان دادن نسخه داده های سریال استفاده می شود.

  2. وقتی در کلاس خود اعلان نمی کنیم SerialVersionUID، زمان اجرا جاوا این کار را برای ما انجام می دهد، اما این فرآیند به بسیاری از ابرداده های کلاس از جمله تعداد فیلدها، نوع فیلدها، اصلاح کننده های دسترسی به فیلد، رابط هایی که در کلاس پیاده سازی می شوند حساس است. و غیره می توانید اطلاعات دقیق را در اسناد سریال سازی از Oracle بیابید.

  3. توصیه می شود SerialVersionUID را به عنوان یک متغیر طولانی نهایی ثابت خصوصی برای جلوگیری از مکانیسم پیش فرض اعلام کنید. برخی از IDE ها، مانند Eclipse ، همچنین در صورت فراموش کردن این مورد، اخطارهایی صادر می کنند، به عنوان مثال: "کلاس Serializable Customer یک فیلد استاتیک نهایی SerialVersionUID از نوع طولانی را اعلام نمی کند." . اگرچه می توانید این هشدار را با رفتن به Window > Preferences > Java > Compiler > Errors/Warnings > Potential Programming Problems غیرفعال کنید، پیشنهاد می کنم این کار را انجام ندهید. فقط زمانی که بازیابی اطلاعات مورد نیاز نباشد می توانم در مورد آن بی توجه باشم. در اینجا این خطا در Eclipse IDE به نظر می رسد، تنها کاری که باید انجام دهید این است که اولین تصمیم سریع را بگیرید. چرا از SerialVersionUID در کلاس Serializable در جاوا - 2 استفاده کنید

  4. شما همچنین می توانید از ابزار سریال JDK برای تولید نسخه سریال برای کلاس ها در جاوا استفاده کنید. این ابزار همچنین دارای یک رابط کاربری گرافیکی است که هنگام ارسال پارامتر - فعال می شود show.

  5. بهترین روش در سریال سازی این است که صریحاً اعلام کنید SerialVersionUID، تا از هر گونه مشکلی در مورد سریال زدایی جلوگیری کنید، به خصوص اگر با یک برنامه کاربردی سرویس گیرنده-سرور کار می کنید که به داده های سریالی مانند RMI متکی است.
همه چیز در جاوا است SerialVersionUID. اکنون می دانیم که چرا بیان صحیح SerialVersionUIDدر کلاس مهم است. می‌توانید از IDE خود برای این یادآوری تشکر کنید، که به طور بالقوه می‌تواند سریال‌زدایی کلاس شما را بشکند. اگر می خواهید درباره سریال سازی و مفاهیم مرتبط بیشتر بخوانید، می توانید این مقالات عالی را نیز بررسی کنید. اصل اینجاست
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION