JavaRush /جاوا بلاگ /Random-UR /جاوا میں سیریلائزیشن کیسے کام کرتی ہے۔
ramhead
سطح

جاوا میں سیریلائزیشن کیسے کام کرتی ہے۔

گروپ میں شائع ہوا۔
اس مضمون میں، ہم وضاحت کریں گے کہ سیریلائزیشن کیا ہے اور یہ جاوا میں کیسے کام کرتی ہے۔ جاوا میں سیریلائزیشن کیسے کام کرتی ہے - 1

تعارف

آبجیکٹ سیریلائزیشن ایک آبجیکٹ کی اپنی اور کسی بھی دوسری اشیاء کی مکمل کاپی کو ذخیرہ کرنے کی صلاحیت ہے جس کا حوالہ آؤٹ پٹ اسٹریم (مثال کے طور پر، ایک بیرونی فائل میں) ہے۔ اس طرح، ضرورت پڑنے پر تھوڑی دیر بعد سیریلائزڈ (محفوظ شدہ) کاپی سے آبجیکٹ کو دوبارہ بنایا جا سکتا ہے۔ آبجیکٹ سیریلائزیشن، ایک نئی خصوصیت جو JDK 1.1 میں متعارف کرائی گئی ہے، گروپوں یا انفرادی اشیاء کو بٹ اسٹریم یا بائٹ سرنی میں، اسٹوریج یا نیٹ ورک پر منتقل کرنے کے لیے ایک فنکشن فراہم کرتی ہے۔ اور جیسا کہ کہا گیا ہے، دی گئی بٹ سٹریم یا بائٹ اری کو جاوا آبجیکٹ میں واپس تبدیل کیا جا سکتا ہے۔ ObjectInputStreamیہ بنیادی طور پر اور کلاسز کی بدولت خود بخود ہوتا ہے ObjectOutputStream۔ پروگرامر Serializableکلاس بناتے وقت انٹرفیس کو لاگو کرکے اس فعالیت کو نافذ کرنے کا فیصلہ کرسکتا ہے۔ سیریلائزیشن کے عمل کو آبجیکٹ مارشلنگ کے نام سے بھی جانا جاتا ہے ، جبکہ ڈی سیریلائزیشن کو غیر مارشلنگ کے نام سے جانا جاتا ہے ۔ سیریلائزیشن ایک ایسا طریقہ کار ہے جو کسی آبجیکٹ کو اپنی اور دیگر تمام اشیاء کی ایک کاپی محفوظ کرنے کی اجازت دیتا ہے جس کا حوالہ آبجیکٹ کے ذریعہ ایک بیرونی فائل میں استعمال کیا جاتا ہے ObjectOutputStream۔ JFrameمحفوظ کردہ آبجیکٹ ڈیٹا سٹرکچر، ڈایاگرام، کلاس آبجیکٹ ، یا کوئی اور آبجیکٹ ہو سکتے ہیں ، چاہے ان کی قسم کچھ بھی ہو۔ ایک ہی وقت میں، سیریلائزیشن اس بارے میں معلومات کو اسٹور کرتی ہے کہ کوئی چیز کس قسم کی ہے تاکہ بعد میں، جب ڈی سیریلائز کیا جائے، تو اس معلومات کا استعمال اس چیز کی صحیح قسم کو دوبارہ بنانے کے لیے کیا جاتا ہے۔ لہذا، سیریلائزیشن مندرجہ ذیل صلاحیتوں کو فراہم کرتا ہے:
  • اشیاء کو ذخیرہ کرنے کا نظام، یعنی: ان کی خصوصیات کو کسی بیرونی فائل، ڈسک یا ڈیٹا بیس میں محفوظ کرنا۔
  • ریموٹ طریقہ کار کال سسٹم۔
  • ایک آبجیکٹ ڈسٹری بیوشن سسٹم، مثال کے طور پر، سافٹ ویئر کے اجزاء جیسے COM، COBRA میں۔
  • وقت کے ساتھ متغیر ڈیٹا میں تبدیلیوں کی نشاندہی کرنے کا نظام۔
سیریلائزیشن کے تصور کو مکمل طور پر سمجھنے کے لیے، آپ کو دوسرے دو تصورات — آبجیکٹ پرسسٹینس اور تھریڈ پرسٹینس کی واضح تفہیم کی ضرورت ہے۔ یہاں ہم یاد رکھنے کے لیے ان میں سے ہر ایک کے بارے میں تھوڑی بات کریں گے۔ ان کی مکمل وضاحت کے لیے ان تصورات میں سے ہر ایک کے لیے ایک الگ باب کی ضرورت ہوگی۔

سلسلے:

ہر پروگرام کو اپنا ڈیٹا سٹوریج کے مقام یا پائپ پر لکھنا چاہیے، اور ہر پروگرام کو پائپ یا سٹوریج کے مقام سے ڈیٹا پڑھنا چاہیے۔ جاوا میں، یہ چینل جہاں پروگرام لکھتے ہیں اور جن سے پروگرام ڈیٹا پڑھتے ہیں انہیں Streams ( Stream) کہا جاتا ہے ۔ جاوا میں سیریلائزیشن کیسے کام کرتی ہے - 2
تصویر 1. تھریڈز کی گرافیکل نمائندگی
ندیوں کو بنیادی طور پر دو اقسام میں تقسیم کیا گیا ہے:
  • بائٹ اسٹریم کلاسز جنہیں *اسٹریمز کہتے ہیں۔
  • کریکٹر اسٹریم کلاسز جنہیں *ریڈر اور * رائٹر کہتے ہیں۔
ہر ڈیٹا لکھنے کے سلسلے میں لکھنے کے طریقوں کا ایک سیٹ ہوتا ہے۔ اور اس کے مطابق ہر ڈیٹا ریڈنگ تھریڈ میں پڑھنے کے طریقوں کا ایک ہی سیٹ ہوتا ہے۔ ایک بار تھریڈ بن جانے کے بعد ان تمام طریقوں کو بلایا جانا چاہیے۔

استقامت

آبجیکٹ استقامت کسی شے کی زندہ رہنے کی صلاحیت ہے یا دوسرے لفظوں میں، کسی پروگرام کے عمل کو "زندہ رہنے" کے لیے۔ اس کا مطلب ہے کہ کوئی بھی شے جو رن ٹائم پر بنائی گئی تھی اسے JVM سکیوینجر کے ذریعے تباہ کر دیا جاتا ہے جب بھی وہ چیز استعمال نہیں ہوتی ہے۔ لیکن اگر استقامت API کو لاگو کیا جاتا ہے تو، یہ اشیاء JVM سکیوینجر کے ذریعہ تباہ نہیں ہوں گی، اس کے بجائے انہیں "رہنے" کی اجازت دی جائے گی، جو اگلی بار ایپلیکیشن لانچ ہونے پر ان تک رسائی ممکن بناتی ہے۔ دوسرے لفظوں میں، استقامت کا مطلب ہے کہ کسی شے کے لیے زندگی بھر ہے، اس ایپلی کیشن کی زندگی سے آزاد جو چل رہی ہے۔ استقامت کو لاگو کرنے کا ایک طریقہ یہ ہے کہ کسی بیرونی فائل یا ڈیٹا بیس میں اشیاء کو کہیں اسٹور کیا جائے، اور پھر بعد میں ان فائلوں یا ڈیٹا بیس کو بطور ذرائع استعمال کرتے ہوئے انہیں بحال کیا جائے۔ یہ وہ جگہ ہے جہاں سیریلائزیشن کھیل میں آتی ہے۔ جب تک JVM چل رہا ہے کوئی بھی غیر مستقل چیز موجود ہے۔ سیریلائزڈ آبجیکٹ صرف وہ اشیاء ہیں جنہیں اسٹریمز میں تبدیل کیا جاتا ہے، جو پھر ایک بیرونی فائل میں محفوظ کی جاتی ہیں یا اسٹوریج اور ریکوری کے لیے نیٹ ورک پر منتقل کی جاتی ہیں۔

سیریلائز ایبل انٹرفیس کا نفاذ

java.io.Serializableکسی بھی کلاس کو اس کلاس کی اشیاء کو سیریلائز کرنے کے لیے ایک انٹرفیس کو لاگو کرنا چاہیے ۔ انٹرفیس Serializableکا کوئی طریقہ نہیں ہے اور صرف کلاس کو نشان زد کرتا ہے تاکہ اسے سیریلائز کے طور پر شناخت کیا جاسکے۔ سیریلائزڈ کلاس آبجیکٹ کے صرف فیلڈز کو محفوظ کیا جاسکتا ہے۔ طریقے یا کنسٹرکٹرز کو سیریلائزڈ سٹریم کے حصے کے طور پر محفوظ نہیں کیا جاتا ہے۔ اگر کوئی آبجیکٹ کسی دوسرے آبجیکٹ کے حوالے کے طور پر کام کرتا ہے، تو اس آبجیکٹ کے فیلڈز کو بھی سیریلائز کیا جاتا ہے اگر اس چیز کی کلاس انٹرفیس کو لاگو کرتی ہے Serializable۔ دوسرے الفاظ میں، اس طرح حاصل کردہ اس شے کا گراف مکمل طور پر سیریلائز ہے۔ آبجیکٹ گراف میں کسی شے کے کھیتوں کا درخت یا ڈھانچہ اور اس کے ذیلی آبجیکٹ شامل ہوتے ہیں۔ دو اہم کلاسیں جو انٹرفیس کو لاگو کرنے میں مدد کرتی ہیں Seriliazable:
  • ObjectInputStream
  • ObjectOutputStream
فہرست سازی 1۔ سیریلائزیشن دکھانے کے لیے ایک سادہ کلاس کی مثال
import java.io.*;
public class RandomClass implements Serializable {
 // Генерация рандомного значения
 private static int r() {
        return (int)(Math.random() * 10);
 }
    private int data[];
    // Конструктор
public RandomClass() {
        datafile = new int[r()];
        for (int i=0; i<datafile.length; i++)
        datafile[i]=r();
 }
    public void printout() {
 System.out.println("This RandomClass has "+datafile.length+" random integers");
 for (int i=0; i<datafile.length; i++) {
        System.out.print(datafile[i]+":");
        System.out.println();
    }
}
مندرجہ بالا کوڈ میں، ایک کلاس بنائی گئی ہے جو سیریلائز ہے کیونکہ سیریلائزیشن انٹرفیس کے ذریعہ "نشان زد"۔ کلاس بے ترتیب انٹیجرز کی ایک صف بناتی ہے جب اس کی مثال بنائی جاتی ہے۔ نیچے دیا گیا کوڈ اس کا استعمال کرتے ہوئے سٹریم پر اشیاء لکھنے کی صلاحیت کو ظاہر کرتا ہے ObjectOutputStream۔ پروگرام میں عدد کی ایک صف ہے، لیکن سیریلائزیشن کے لیے ہمیں اس کی اندرونی اشیاء پر اعادہ کرنے کی ضرورت نہیں ہے۔ انٹرفیس Seriliazableخود بخود اس کا خیال رکھتا ہے۔ فہرست سازی 2۔ فائل میں آؤٹ پٹ کے لیے آبجیکٹ کو سیریلائز کرنے کی ایک سادہ مثال
import java.io.*;
import java.util.*;
public class OutSerialize {
    public static void main (String args[]) throws IOException {
        RandomClass rc1 = new RandomClass();
        RandomClass rc2 = new RandomClass();
//создание цепи потоков с потоком вывода an object в конце
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("objects.dat"));
        Date now = new Date(System.currentTimeMillis());
//java.util.* был импортирован для использования класса Date
        out.writeObject(now);
        out.writeObject(rc1);
        out.writeObject(rc2);
out.close();
        System.out.println("I have written:");
System.out.println("A Date object: "+now);
        System.out.println("Two Group of randoms");
rc1.printout();
rc2.printout();
 }
}
نیچے دیا گیا کوڈ کلاس کی صلاحیتوں کو ظاہر کرتا ہے ObjectInputStream، جو ایک بیرونی فائل سے سیریلائزڈ ڈیٹا کو پروگرام میں پڑھتا ہے۔ نوٹ کریں کہ اشیاء کو اسی ترتیب میں پڑھا جاتا ہے جس میں وہ فائل میں لکھے گئے تھے۔ فہرست سازی 3۔ سیریلائزڈ اشیاء کو پڑھنا یا ڈیسیریلائز کرنا
import java.io.*;
import java.util.*;
public class InSerialize {
 public static void main (String args[]) throws  IOException, ClassNotFoundException {
    ObjectInputStream in =  new ObjectInputStream (new FileInputStream("objects.dat"));
 Date d1 = (Date)in.readObject();
 RandomClass rc1 = (RandomClass)in.readObject();
    RandomClass rc2 = (RandomClass)in.readObject();
    System.out.println("I have read:");
    System.out.println("A Date object: "+d1);
    System.out.println("Two Group of randoms");
    rc1.printout();
rc2.printout();
 }
}
تقریباً تمام جاوا کلاسز کو سیریلائز کیا جا سکتا ہے، بشمول AWT کلاسز۔ ایک فریم، جو ایک ونڈو ہے، گرافیکل اجزاء کا ایک سیٹ پر مشتمل ہے۔ اگر فریم کو سیریلائز کیا جاتا ہے، تو سیریلائزیشن انجن اس کا خیال رکھتا ہے اور اس کے تمام اجزاء اور ڈیٹا (پوزیشن، مواد وغیرہ) کو سیریلائز کرتا ہے۔ کچھ جاوا کلاس آبجیکٹ کو سیریلائز نہیں کیا جا سکتا ہے کیونکہ ان میں ڈیٹا ہوتا ہے جو عارضی آپریٹنگ سسٹم کے وسائل کا حوالہ دیتا ہے۔ مثال کے طور پر کلاسز java.io.FileInputStreamاور java.lang.Thread. اگر کسی آبجیکٹ میں غیر سیریلائز ایبل عناصر کے حوالہ جات شامل ہیں، تو سیریلائزیشن کا پورا عمل ناکام ہو جائے گا اور ایک استثناء دیا جائے گا NotSerializableException۔ اگر کوئی شے کسی غیر سیریلائزڈ آبجیکٹ کا حوالہ دیتی ہے، تو اسے عارضی مطلوبہ لفظ کا استعمال کرتے ہوئے سیریلائز کیا جا سکتا ہے ۔ فہرست سازی 4۔ عارضی مطلوبہ الفاظ کا استعمال کرتے ہوئے سیریلائز ایبل اشیاء بنانا
public class Sclass implements Serializable{
public transient Thread newThread;
//помните, что поток(поток параллельного исполнения) по умолчанию не сериализуемый класс
    private String studentID;
    private int sum;
}

سیریلائزیشن میں سیکیورٹی

جاوا میں کلاس کو سیریلائز کرنے میں اس کے تمام ڈیٹا کو ایک اسٹریم کے ذریعے کسی بیرونی فائل یا ڈیٹا بیس میں منتقل کرنا شامل ہے۔ ہم جب چاہیں اس ڈیٹا کو محدود کر سکتے ہیں جسے سیریلائز کیا جائے گا۔ ایسا کرنے کے دو طریقے ہیں:
  • عارضی کے طور پر اعلان کردہ ہر کلاس پیرامیٹر کو سیریلائز نہیں کیا جاتا ہے (بطور ڈیفالٹ، تمام کلاس پیرامیٹر سیریلائز ہوتے ہیں)
  • یا، کلاس کا ہر پیرامیٹر جسے ہم سیریلائز کرنا چاہتے ہیں ایک ٹیگ کے ساتھ نشان زد ہوتا ہے Externalizable(بطور ڈیفالٹ، کوئی پیرامیٹر سیریلائز نہیں ہوتا)۔
ایک ڈیٹا فیلڈ کو سیریلائز نہیں کیا جائے گا ObjectOutputStream، جب کسی آبجیکٹ پر کال کی جاتی ہے، اگر اس آبجیکٹ کے ڈیٹا فیلڈ کو عارضی طور پر نشان زد کیا جاتا ہے ۔ مثال کے طور پر: private transient String password. دوسری طرف، کسی آبجیکٹ کے ڈیٹا کو سیریلائز کے طور پر واضح طور پر قرار دینے کے لیے، ہمیں کلاس کو اس چیز کے ڈیٹا کو ExternalizablewriteExternalواضح طور پر readExteranlلکھنے اور پڑھنے کے طور پر نشان زد کرنا چاہیے۔

نتیجہ

آبجیکٹ سیریلائزیشن کی خصوصیت کو ڈیٹا کی منتقلی کے طریقے کے طور پر بہت سے تقسیم شدہ نظاموں میں استعمال کیا جاتا ہے۔ لیکن سیریلائزیشن پوشیدہ تفصیلات کو ظاہر کرتی ہے، اس طرح تجریدی ڈیٹا کی قسموں کی صداقت کو تباہ کر دیتا ہے، جس کے نتیجے میں انکیپسولیشن تباہ ہو جاتی ہے۔ ایک ہی وقت میں، یہ جان کر خوشی ہوئی کہ سیریلائزڈ آبجیکٹ کا ڈیٹا وہی ڈیٹا ہے جو اصل، اصل آبجیکٹ میں تھا۔ ObjectInputValidationیہ ایک انٹرفیس کو نافذ کرنے اور طریقہ کو اوور رائڈ کرنے کا بھی ایک بہترین موقع ہے validateObject()، چاہے کوڈ کی متعدد لائنیں استعمال کی جائیں۔ اگر اعتراض نہیں ملتا ہے، تو ہم مناسب طریقے سے استثناء پھینک سکتے ہیں InvalidObjectException۔ اصل مضمون: جاوا میں سیریلائزیشن کیسے کام کرتی ہے۔
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION