خب اولین سوالی که در مورد مفهوم Serialization در جاوا برامون پیش میاد اینه که اصلا چی هست و کاربردش چیه؟!!!
Serialization مکانیزمی برای نوشتن و ذخیره شی در فایل است.
ما تا اینجا با روش نوشتن و ذخیره داده های کاراکتری،رشته ای،عدد صحیح و... در فایل آشنا شدیم در این اموزش قصد داریم روش ذخیره و نوشتن یک شی در فایل به زبان جاوا را بررسی کنیم. همچنین در ادامه به روش خواندن یک شی از فایل میپردازیم.
صرفا جهت یادگیری:
عمده استفاده از Serialization در تکنولوژی های Hibernate، RMI، JPA، EJB و JMS در جاوا است.
این تکنولوژی ها چی هستند و کاربردشون چیه رو کامل فراموش کنید بریم سراغ اصل مطلب یعنی Serialization.
Serialization
در Serialization همان طور که گفتیم یک شی را میتوانیم در یک فایل ذخیره کنیم. چگونه ؟! Serialization برای این کار شی ما را به جریانی (stream) از byte ها تبدیل کرده و در فایل ذخیره میکند. تصویر(1) را ببینید:
ی لحظه یک نفس عمیق بکشید!!!! کامل پشت پرده این که چطور یک شی را در فایل ذخیره میکنیم رو بی خیال شید!!! تنها اینو بدونید که مفهوم Serialization به ما کمک میکند که یک شی از نوع یک کلاس با تمام ویژگی ها و حالت هایی که دارد را مستقیم در یک فایل ذخیره کنیم. :-)
خب در زیر گام هایی که برای ذخیره یک شی در فایل بر میداریم رو بررسی میکنیم:
گام اول:
اینترفیس Serializable :
کلاسی که قصد داریم از آن شی ایجاد کنیم و شی ایجاد شده را در یک فایل ذخیره کنیم را باید implements به اینترفیس Serializable کنیم. به این کار اصطلاحا mark دار ( نشانه دار) کردن کلاسی که قصد داریم شی ای از نوع آن را در یک فایل ذخیره کنیم میگویند.
✔ برای implements کردن اینترفیس Serializable در کلاس خود باید پکیج java.io.Serializable را در برنامه خود import کنیم.
import java.io.Serializable; |
✔ اینترفیس Serializable اینترفیسی است که متد و اعضایی ندارد.
public abstract interface java.io.Serializable { } |
نتیجه گیری :
✔ در کل هر کلاسی که قصد داریم شی ای از آن در یک فایل ذخیره کنیم را باید implements به اینترفیس Serializable، کنیم.پس شی از نوع هر کلاسی را نمیتوانیمدر یک فایل ذخیره کنیم، تنها اشیایی را میتوانیم در فایل ذخیره کنیم که مجوزهای لازمیعنی پیاده سازی اینترفیس Serializable در کلاس آنها صورت گرفته باشد! :-) کهاین کار mark دار کردن کلاس میگویند.
مثال: فرض کنید قصد داریم شی ای از کلاس Student را در یک فایل ذخیره کنیم، برای این کار ابتدا باید کلاس Student را implements به اینترفیس Serializable ،کنیم. یا کلاس Student را به اصلاح mark دار کنیم: :-)
package www.javapro.ir;
public class Student implements Serializable{ |
✔ خب دیگه اشیایی که از نوع کلاس Student هستند، مجوز این که در فایل ذخیره شوند را دریافت کرده اند.
✔ با این کار اشیای نوع کلاس Student به راحتی میتوانند به جریانی (stream) از byte ها برای ذخیره در فایل تبدیل شوند.
گام دوم :
کلاس ObjectOutputStream :
در جلسات قبل برخی از کلاس های کار با فایل در جاوا را بررسی کردیم، کارایی اون کلاس ها تنها برای خواندن و نوشتن داده های اولیه نظیر بایت ها، رشته ها و... بود. حالا در این جلسه قصد داریم کلاس ObjectOutputStream که کاربرد آن برای نوشتن و ذخیره اشیا در فایل است را بررسی کنیم.
برای استفاده از کلاس ObjectOutputStream در برنامه خود باید پکیج java.io.ObjectOutputStream را import کنیم.
import java.io.ObjectOutputStream; |
💡 برای نوشتن و ذخیره یک شی در فایل باید از کلاس ObjectOutputStream شی ایجاد کنیمو از طریق شی ایجاد شده به متد هایی که در زمینه ذخیره شی در فایل کاربرد دارد دسرسی پیدا کنیم.
💡 تنها اشیایی حق دارند در فایل ذخیره شوند که کلاس های آنها implements به اینترفیس Serializable شده باشند.
سازنده کلاس ObjectOutputStream :
public ObjectOutputStream(OutputStream out) |
✔ یکی از سازنده های پر کاربردی که هنگام شی سازی از کلاس ObjectOutputStream صدا زده میشود.
✔ این سازنده به عنوان پارامتر یک شی از نوع کلاس OutputStream دریافت میکند که حاویآدرس مکانی است که قراره در آن فایل ایجاد شود.
دو متد مهم کلاس ObjectOutputStream :
1.
public final void writeObject(Object obj){} throws IOException |
• این متد برای ذخیره و نوشتن شی در فایل استفاده میشود.
• به جای پارامتر obj که از نوع کلاس Object (پدر همه کلاس ها) هستش، میتوان شی مورد نظر خود را قرار دهیم.
• استفاده از این متد ممکنه باعث رخ دادن استثنای مربوطه شود ،پس باید استثنای آن را کنترل کنیم.
2.
public void close() throws IOException {} |
✔ این متد نیز برای بستن فایل مورد نظر است.
✔ خب تا اینجا با شرایط و عملیاتی که از طریق آنها میتوانیم یک شی را در یک فایل ذخیره کنیم آشنا شدیم:
1. کلاسی که شی آن قراره در فایل ذخیره شود باید به اینترفیس Serializable، implements شود.
2. استفاده از کلاس ObjectOutputStream برای ذخیره اشیا در فایل.
مثال: در مثال زیر تمامی مفاهیمی که از ابتدای این جلسه تا اینجا را بررسی کردیم را بهش خواهیم
پرداخت،پس اصلا نگران نباشید اگه توضیحات روشن نبود به مثال زیر خوب دقت کنید: :-)
import java.io.Serializable; public class Student implements Serializable{ int id; String name; public Student(int id, String name) { this.id = id; this.name = name; } } |
• در مثال بالا ما کلاس Student را به اینترفیس Serializable، implements کرده ایم. با این کار
کلاس Student به اصلاح mark دار شده و اشیای ان اجازه خواهند داشت در فایل ذخیره شوند.
• خب کلاس Student سری ویژگی و یک سازنده داره که این ویژگی ها رو مقداردهی میکند.
حال در کلاس Persist قصد داریم از کلاس Student شی بسازیم و شی ان را در یک فایل ذخیره کنیم:
import java.io.*; class Persist{ public static void main(String args[]) throws Exception{ Student s1 =new Student(211,"ravi"); FileOutputStream fout=new FileOutputStream("f.txt"); ObjectOutputStream out=new ObjectOutputStream(fout); out.writeObject(s1); out.close(); System.out. print ln("success"); } } |
خروجی:
وقتی کلاس های Student و Persist را با هم کامپایل و اجرا کنیم خروجی بصورت زیر خواهد بود:
1. در کامپیوتر پوشه پروژمون یک فایل با نام و فرمت f.txt ایجاد میشود که حاوی یک شی از نوع کلاس Student است. فایل f.txt که در پوشه پروژمون ایجاد شده را در تصویر(2) مشاهده میکنید:
💡 در تصویر(2) انگار فایلمون مثل همیشه نیست!!! و یک تفاوت هایی با فایل های قبلی که درونشونداده های متنی و عددی بود داره!! بله فایل هایی که درون آنها یک شی ذخیره میشود، محتویات انهارا نمیشه دید!! و وقتی این گونه فایلهارا باز میکنیم با سری اطلاعات ظاهرا درهم بر همبرخورد میکنیم ( رنگ سبزه درون تصویر(2) ). این گونه فایل ها را فقط از طریقبرنامه و دستورات مربوطه میشود خواند و با چشم بصیرت تنها میشود دید :-)
2. در خروجی کنسول نیز پیام زیر مبنی بر موفق بودن عملیات ایجاد فایل نمایش داده میشود:
success |
نکته بسیار مهم : وقتی یک شی در یک فایل ذخیره میشود، تمام ویژگی و حالات شی نیز در فایل حفظ و ذخیره میشود. مثلا در این مثال شی s1 که از نوع Student هستش دو ویژگی name و id آن که به ترتیب “ravi” و 211 است ،هنگام ذخیره سازی شی s1 در فایل f.txt تمام این دو ویژگی در فایل ذخیره و حفظ میشود.
توضیحات:
• کلاس Student را که از قبل توضیح داده ایم.از آنجایی که قصد داریم شی از نوع این کلاس را در فایل ذخیره کنیم باید حتما کلاس Student به اینترفیس Serializable، implements شود.
• کلاس Persist در متد main ان یک شی با نام s1 از کلاس Student ایجاد کرده و سازنده ان را مقداردهی کرده ایم.
Student s1 =new Student(211,"ravi"); |
• برای نوشتن یک شی در فایل باید از کلاس ObjectOutputStream شی ایجاد کنیم. هنگام شی سازی از این کلاس، نیاز هست که پارامتر سازنده آن را مقدار دهی کنیم.همان طور که از قبل گفتیم نوع پارامتر سازنده کلاس ObjectOutputStream از نوع کلاس OutputStream هستش، از آنجایی که کلاس OutputStream یک کلاس abstract (انتزاعی) هستش، نمیتوان از ان شی ایجاد کنیم
پس تنها راهی که میماند از یکی از فرزندان کلاس OutputStream شی ساخته و جایگزین پارامتر درون سازنده کلاس OutputStream کنیم.
• پس همان طور که در زیر میبینید از کلاس FileOutputStream که فرزند کلاس OutputStream هستش شی ای با نام fout ساخته و درون سازنده کلاس ObjectOutputStream ریخته ایم.
• آدرس "f.txt"، ادرس محل ذخیره فایل در کامپیوتر که در اینجا پوشه پروژمون است.
• f نام فایل و txt فرمت فایل ما است.
• شی ما در این فایل ذخیره میشود.
FileOutputStream fout=new FileOutputStream("f.txt"); |
• در این خط شی s1 که از نوع کلاس Student هستش با استفاده از متد writerObject در فایل ذخیره میشود. به همین راحتی! :-)
out.writeObject(s1); |
• تنها اشیایی حق دارند در فایل ذخیره شوند که کلاس های آنها اینترفیس Serializable را implemets کرده باشند.
در پایان با استفاده از متد close فایل out را میبندیم و حالا یک پیامم چاپ میکنیم که یعنی عملیات با موفق بوده است :-)
out.close(); |
Deserialization در جاوا
Deserialization عکس عملیات و مفهوم serialization است. Deserialization جهت بازسازی و خواندن اشیا از فایل است. در Deserialization جریان بایت های ذخیره شده در فایل به شی تبدیل میشود. تصویر(3)
کلاس ObjectInputStream :
• این کلاس همان طور که از اسمش پیداست برای خواندن شی ذخیره شده در فایل است.
• برای استفاده از کلاس ObjectInputStream باید پکیج java.io.ObjectInputStream را در برنامه خود import کنیم:
import java.io.ObjectInputStream; |
...ادامه این جلسه آموزشی را میتوانید بصورت کتاب الکترونیکی (PDF شده) در لینک زیر دریافت کنید.
این جلسه آموزشی را بصورت کامل و مرتب شده در لینک زیر دانلود کنید:(در صورت خرابی لینک گزارش دهید)
لینک دانلود
بستن *نام و نام خانوادگی * پست الکترونیک * متن پیام |
دوره های آموزشی برنامه نویسی
انجام پروژه های برنامه نویسی
تدریس خصوصی برنامه نویسی
بیش از 7 سال از فعالیت جاواپرو میگذرد
جاواپرو دارای مجوز نشر دیجیتال از وزارت فرهنگ و ارشاد اسلامی است
جهت ارتباط مستقیم با جاواپرو در واتساپ و تلگرام :
09301904690