Serializable در جاوا

ناصر نادری | 1394/06/05


بنام خد .

امروز میخواییم در مورد 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 تعریف کردیم .

تا جلسه بعد در پناه حق ...


فایلهای ضمیمه
توجه! هیچ فایل ضمیمه ای برای این مطلب یافت نشد

نظرات شما نظر جدید