کانال بازی سازی تلگرام
serialization و deserialization (سریالیزه کردن یا دی سریالیزه کردن) در سیشارپ و جاوا یعنی چه؟ :: آموزش ساخت بازی اندروید+پکیج های تخصصی

آموزش ساخت بازی اندروید+پکیج های تخصصی

هرگز دل من ز علم محروم نشد
کم ماند ز اسرار که معلوم نشد
هفتاد و دو سال فکر کردم شب و روز
معلومم شد که هیچ معلوم نشد
---
تمام اعمالی که انجام می دهیم، حتی اگر ذره ای و مثقالی باشد، به خودمان باز می گردد و بازتابش آنها را در زندگی خواهیم دید. زلزال ۷
او کسی است که (روح) شما را در شب (به هنگام خواب) میگیرد; و از آنچه در روز کرده‏اید، با خبر است; سپس در روز شما را (از خواب) برمیانگیزد; و (این وضع همچنان ادامه مییابد) تا سرآمد معینی فرا رسد; سپس بازگشت شما به سوی اوست; و سپس شما را از آنچه عمل میکردید، با خبر میسازد. انعام ۶۰
دلها به یاد خدا آرام میگیرد. رعد آیه ۲۷
بدانید زندگی دنیا تنها بازی و سرگرمی، و تجمل پرستی و تفاخر در میان شما و افزون طلبی در اموال و فرزندان است . حدید آیه ۲۰
آن خدایی که آدمی را از خون بسته (که تحول نطفه است) بیافرید.
بخوان و (بدان که) پروردگار تو کریم‌ترین کریمان عالم است.
آن خدایی که بشر را علم نوشتن به قلم آموخت.
به آدمی آنچه را که نمی‌دانست تعلیم داد.
راستی که انسان سرکش و مغرور می‌شود.
چون که خود را در غنا و دارایی ببیند. علق ۲- ۷
این زندگانی چند روزه دنیا افسوس و بازیچه‌ای بیش نیست، عنکبوت ۶۴
در روی زمین به تکبر راه مرو که نمی توانی زمین را بشکافی و هرگز قامتت به بلندای کوهها نمی رسد. اسراء ۳۷
در آنچه خداوند بر تو بخشیده است، سرای آخرت را بجوی و سهم خود را از دنیا فراموش مکن و همانگونه که خدا به تو نیکی کرده است نیکی کن و هرگز فساد در زمین منما که خدا مفسدان را دوست ندارد. قصص ۷۷
و هرگاه نعمت و رحمتی به انسان بچشانیم و سپس آن را از او برگیریم او مأیوس و نومید میشود و به کفران و ناسپاسی بر میخیزد. هود ۹
بندگان مرا آگاه ساز که من بسیار آمرزنده و مهربانم. حجر ۴۹
از رحمت خدا نا امید مباشید که جز کافر هیچ کس از رحمت خدا نا امید نیست. یوسف ۸۷
پس به یاد من باشید تا به یاد شما باشم. بقره ۱۵۲
زندگانی دنیا چیزی جز متاع فریبنده نیست . آل عمران ۱۸۵
از آنچه به شما روزی داده ایم پیش از آنکه روزی فرا رسد که نه معامله ای وجود دارد و نه دوستی و شفاعت ، انفاق کنید. بقره ٢۴۵
بسا چیزی را ناخوش داشته باشید که آن به سود شماست و بسا چیزی را دوست داشته باشید که به زیان شماست، و خدا میداند و شما نمیدانید. بقره ۲۱۶
ما آیات (خود) را برای شما بیان کردیم شاید اندیشه کنید...حدید ۱۷

پیوندهای روزانه
پیوندها

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="">
تجدید کد امنیتی