oruji.github.io
oruji.github.ioPersian Tutorials
ویرایش: 1396/11/13 19:09
A A

آموزش سریالیزه یا سریالایز (Serialization) در جاوا (Java)

زبان جاوا (Java) حاوی مکانیزمی به نام سریالیزه کردن یا serialization شیء است. در این مکانیزم یک شیء می تواند به صورت ترتیبی از بایت ها نمایش داده شود، که حاوی داده های شیء، اطلاعات مربوط به نوع شیء و انواع داده های ذخیره شده در آن می باشد.

بعد از آن که یک شیء سریالایز شده در یک فایل نوشته شد، می تواند از فایل خوانده شده و deserialize شود. اطلاعات مربوط به نوع شیء، بایت هایی که شیء را نمایش می دهند و همچنین داده های آن، می توانند برای ایجاد دوباره شیء در حافظه استفاده شوند.

نکته جالب این است که تمامی این پروسه، مستقل از JVM است، بدین معنا که یک شیء می تواند در یک پلتفرم serialize شود، و در یک پلتفرم کاملا متفاوت دیگر deserialize گردد.

کلاس های ObjectInputStream و ObjectOutputStream حاوی توابعی برای serialize و deserialize کردن یک شیء می باشند.

کلاس ObjectOutputStream حاوی توابع متعددی برای نوشتن انواع داده ها می باشد، ولی در اینجا یکی از این توابع به خصوص مد نظر است:

public final void writeObject(Object x) throws IOException

این تابع شیء بعدی را از خروجی stream بازیابی کرده و آن را deserialize می کند. مقدار خروجی این تابع شیء می باشد، بنابراین شما نیاز خواهید داشت آن را به نوع داده مناسب cast کنید.

برای شرح این که serialize کردن در جاوا چگونه کار میکند، میخواهیم آن را با مثال نشان دهیم. فرض کنید ما یک کلاس Employee همانند کد زیر داریم، که این کلاس اینترفیس Serializable را پیاده سازی (implement) کرده است:

public class Employee implements java.io.Serializable { public String name; public String address; public transient int SSN; public int number; public void mailCheck() { System.out.println("Mailing a check to " name " " address); } }

توجه داشته باشید که برای آن که یک کلاس به صورت موفقیت آمیز serialize گردد، دو شرط لازم است:

چنانچه کنجکاو هستید تا بدانید که یک کلاس استاندارد جاوا قابلیت سریالایز شدن را دارد یا خیر، مستندات مربوط به کلاس را بررسی کنید. فهمیدن آن ساده است: اگر کلاس java.io.Serializable را پیاده سازی کرده باشد، آنگاه آن کلاس قابلیت serialize شدن را دارد؛ در غیر اینصورت این قابلیت را نخواهد داشت.

Serialize کردن یک شیء:

کلاس ObjectOutputStream برای serialize کردن یک شیء استفاده شده است. برنامه SerializeDemo زیر یک شیء Employee تعریف کرده و آن را درون یک فایل serialize می نماید.

هنگامی که برنامه اجرا می شود، یک فایل با نام employee.ser ایجاد می شود. برنامه هیچگونه خروجی تولید نمی کند، ولی کد را خوانده و سعی کنید تعیین کنید که برنامه چه کاری انجام میدهد.

توجه: هنگامی که یک شیء در یک فایل serialize میشود، قرارداد استاندارد در جاوا بدین صورت است که فایل با پسوند .ser باشد.

import java.io.*; public class SerializeDemo { public static void main(String [] args) { Employee e = new Employee(); e.name = "Reyan Ali"; e.address = "Phokka Kuan, Ambehta Peer"; e.SSN = 11122333; e.number = 101; try { FileOutputStream fileOut = new FileOutputStream("/tmp/employee.ser"); ObjectOutputStream out = new ObjectOutputStream(fileOut); out.writeObject(e); out.close(); fileOut.close(); System.out.printf("Serialized data is saved in /tmp/employee.ser"); } catch(IOException i) { i.printStackTrace(); } } }

Deserialize کردن یک شیء:

برنامه DeserializeDemo که در زیر آمده است، شیء Employee ساخته شده در برنامه SerializeDemo را deserialize میکند. برنامه را مطالعه کرده و سعی کنید خروجی برنامه را مشخص کنید:

import java.io.*; public class DeserializeDemo { public static void main(String [] args) { Employee e = null; try { FileInputStream fileIn = new FileInputStream("/tmp/employee.ser"); ObjectInputStream in = new ObjectInputStream(fileIn); e = (Employee) in.readObject(); in.close(); fileIn.close(); } catch(IOException i) { i.printStackTrace(); return; } catch(ClassNotFoundException c) { System.out.println("Employee class not found"); c.printStackTrace(); return; } System.out.println("Deserialized Employee..."); System.out.println("Name: " e.name); System.out.println("Address: " e.address); System.out.println("SSN: " e.SSN); System.out.println("Number: " e.number); } }

خروجی برنامه:

Deserialized Employee... Name: Reyan Ali Address:Phokka Kuan, Ambehta Peer SSN: 0 Number:101

در اینجا چند نکته مهم را یادآور میشویم: