«یا اللهُ یا رَبِّ یا حَیُّ یا قَیّوم یا ذَالجَلالِ وَ الاکرام اَسئَلُکَ بِاسمِکَ اَلعَظیم اَلاَعظَم اَن تَرزُقَنی رِزقاً حَلالاً طَیِّباً بِرَحمَتِکَ الواسِعَه یا اَرحَمَ الرّاحِمِین.»
serialization و deserialization (سریالیزه کردن یا دی سریالیزه کردن) در سیشارپ و جاوا یعنی چه؟ :: گیم اور _ بازیسازی با unity + مطالب متفرقه

گیم اور _ بازیسازی با unity + مطالب متفرقه

آموزش های علمی با اجازه ی خدا تقدیم به هرکس خدا بخواد

آموزش های علمی با اجازه ی خدا تقدیم به هرکس خدا بخواد

به نام خدا
--
گروه قدیم ما promakers.ir یا پرومیکرز بود که بالای هزار اموزش توش ساخته بودم به اسم sajjad3011 ولی حیف ادمین سایتش عوض کرد
حالا سوالی بود کاری بود این شمارمه

قدیمیا دلم براتون تنگ شده... فقط معرفی کنید توی پیامک یا تماس یاد بیارید.
اگه جواب ندادم شاید موقعیت نداشته باشم.
بگید توی پیام از بچه های پرومیکرز هستید.

---
سوالی بود بذارید
نظر خصوصی نذارید
پاسخش سخته
دوست داشتید شماره بذارید تو واتساپ یا ایتا یا .... گروه بزنیم.
09358077198

بایگانی
پیوندها

gameover.blog.ir



با این امکان می تونیم یک ابجکت رو به صورت ترتیبی از byte ها نشون بدیم و یا بلعکس،ترتیبی از بایت ها رو به صورت شی در بیاریم.


serialization در جاوا

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

بعد از آن که یک شیء serialize شده در یک فایل نوشته شد، می تواند از فایل خوانده شده و 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 شدن نیست، باید توسط transient مشخص شود.

چنانچه کنجکاو هستید تا بدانید که یک کلاس استاندارد جاوا قابلیت 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

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

  • بلاک try/catch سعی میکند خطای ClassNotFoundException را کنترل کند، که توسط تابع readObject() تعریف شده است. برای یک JVM که بتواند یک شیء را deserialize کند، باید bytecode برای آن کلاس یافت شود. اگر JVM نتواند در طی deserialize کردن یک شیء، کلاس را پیدا کند، یک خطای ClassNotFoundException رخ خواهد داد.
  • توجه داشته باشید که مقدار بازگشتی readObject() به یک مرجع Employee، تبدیل (cast) شده است.
  • فیلد SSN هنگامی که شیء serialize شد دارای مقدار 11122333 بود، ولی از آنجایی که فیلد به صورت transient تعریف شده است، این مقدار به خروجی stream فرستاده نشد. فیلد SSN شیء deserialize شده Employee، مقدار 0 می باشد.

منبع:oruji.org


موافقین ۰ مخالفین ۰ ۹۵/۰۸/۲۵
مدیرکل

نظرات (۰)

هیچ نظری هنوز ثبت نشده است

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی