JavaRush /جاوا بلاگ /Random-SD /جاوا ۾ سيريلائيزيشن ڪيئن ڪم ڪري ٿي
ramhead
سطح

جاوا ۾ سيريلائيزيشن ڪيئن ڪم ڪري ٿي

گروپ ۾ شايع ٿيل
هن آرٽيڪل ۾، اسان وضاحت ڪنداسين ته سيريلائيزيشن ڇا آهي ۽ اهو جاوا ۾ ڪيئن ڪم ڪري ٿو. جاوا ۾ سيريلائيزيشن ڪيئن ڪم ڪري ٿي - 1

تعارف

آبجیکٹ سيريلائيزيشن هڪ شئي جي اها صلاحيت آهي ته هو پنهنجي پاڻ ۽ ڪنهن ٻئي شئي جي مڪمل ڪاپي محفوظ ڪري ان جو حوالو هڪ آئوٽ پٽ اسٽريم استعمال ڪندي (مثال طور، هڪ خارجي فائل ڏانهن). اهڙيءَ طرح، شيءِ کي سيريل ٿيل (محفوظ ٿيل) ڪاپي مان ٻيهر ٺاهي سگهجي ٿو ٿوري دير بعد جڏهن ضرورت هجي. آبجیکٹ سيريلائيزيشن، JDK 1.1 ۾ متعارف ٿيل هڪ نئين خاصيت، گروپن يا انفرادي شين کي تبديل ڪرڻ لاءِ هڪ فنڪشن مهيا ڪري ٿي، بٽ اسٽريم يا بائيٽ ايري ۾، اسٽوريج يا نيٽ ورڪ تي ٽرانسميشن لاءِ. ۽ جيئن چيو ويو آهي، هڪ ڏنل بٽ اسٽريم يا بائيٽ صف کي واپس جاوا آبجیکٹ ۾ تبديل ڪري سگھجي ٿو. ObjectInputStreamاهو خاص طور تي خودڪار طريقي سان ٿئي ٿو ۽ طبقن جي مهرباني ObjectOutputStream. پروگرامر هن فنڪشنلٽي کي لاڳو ڪرڻ جو فيصلو ڪري سگھي ٿو انٽرفيس کي لاڳو ڪندي Serializableڪلاس ٺاهڻ وقت. سيريلائيزيشن جي عمل کي آبجیکٹ مارشلنگ جي نالي سان پڻ سڃاتو وڃي ٿو ، جڏهن ته ڊيسيريلائيزيشن کي اڻ مارشلنگ طور سڃاتو وڃي ٿو . سيريلائيزيشن هڪ ميکانيزم آهي جيڪو هڪ اعتراض کي پنهنجي پاڻ ۽ ٻين سڀني شين جي ڪاپي محفوظ ڪرڻ جي اجازت ڏئي ٿو جيڪو انهي اعتراض جي حوالي سان هڪ خارجي فائل ڏانهن ObjectOutputStream. محفوظ ڪيل شيون ٿي سگهن ٿيون ڊيٽا ڍانچي، ڊاگرام، طبقاتي شيون JFrame، يا ٻيون شيون، انهن جي قسم کان سواءِ. ساڳي ئي وقت، سيريلائيزيشن معلومات کي ذخيرو ڪري ٿو ته ڪهڙي قسم جي شئي آهي، انهي ڪري بعد ۾، جڏهن ختم ڪيو ويو، اها معلومات استعمال ڪئي ويندي آهي ٻيهر ٺاهڻ لاءِ صحيح قسم جو اعتراض اهو هو. تنهن ڪري، سيريلائيزيشن هيٺ ڏنل صلاحيتون مهيا ڪري ٿي:
  • شين کي محفوظ ڪرڻ لاءِ هڪ سسٽم، يعني: انهن جي ملڪيتن کي خارجي فائل، ڊسڪ يا ڊيٽابيس ۾ محفوظ ڪرڻ.
  • ريموٽ پروسيس ڪال سسٽم.
  • هڪ اعتراض ورهائڻ وارو نظام، مثال طور، سافٽ ويئر اجزاء جهڙوڪ COM، COBRA.
  • وقت سان گڏ متغير ڊيٽا ۾ تبديلين جي سڃاڻپ لاء سسٽم.
