سوال_مصاحبه_جاوا
درباره serialization در جاوا توضیح دهید، دلایل و مزایا استفاده از آن را بنویسید، آیا میتوان متغیرهای static را سریال کنیم؟ اگر اشیا را سریال سازی نکنیم چه اتفاقی می افتد؟ چگونه میتوان از سریال شدن فیلدی از کلاس جلوگیری کنیم؟ تفاوت رفتاری jvm هنگام deserialize کردن فیلدهای transient و static؟
جواب: زبان جاوا حاوی مکانیزمی ضروری به نام سریالیزه کردن اشیاء است که در این مکانیزم شی میتواند به صورت ترتیبی از بایت ها در فایلی با پسوند .ser ذخیره شود و مجدد با خواندن آن فایل و deserialize کردن آن، همان شی را در حافظه ساخت.این مکانیزم برای ماندگاری جسم استفاده میشود.
دو مورد از مزایا این مکانیزم: ذخیره آبجکت بر روی دیسک(فایل یا دیتابیس) - توانایی جابجایی آبجکت بر روی شبکه
اگر از سریاله کردن استفاده نکنیم هنگام پیمایش اطلاعات شی در یک شبکه به NotSerializableException برخورد میکنیم.
متغیرهای static چون وابسته به کلاس هستند نه به شی، بنابراین نمیتوان آنها را سریال کرد.
به دو طریق میتوان از سریال شدن فیلدها جلوگیری کرد، یک اینکه آنها static باشند ، دو اینکه اگر استاتیک نبودن ، قبلا آنها کلمه کلیدی transient قرار دهیم. تفاوت رفتاری jvm در deserialize کردن به این صورت هست که متغیرهای transient رو با مقدار پیش فرض مقداردهی میکند مثلا برای integer مقدار صفر میدهد ولی برای استاتیک ها همان مقداری که هنگام سریاله شدن داشت را میدهد.
در پایان:
فقط آبجکت ساخته شده از کلاس هایی که اینترفیس Serializable را پیاده سازی کرده اند، قابلیت سریاله شدن دارند.
اینترفیس serializable از نوع marker و نشانه گذار هستند و درون بدنه ی خود هیچ متودی ندارند و فقط برای الحاق قابلیت سریاله استفاده میشوند .
اگر یک کلاس سریاله شده باشد ، فرزندانش هم این ویژگی را به ارث میبرند ولی برعکس آن برقرار نیست.
در هنگام deserialize کردن ، متود_سازنده فراخوانی نمیشود.
کلاس های ObjectInputStream و ObjectOutputStream شامل متودهایی برای serialize و deserialze کردن شی هستند.