اس مضمون میں، ہم وضاحت کریں گے کہ سیریلائزیشن کیا ہے اور یہ جاوا میں کیسے کام کرتی ہے۔
تصویر 1. تھریڈز کی گرافیکل نمائندگی
ندیوں کو بنیادی طور پر دو اقسام میں تقسیم کیا گیا ہے:
تعارف
آبجیکٹ سیریلائزیشن ایک آبجیکٹ کی اپنی اور کسی بھی دوسری اشیاء کی مکمل کاپی کو ذخیرہ کرنے کی صلاحیت ہے جس کا حوالہ آؤٹ پٹ اسٹریم (مثال کے طور پر، ایک بیرونی فائل میں) ہے۔ اس طرح، ضرورت پڑنے پر تھوڑی دیر بعد سیریلائزڈ (محفوظ شدہ) کاپی سے آبجیکٹ کو دوبارہ بنایا جا سکتا ہے۔ آبجیکٹ سیریلائزیشن، ایک نئی خصوصیت جو JDK 1.1 میں متعارف کرائی گئی ہے، گروپوں یا انفرادی اشیاء کو بٹ اسٹریم یا بائٹ سرنی میں، اسٹوریج یا نیٹ ورک پر منتقل کرنے کے لیے ایک فنکشن فراہم کرتی ہے۔ اور جیسا کہ کہا گیا ہے، دی گئی بٹ سٹریم یا بائٹ اری کو جاوا آبجیکٹ میں واپس تبدیل کیا جا سکتا ہے۔ObjectInputStream
یہ بنیادی طور پر اور کلاسز کی بدولت خود بخود ہوتا ہے ObjectOutputStream
۔ پروگرامر Serializable
کلاس بناتے وقت انٹرفیس کو لاگو کرکے اس فعالیت کو نافذ کرنے کا فیصلہ کرسکتا ہے۔ سیریلائزیشن کے عمل کو آبجیکٹ مارشلنگ کے نام سے بھی جانا جاتا ہے ، جبکہ ڈی سیریلائزیشن کو غیر مارشلنگ کے نام سے جانا جاتا ہے ۔ سیریلائزیشن ایک ایسا طریقہ کار ہے جو کسی آبجیکٹ کو اپنی اور دیگر تمام اشیاء کی ایک کاپی محفوظ کرنے کی اجازت دیتا ہے جس کا حوالہ آبجیکٹ کے ذریعہ ایک بیرونی فائل میں استعمال کیا جاتا ہے ObjectOutputStream
۔ JFrame
محفوظ کردہ آبجیکٹ ڈیٹا سٹرکچر، ڈایاگرام، کلاس آبجیکٹ ، یا کوئی اور آبجیکٹ ہو سکتے ہیں ، چاہے ان کی قسم کچھ بھی ہو۔ ایک ہی وقت میں، سیریلائزیشن اس بارے میں معلومات کو اسٹور کرتی ہے کہ کوئی چیز کس قسم کی ہے تاکہ بعد میں، جب ڈی سیریلائز کیا جائے، تو اس معلومات کا استعمال اس چیز کی صحیح قسم کو دوبارہ بنانے کے لیے کیا جاتا ہے۔ لہذا، سیریلائزیشن مندرجہ ذیل صلاحیتوں کو فراہم کرتا ہے:
- اشیاء کو ذخیرہ کرنے کا نظام، یعنی: ان کی خصوصیات کو کسی بیرونی فائل، ڈسک یا ڈیٹا بیس میں محفوظ کرنا۔
- ریموٹ طریقہ کار کال سسٹم۔
- ایک آبجیکٹ ڈسٹری بیوشن سسٹم، مثال کے طور پر، سافٹ ویئر کے اجزاء جیسے COM، COBRA میں۔
- وقت کے ساتھ متغیر ڈیٹا میں تبدیلیوں کی نشاندہی کرنے کا نظام۔
سلسلے:
ہر پروگرام کو اپنا ڈیٹا سٹوریج کے مقام یا پائپ پر لکھنا چاہیے، اور ہر پروگرام کو پائپ یا سٹوریج کے مقام سے ڈیٹا پڑھنا چاہیے۔ جاوا میں، یہ چینل جہاں پروگرام لکھتے ہیں اور جن سے پروگرام ڈیٹا پڑھتے ہیں انہیں Streams (Stream
) کہا جاتا ہے ۔
- بائٹ اسٹریم کلاسز جنہیں *اسٹریمز کہتے ہیں۔
- کریکٹر اسٹریم کلاسز جنہیں *ریڈر اور * رائٹر کہتے ہیں۔
استقامت
آبجیکٹ استقامت کسی شے کی زندہ رہنے کی صلاحیت ہے یا دوسرے لفظوں میں، کسی پروگرام کے عمل کو "زندہ رہنے" کے لیے۔ اس کا مطلب ہے کہ کوئی بھی شے جو رن ٹائم پر بنائی گئی تھی اسے JVM سکیوینجر کے ذریعے تباہ کر دیا جاتا ہے جب بھی وہ چیز استعمال نہیں ہوتی ہے۔ لیکن اگر استقامت API کو لاگو کیا جاتا ہے تو، یہ اشیاء JVM سکیوینجر کے ذریعہ تباہ نہیں ہوں گی، اس کے بجائے انہیں "رہنے" کی اجازت دی جائے گی، جو اگلی بار ایپلیکیشن لانچ ہونے پر ان تک رسائی ممکن بناتی ہے۔ دوسرے لفظوں میں، استقامت کا مطلب ہے کہ کسی شے کے لیے زندگی بھر ہے، اس ایپلی کیشن کی زندگی سے آزاد جو چل رہی ہے۔ استقامت کو لاگو کرنے کا ایک طریقہ یہ ہے کہ کسی بیرونی فائل یا ڈیٹا بیس میں اشیاء کو کہیں اسٹور کیا جائے، اور پھر بعد میں ان فائلوں یا ڈیٹا بیس کو بطور ذرائع استعمال کرتے ہوئے انہیں بحال کیا جائے۔ یہ وہ جگہ ہے جہاں سیریلائزیشن کھیل میں آتی ہے۔ جب تک JVM چل رہا ہے کوئی بھی غیر مستقل چیز موجود ہے۔ سیریلائزڈ آبجیکٹ صرف وہ اشیاء ہیں جنہیں اسٹریمز میں تبدیل کیا جاتا ہے، جو پھر ایک بیرونی فائل میں محفوظ کی جاتی ہیں یا اسٹوریج اور ریکوری کے لیے نیٹ ورک پر منتقل کی جاتی ہیں۔سیریلائز ایبل انٹرفیس کا نفاذ
java.io.Serializable
کسی بھی کلاس کو اس کلاس کی اشیاء کو سیریلائز کرنے کے لیے ایک انٹرفیس کو لاگو کرنا چاہیے ۔ انٹرفیس Serializable
کا کوئی طریقہ نہیں ہے اور صرف کلاس کو نشان زد کرتا ہے تاکہ اسے سیریلائز کے طور پر شناخت کیا جاسکے۔ سیریلائزڈ کلاس آبجیکٹ کے صرف فیلڈز کو محفوظ کیا جاسکتا ہے۔ طریقے یا کنسٹرکٹرز کو سیریلائزڈ سٹریم کے حصے کے طور پر محفوظ نہیں کیا جاتا ہے۔ اگر کوئی آبجیکٹ کسی دوسرے آبجیکٹ کے حوالے کے طور پر کام کرتا ہے، تو اس آبجیکٹ کے فیلڈز کو بھی سیریلائز کیا جاتا ہے اگر اس چیز کی کلاس انٹرفیس کو لاگو کرتی ہے Serializable
۔ دوسرے الفاظ میں، اس طرح حاصل کردہ اس شے کا گراف مکمل طور پر سیریلائز ہے۔ آبجیکٹ گراف میں کسی شے کے کھیتوں کا درخت یا ڈھانچہ اور اس کے ذیلی آبجیکٹ شامل ہوتے ہیں۔ دو اہم کلاسیں جو انٹرفیس کو لاگو کرنے میں مدد کرتی ہیں Seriliazable
:
ObjectInputStream
ObjectOutputStream
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
۔ اصل مضمون: جاوا میں سیریلائزیشن کیسے کام کرتی ہے۔
GO TO FULL VERSION