سيريلائيزيشن جي تصور کي مڪمل طور تي سمجھڻ لاءِ، توھان کي ٻين ٻن تصورن جي واضع سمجھڻ جي ضرورت آھي- اعتراض جي تسلسل ۽ ڌاڳو تسلسل. هتي اسان کي ياد ڪرڻ لاء انهن مان هر هڪ جي باري ۾ ٿورو ڳالهائي ويندي. انهن جي مڪمل وضاحت لاءِ انهن مان هر هڪ لاءِ الڳ باب جي ضرورت پوندي.

وهڪرو:

هر پروگرام کي پنهنجي ڊيٽا کي اسٽوريج جي جڳهه يا پائپ تي لکڻ گهرجي، ۽ هر پروگرام کي پائپ يا اسٽوريج جي جڳهه کان ڊيٽا پڙهڻ گهرجي. جاوا ۾، اهي چينل جتي پروگرام لکن ٿا ۽ جن مان پروگرام ڊيٽا پڙهن ٿا انهن کي اسٽريم ( Stream) چئبو آهي . جاوا ۾ سيريلائيزيشن ڪيئن ڪم ڪري ٿي - 2
شڪل 1. موضوعن جي گرافڪ نمائندگي
وهڪرو بنيادي طور ٻن قسمن ۾ ورهايل آهن:
  • بائيٽ اسٽريم ڪلاسز جن کي *اسٽريمز سڏيو ويندو آهي
  • ڪيڪٽر اسٽريم ڪلاسز جن کي *ريڊر ۽ * رائٽر چئبو آهي
هر ڊيٽا لکڻ وارو وهڪرو لکڻ جي طريقن جو هڪ سيٽ تي مشتمل آهي. ۽ هر ڊيٽا پڙهڻ واري سلسلي، مطابق، پڙهڻ جي طريقن جو هڪ ساڳيو سيٽ آهي. هڪ دفعو ڌاڳو ٺهي ٿو، انهن سڀني طريقن کي سڏڻ گهرجي.

استقامت

آبجیکٹ استقامت هڪ اعتراض جي رهڻ جي صلاحيت آهي، يا ٻين لفظن ۾، هڪ پروگرام جي عمل کي "بقا" ڪرڻ لاء. هن جو مطلب آهي ته ڪنهن به شئي جيڪا رن ٽائم تي ٺاهي وئي هئي JVM اسڪواجر طرفان تباهه ٿي ويندي آهي جڏهن ته اهو اعتراض هاڻي استعمال نه ڪيو ويندو آهي. پر جيڪڏهن استقامت API تي عمل ڪيو وڃي ٿو، اهي شيون JVM اسڪينجر طرفان تباهه نه ڪيا ويندا، ان جي بدران انهن کي اجازت ڏني ويندي "رهجي"، جيڪا پڻ انهن کي رسائي حاصل ڪرڻ ممڪن بڻائي ٿي جڏهن ايندڙ وقت ايپليڪيشن شروع ٿيندي. ٻين لفظن ۾، استقامت جو مطلب اهو آهي ته ڪنهن شئي لاءِ هڪ حياتي آهي، جيڪا هلندڙ ايپليڪيشن جي زندگيءَ کان آزاد آهي. استقامت تي عمل ڪرڻ جو هڪ طريقو اهو آهي ته شين کي ڪنهن ٻاهرين فائل يا ڊيٽابيس ۾ محفوظ ڪيو وڃي، ۽ پوءِ انهن فائلن يا ڊيٽابيس کي ذريعن طور استعمال ڪندي انهن کي بعد ۾ بحال ڪيو وڃي. هي آهي جتي سيريلائيزيشن راند ۾ اچي ٿي. ڪو به غير مسلسل اعتراض موجود آهي جيستائين JVM هلائي رهي آهي. سيريلائيز شيون صرف شيون آهن جيڪي اسٽريمز ۾ تبديل ڪيون وينديون آهن، جيڪي پوءِ هڪ خارجي فائل ۾ محفوظ ڪيون وينديون آهن يا اسٽوريج ۽ بحالي لاءِ نيٽ ورڪ تي منتقل ڪيون وينديون آهن.

سيريلائيبل انٽرفيس جو نفاذ

ڪنهن به طبقي کي لازمي طور تي انٽرفيس کي لاڳو ڪرڻ گهرجي java.io.Serializableانهي طبقي جي شين کي ترتيب ڏيڻ لاءِ. انٽرفيس 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();
    }
}
مٿين ڪوڊ ۾، ھڪڙو ڪلاس ٺاھيو ويو آھي جيڪو serializable آھي ڇاڪاڻ ته "نشان ٿيل" سيريلائيزيشن انٽرفيس طرفان. ڪلاس بي ترتيب انٽيجرز جو هڪ صف ٺاهي ٿو جڏهن ان جو هڪ مثال ٺاهيو وڃي ٿو. هيٺ ڏنل ڪوڊ ڏيکاري ٿو ته شيون لکڻ جي صلاحيت کي استعمال ڪندي وهڪرو ڏانهن 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. پڙهڻ سيريلائيز شيون يا Deserializing
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. جيڪڏهن ڪو به اعتراض ڪنهن غير سيريل ٿيل اعتراض جي حوالي سان اشارو ڪري ٿو، ته پوء ان کي استعمال ڪندي ترتيب ڏئي سگهجي ٿو transient لفظ . لسٽنگ 4. ٽرانزينٽ ڪي ورڊ استعمال ڪندي سيريلائيزبل شيون ٺاهڻ
public class Sclass implements Serializable{
public transient Thread newThread;
//помните, что поток(поток параллельного исполнения) по умолчанию не сериализуемый класс
    private String studentID;
    private int sum;
}

سيريلائيزيشن ۾ سيڪيورٽي

جاوا ۾ هڪ طبقي کي ترتيب ڏيڻ ۾ شامل آهي ان جي سڀني ڊيٽا کي هڪ وهڪرو ذريعي خارجي فائل يا ڊيٽابيس ڏانهن منتقل ڪرڻ. اسان ڊيٽا کي محدود ڪري سگهون ٿا جيڪو سيريل ڪيو ويندو جڏهن اسان چاهيون ٿا. هن کي ڪرڻ جا ٻه طريقا آهن:
  • هر ڪلاس جي پيراميٽر کي ٽرانزينٽ قرار ڏنو ويو آهي سيريلائيز نه آهي (ڊفالٽ طور، سڀ ڪلاس پيراميٽر سيريل ٿيل آهن)
  • يا، ڪلاس جي هر پيٽرولر جنهن کي اسين سيريل ڪرڻ چاهيون ٿا، هڪ ٽيگ سان نشان لڳل آهي Externalizable(ڊفالٽ طور، ڪو به پيٽرول سيريل نه آهي).
ڊيٽا فيلڊ کي سيريل نه ڪيو ويندو ObjectOutputStream، جڏهن ڪنهن شئي تي سڏيو ويندو آهي، جيڪڏهن ان اعتراض جي ڊيٽا فيلڊ کي نشان لڳل آهي عارضي . مثال طور: private transient String password. ٻئي طرف، واضح طور تي ڪنهن شئي جي ڊيٽا کي سيريلائيبل قرار ڏيڻ لاءِ، اسان کي لازمي طور تي ڪلاس کي نشان لڳايو وڃي جيئن ExternalizablewriteExternalواضح طور تي readExteranlان اعتراض جي ڊيٽا کي لکڻ ۽ پڙهڻ.

نتيجو

آبجیکٹ سيريلائيزيشن جي خاصيت ڪيترن ئي ورهايل سسٽم ۾ ڊيٽا کي منتقل ڪرڻ جي طريقي جي طور تي استعمال ڪيو ويندو آهي. پر سيريلائيزيشن لڪيل تفصيلات کي ظاهر ڪري ٿو، اهڙيء طرح تجريدي ڊيٽا جي قسمن جي صداقت کي تباهه ڪري ٿو، جنهن جي نتيجي ۾ encapsulation کي تباهه ڪري ٿو. ساڳئي وقت، اهو ڄاڻڻ سٺو آهي ته سيريل ٿيل اعتراض جي ڊيٽا ساڳئي ڊيٽا آهي جيڪا اصل، اصلي اعتراض ۾ هئي. اهو پڻ هڪ بهترين موقعو آهي هڪ انٽرفيس کي لاڳو ڪرڻ ObjectInputValidation۽ هڪ طريقي کي ختم ڪرڻ جو validateObject()، جيتوڻيڪ ڪوڊ جون ڪيتريون ئي لائينون استعمال ٿيل آهن. جيڪڏهن اعتراض نه مليو آهي، ته پوء اسان هڪ استثنا مناسب طور تي اڇلائي سگهون ٿا InvalidObjectException. اصل مضمون: ڪيئن سيريلائيزيشن جاوا ۾ ڪم ڪري ٿي
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION