بنام خد .
امروز میخواییم در مورد Serializable در جاوا مطالبی
رو خدمت شما دوستان گرامی ارائه بدیم .
توی سایتهای مختلف مرجع انگلیسی زبان در مورد Serializable
در جاوا مطالبی بسیار کاملی رو میتونید پیدا کنید . توی این مقاله سعی کردم
با استفاده از این مراجع بصورت خلاصه مطالب قابل فهمی رو در اختیار تون قرار
بدم .
تعریف : اولا باید بدونیم Serialize کردن یعنی چی ؟ زمانی
که بخواهیم یک مجموع داده رو در هرشکلی و هرنوعی بصورت ترتیبی به خروجی خاصی
مثل فایل یا دستگاههای خروجی ارسال کنیم و یا از اونها دریافت کنیم نیاز به سریال
بندی یا Serialize کردن اون داده داریم . برای این منظور اون آبجکت یا داده رو توی
یک ظرف میریزیم بعد بعد از طریق متدهای مفید ظرف اون رو به فایل یا ورودی و
خروجی های مختلف میریزیم . بحث ما روی اون ظرف میانی واسط هست .
نکته : داده ها بصورت بایت به بایت سریال بندی میشن.
برای Serialize کردن داده ها داخل فایل باید از دو تا کلاس
ObjectInputStream و ObjectOutputStream به عنوان ظرف میانی استفاده کنیم .
این دو کلاس متدهای زیادی دارن که میتونن کار انتقال سریالی داده ها رو راحت کنن .
متد writeObject برای کلاس ObjectOutputStream عمل نوشتن
داخل خروجی (فایل ) رو انجام میده و متد readObject برای کلاس ObjectInputStream
عمل خواندن از فایل رو انجام میده .
برای استفاده از این تکنیک باید کلاسی داشته باشیم که از
اینترفیس java.io.Serializable ایمپلیمنت شده باشه :
public class Phone implements java.io.Serializable
{
public String name;
public String model;
public int Fee;
public transient int IME;
public void printRecord()
{
System.out.println("Name : " + name + " Model :" + model);
}
}
برای استفاده از این کلاس به شکل زیر عمل میکنیم :
public class SerializeExample {
public static void main(String[] args) {
// تعریف یک شی از نوع کلاس مورد نظر
Phone phone=new Phone();
phone.name = "Nokia";
phone.model = "Lumia820";
phone.Fee = 1250000;
phone.IME = 25698598;
try
{
//تعریف یک فایل خروجی
java.io.FileOutputStream fileOut = new java.io.FileOutputStream("/phones.ser");
//ریختن اطلاعات بصورت سریالی در فایل از طریق ظرف
java.io.ObjectOutputStream out = new java.io.ObjectOutputStream(fileOut);
out.writeObject(phone);
out.close();
fileOut.close();
System.out.printf("Serialized data is saved in /phones.ser");
}catch(java.io.IOException i)
{
i.printStackTrace();
}
}
}
دقت میکنید که از این طریق یک رکورد رو توی فایل
نوشتیم و حالا برای خوندن همین رکورد بصورت سریالی از طریق زیر عما میکنیم :
public static void main(String[] args) {
Phone phone = null;
try
{
//ایجاد فایل ورودی برای دریافت اطلاعات از فایل
java.io.FileInputStream fileIn = new java.io.FileInputStream("/phones.ser");
//ایجاد شی سریال برای خواندن رکورد اطلاعاتی از فایل
java.io.ObjectInputStream in = new java.io.ObjectInputStream(fileIn);
phone = (Phone) in.readObject();
in.close();
fileIn.close();
}catch(java.io.IOException i)
{
i.printStackTrace();
return;
}catch(ClassNotFoundException c)
{
System.out.println("Phone class not found");
c.printStackTrace();
return;
}
System.out.println("Deserialized Phone...");
System.out.println("Name: " + phone.name);
System.out.println("Model: " + phone.model);
System.out.println("Fee: " + phone.Fee);
System.out.println("Ime: " + phone.IME);//این مقدار در خروجی 0 خواهد بود چون از نوع transition بود
}
خاصیت Ime سریالایز نشده چراکه اون رو توی کلاس Phone
از نوع transtion تعریف کردیم .
تا جلسه بعد در پناه حق ...