JavaRush /جاوا بلاگ /Random-UR /جاوا میں سیریلائزیشن اور ڈی سیریلائزیشن

جاوا میں سیریلائزیشن اور ڈی سیریلائزیشن

گروپ میں شائع ہوا۔
ہیلو! آج کے لیکچر میں ہم جاوا میں سیریلائزیشن اور ڈی سیریلائزیشن کے بارے میں بات کریں گے۔ آئیے ایک سادہ مثال کے ساتھ شروع کرتے ہیں۔ مان لیں کہ آپ کمپیوٹر گیم کے خالق ہیں۔ اگر آپ 90 کی دہائی میں پلے بڑھے ہیں اور اس وقت کے گیم کنسولز کو یاد کرتے ہیں، تو آپ کو شاید معلوم ہوگا کہ آج ان میں کسی واضح چیز کی کمی تھی - گیمز کو محفوظ کرنا اور لوڈ کرنا :) اگر نہیں تو... تصور کریں! مجھے ڈر ہے کہ آج اس طرح کے موقع کے بغیر ایک کھیل ناکامی سے برباد ہو جائے گا! اور، اصل میں، ایک گیم "سیونگ" اور "لوڈنگ" کیا ہے؟ ٹھیک ہے، عام معنوں میں، ہم سمجھتے ہیں کہ یہ کیا ہے: ہم اس کھیل کو جاری رکھنا چاہتے ہیں جہاں سے ہم نے پچھلی بار چھوڑا تھا۔ ایسا کرنے کے لیے، ہم ایک قسم کا "چیک پوائنٹ" بناتے ہیں، جسے ہم پھر گیم لوڈ کرنے کے لیے استعمال کرتے ہیں۔ لیکن اس کا کیا مطلب ہے، روزمرہ کے معنی میں نہیں، بلکہ "پروگرامر" کے معنی میں؟ جواب آسان ہے: ہم اپنے پروگرام کی حالت کو بچاتے ہیں۔ مان لیں کہ آپ اسپین کے لیے حکمت عملی کا کھیل کھیل رہے ہیں۔ آپ کے کھیل کی ایک ریاست ہے: کون کون سے علاقوں کا مالک ہے، کس کے پاس کتنے وسائل ہیں، کون کس کے ساتھ اتحاد میں ہے، اور کون، اس کے برعکس، جنگ میں ہے، وغیرہ۔ یہ معلومات، ہمارے پروگرام کی حالت، کو بعد میں ڈیٹا کو بحال کرنے اور گیم کو جاری رکھنے کے لیے کسی نہ کسی طرح محفوظ کیا جانا چاہیے۔ یہ بالکل وہی ہے جس کے لئے سیریلائزیشن اور ڈی سیریلائزیشن کے طریقہ کار کا استعمال کیا جاتا ہے ۔ سیریلائزیشن کسی چیز کی حالت کو بائٹس کی ترتیب میں ذخیرہ کرنے کا عمل ہے۔ ڈیسیریلائزیشن ان بائٹس سے کسی چیز کو دوبارہ تشکیل دینے کا عمل ہے۔ کسی بھی جاوا آبجیکٹ کو بائٹس کی ترتیب میں تبدیل کیا جاتا ہے۔ یہ کس لیے ہے؟ ہم ایک سے زیادہ بار کہہ چکے ہیں کہ پروگرام اپنے طور پر موجود نہیں ہیں۔ اکثر وہ ایک دوسرے کے ساتھ بات چیت کرتے ہیں، ڈیٹا کا تبادلہ کرتے ہیں، وغیرہ۔ اور بائٹ فارمیٹ اس کے لیے آسان اور موثر ہے۔ مثال کے طور پر، ہم اپنے کلاس آبجیکٹ SavedGame(ایک محفوظ کردہ گیم) کو بائٹس کی ترتیب میں تبدیل کر سکتے ہیں، ان بائٹس کو نیٹ ورک پر دوسرے کمپیوٹر پر منتقل کر سکتے ہیں، اور دوسرے کمپیوٹر پر ان بائٹس کو جاوا آبجیکٹ میں واپس کر سکتے ہیں! یہ سننا مشکل ہے، ٹھیک ہے؟ بظاہر، اس عمل کو منظم کرنا آسان نہیں ہوگا :/ خوش قسمتی سے، نہیں! :) جاوا میں، سیریلائز ایبل انٹرفیس سیریلائزیشن کے عمل کے لیے ذمہ دار ہے ۔ یہ انٹرفیس انتہائی آسان ہے: آپ کو اسے استعمال کرنے کے لیے کسی ایک طریقہ کو لاگو کرنے کی ضرورت نہیں ہے! ہماری سیو گیم کلاس اس طرح نظر آئے گی:
import java.io.Serializable;
import java.util.Arrays;

public class SavedGame implements Serializable {

   private static final long serialVersionUID = 1L;

   private String[] territoriesInfo;
   private String[] resourcesInfo;
   private String[] diplomacyInfo;

   public SavedGame(String[] territoriesInfo, String[] resourcesInfo, String[] diplomacyInfo){
       this.territoriesInfo = territoriesInfo;
       this.resourcesInfo = resourcesInfo;
       this.diplomacyInfo = diplomacyInfo;
   }

   public String[] getTerritoriesInfo() {
       return territoriesInfo;
   }

   public void setTerritoriesInfo(String[] territoriesInfo) {
       this.territoriesInfo = territoriesInfo;
   }

   public String[] getResourcesInfo() {
       return resourcesInfo;
   }

   public void setResourcesInfo(String[] resourcesInfo) {
       this.resourcesInfo = resourcesInfo;
   }

   public String[] getDiplomacyInfo() {
       return diplomacyInfo;
   }

   public void setDiplomacyInfo(String[] diplomacyInfo) {
       this.diplomacyInfo = diplomacyInfo;
   }

   @Override
   public String toString() {
       return "SavedGame{" +
               "territoriesInfo=" + Arrays.toString(territoriesInfo) +
               ", resourcesInfo=" + Arrays.toString(resourcesInfo) +
               ", diplomacyInfo=" + Arrays.toString(diplomacyInfo) +
               '}';
   }
}
تین ڈیٹا سیٹ خطوں، معاشیات اور سفارت کاری کے بارے میں معلومات کے لیے ذمہ دار ہیں، اور سیریلائز ایبل انٹرفیس جاوا مشین کو بتاتا ہے: " سب کچھ ٹھیک ہے، اگر کچھ ہے تو، اس کلاس کی اشیاء کو سیریلائز کیا جا سکتا ہے ۔" ایک انٹرفیس جس میں کوئی طریقہ نہیں ہے عجیب لگتا ہے :/ اس کی ضرورت کیوں ہے؟ اس سوال کا جواب اوپر ہے: صرف جاوا مشین کو ضروری معلومات فراہم کرنے کے لیے۔ پچھلے لیکچرز میں سے ایک میں، ہم نے مختصراً مارکر انٹرفیس کا ذکر کیا۔ یہ خاص معلوماتی انٹرفیس ہیں جو ہماری کلاسوں کو اضافی معلومات کے ساتھ نشان زد کرتے ہیں جو مستقبل میں جاوا مشین کے لیے مفید ہو گی۔ ان کے پاس کوئی طریقہ نہیں ہے جس پر عمل درآمد کی ضرورت ہے۔ تو، Serializable ایسے انٹرفیس میں سے ایک ہے۔ ایک اور اہم نکتہ: متغیر جس کی private static final long serialVersionUIDہم نے کلاس میں تعریف کی ہے۔ اس کی ضرورت کیوں ہے؟ یہ فیلڈ سیریلائزڈ کلاس کا منفرد ورژن شناخت کنندہ پر مشتمل ہے ۔ کوئی بھی کلاس جو سیریلائز ایبل انٹرفیس کو نافذ کرتی ہے اس کا ایک ورژن شناخت کنندہ ہوتا ہے۔ اس کا حساب کلاس کے مواد کی بنیاد پر کیا جاتا ہے - فیلڈز، ڈیکلریشن آرڈر، طریقے۔ اور اگر ہم اپنی کلاس میں فیلڈ کی قسم اور/یا فیلڈز کی تعداد کو تبدیل کرتے ہیں، تو ورژن شناخت کنندہ فوری طور پر بدل جائے گا۔ جب کلاس کو سیریل کیا جاتا ہے تو serialVersionUID بھی لکھا جاتا ہے۔ جب ہم ڈی سیریلائز کرنے کی کوشش کرتے ہیں، یعنی کسی چیز کو بائٹس کے سیٹ سے بحال کرتے ہیں، تو قدر کا موازنہ ہمارے پروگرام میں کلاس کی serialVersionUIDقدر سے کیا جاتا ہے ۔ serialVersionUIDاگر اقدار مماثل نہیں ہیں تو، ایک java.io.InvalidClassException پھینک دیا جائے گا۔ ہم ذیل میں اس کی ایک مثال دیکھیں گے۔ اس طرح کے حالات سے بچنے کے لیے، ہم اپنی کلاس کے لیے اس ورژن ID کو دستی طور پر سیٹ کرتے ہیں۔ ہمارے معاملے میں، یہ صرف 1 کے برابر ہوگا (آپ اپنی پسند کے کسی دوسرے نمبر کو بدل سکتے ہیں)۔ ٹھیک ہے، اب وقت آگیا ہے کہ ہم اپنے اعتراض کو سیریلائز کرنے کی کوشش کریں SavedGameاور دیکھیں کہ کیا ہوتا ہے!
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class Main {

   public static void main(String[] args) throws IOException {

       // create our object
       String[] territoryInfo = {"Spain has 6 provinces", "Russia has 10 provinces", "France has 8 provinces"};
       String[] resourcesInfo = {"Spain has 100 gold", "Russia has 80 gold", "France has 90 gold"};
       String[] diplomacyInfo = {"France is at war with Russia, Spain has taken a position of neutrality"};

       SavedGame savedGame = new SavedGame(territoryInfo, resourcesInfo, diplomacyInfo);

       //create 2 threads to serialize the object and save it to a file
       FileOutputStream outputStream = new FileOutputStream("C:\\Users\\Username\\Desktop\\save.ser");
       ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);

       // save game to file
       objectOutputStream.writeObject(savedGame);

       // close the stream and release resources
       objectOutputStream.close();
   }
}
جیسا کہ آپ دیکھ سکتے ہیں، ہم نے 2 تھریڈز بنائے ہیں - FileOutputStreamاور ObjectOutputStream. ان میں سے پہلا ڈیٹا فائل میں لکھ سکتا ہے، اور دوسرا اشیاء کو بائٹس میں تبدیل کر سکتا ہے۔ آپ نے پہلے ہی اسی طرح کی "گھوںسلی" تعمیرات دیکھی ہیں، مثال کے طور پر، new BufferedReader(new InputStreamReader(...))پچھلے لیکچرز میں، اس لیے انہیں آپ کو خوفزدہ نہیں کرنا چاہیے :) دو دھاگوں کی ایسی "زنجیر" بنا کر، ہم دونوں کام انجام دیتے ہیں: ہم آبجیکٹ کو SavedGameبائٹس کے سیٹ میں بدل دیتے ہیں۔ اور طریقہ استعمال کرتے ہوئے اسے فائل میں محفوظ کریں writeObject()۔ اور، ویسے، ہم نے یہ بھی نہیں دیکھا کہ ہمیں کیا ملا! یہ فائل کو دیکھنے کا وقت ہے! *نوٹ: فائل کو پہلے سے بنانے کی ضرورت نہیں ہے۔ اگر اس نام کی فائل موجود نہیں ہے، تو یہ خود بخود بن جائے گی* اور اس کے مندرجات یہ ہیں! ¬н sr محفوظ کردہ گیم [ ڈپلومیسی انفوٹ [Ljava/lang/String;[ وسائل انفوq ~ [ territoriesInfoq ~ xpur їР° І РсСЃСЃРёРё 80 Р·Р»РСС,Рt !РЈ Фрнции 90 Р·Р»РсС,Р°uq ~ t 10 % †РёР№t &РЈ ФрРРЅС†РеРё 8 проввинций افوہ :( ایسا لگتا ہے کہ ہمارا پروگرام کام نہیں کر رہا تھا :( دراصل، اس نے کام کیا۔ آپ کو یاد ہے کہ ہم نے فائل اور بائٹس کا بالکل ایک سیٹ منتقل کیا ہے۔ صرف ایک شے یا متن نہیں؟ ٹھیک ہے، یہ سیٹ ایسا لگتا ہے :) یہ ہمارا محفوظ کردہ گیم ہے! اگر ہم اپنے اصل آبجیکٹ کو بحال کرنا چاہتے ہیں، یعنی گیم کو لوڈ اور جاری رکھنا چاہتے ہیں جہاں سے ہم نے چھوڑا تھا، ہمیں ریورس عمل، ڈی سیریلائزیشن ... ہمارے معاملے میں یہ ایسا ہی نظر آئے گا:
import java.io.*;

public class Main {

   public static void main(String[] args) throws IOException, ClassNotFoundException {

       FileInputStream fileInputStream = new FileInputStream("C:\\Users\\Username\\Desktop\\save.ser");
       ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);

       SavedGame savedGame = (SavedGame) objectInputStream.readObject();

       System.out.println(savedGame);
   }
}
اور یہاں نتیجہ ہے! SavedGame{territoriesInfo=[اسپین کے 6 صوبے ہیں، روس کے 10 صوبے ہیں، فرانس کے 8 صوبے ہیں]، وسائل کی معلومات=[اسپین کے پاس 100 سونا ہے، روس کے پاس 80 سونا ہے، فرانس کے پاس 90 سونا ہے]، ڈپلومیسی انفو=[فرانس روس کے ساتھ جنگ ​​میں ہے، سپین نے غیرجانبداری کی پوزیشن پر قبضہ کر لیا ہے]} بہت اچھا! ہم پہلے اپنے گیم کی حالت کو فائل میں محفوظ کرنے میں کامیاب ہوئے، اور پھر اسے فائل سے بحال کیا۔ اب ہم ایسا کرنے کی کوشش کرتے ہیں، لیکن SavedGameاپنی کلاس سے ورژن شناخت کنندہ کو ہٹا دیں۔ ہم اپنی دونوں کلاسوں کو دوبارہ نہیں لکھیں گے، ان کا کوڈ ایک جیسا ہوگا، ہم صرف SavedGameہٹا دیں گے private static final long serialVersionUID۔ سیریلائزیشن کے بعد ہمارا مقصد یہ ہے: ¬н sr SavedGameі€MіuOM‰ [ ڈپلومیسی انفوٹ [Ljava/lang/String;[ وسائل انفوق ~ [ territoriesInfoq ~ xpur ‚ СЃ Р РСссией، Р˜СЃїРЅР·°РЅСЏР»° RїRS·Rё ї ании 100 Р · РслотРt РЈ Р РССЃСЃРёRё 80 злоС,Рt !РЈ Фрнции 90 Р·Р»РСЗСЄС °uq ~ t &РЈРЈ 10 دن 10 اور جب اسے ڈی سیریلائز کرنے کی کوشش کی گئی تو ایسا ہی ہوا: InvalidClassException: local class incompatible : stream classdesc serialVersionUID = - 196410440475012755, local class serialVersionUID = -6675950253085108747 یہ وہی رعایت ہے جس کا اوپر ذکر کیا گیا ہے۔ آپ ہمارے ایک طالب علم کے مضمون میں اس کے بارے میں مزید پڑھ سکتے ہیں ۔ ویسے ہم نے ایک اہم نکتہ کھو دیا۔ یہ واضح ہے کہ strings اور آسانی سے سیریلائز کیا جاتا ہے: جاوا میں یقینی طور پر کچھ ہے- پھر اس کے لئے بلٹ ان میکانزم موجود ہیں۔ لیکن کیا ہوگا اگر ہمارے serializableکلاس میں ایسے فیلڈز ہیں جن کا اظہار قدیم کے طور پر نہیں بلکہ دیگر اشیاء کے حوالے کے طور پر کیا گیا ہے؟ آئیے، مثال کے طور پر ، اپنی کلاس کے ساتھ کام کرنے TerritoriesInfoکے لیے علیحدہ کلاسز بنائیں ۔ ResourcesInfoDiplomacyInfoSavedGame
public class TerritoriesInfo {

   private String info;

   public TerritoriesInfo(String info) {
       this.info = info;
   }

   public String getInfo() {
       return info;
   }

   public void setInfo(String info) {
       this.info = info;
   }

   @Override
   public String toString() {
       return "TerritoriesInfo{" +
               "info='" + info + '\'' +
               '}';
   }
}

public class ResourcesInfo {

   private String info;

   public ResourcesInfo(String info) {
       this.info = info;
   }

   public String getInfo() {
       return info;
   }

   public void setInfo(String info) {
       this.info = info;
   }

   @Override
   public String toString() {
       return "ResourcesInfo{" +
               "info='" + info + '\'' +
               '}';
   }
}

public class DiplomacyInfo {

   private String info;

   public DiplomacyInfo(String info) {
       this.info = info;
   }

   public String getInfo() {
       return info;
   }

   public void setInfo(String info) {
       this.info = info;
   }

   @Override
   public String toString() {
       return "DiplomacyInfo{" +
               "info='" + info + '\'' +
               '}';
   }
}
لیکن اب ہمارے پاس ایک سوال ہے: اگر ہم تبدیل شدہ کلاس کو سیریلائز کرنا چاہتے ہیں تو کیا ان تمام کلاسوں کو سیریلائز ہونا چاہئے SavedGame؟
import java.io.Serializable;
import java.util.Arrays;

public class SavedGame implements Serializable {

   private TerritoriesInfo territoriesInfo;
   private ResourcesInfo resourcesInfo;
   private DiplomacyInfo diplomacyInfo;

   public SavedGame(TerritoriesInfo territoriesInfo, ResourcesInfo resourcesInfo, DiplomacyInfo diplomacyInfo) {
       this.territoriesInfo = territoriesInfo;
       this.resourcesInfo = resourcesInfo;
       this.diplomacyInfo = diplomacyInfo;
   }

   public TerritoriesInfo getTerritoriesInfo() {
       return territoriesInfo;
   }

   public void setTerritoriesInfo(TerritoriesInfo territoriesInfo) {
       this.territoriesInfo = territoriesInfo;
   }

   public ResourcesInfo getResourcesInfo() {
       return resourcesInfo;
   }

   public void setResourcesInfo(ResourcesInfo resourcesInfo) {
       this.resourcesInfo = resourcesInfo;
   }

   public DiplomacyInfo getDiplomacyInfo() {
       return diplomacyInfo;
   }

   public void setDiplomacyInfo(DiplomacyInfo diplomacyInfo) {
       this.diplomacyInfo = diplomacyInfo;
   }

   @Override
   public String toString() {
       return "SavedGame{" +
               "territoriesInfo=" + territoriesInfo +
               ", resourcesInfo=" + resourcesInfo +
               ", diplomacyInfo=" + diplomacyInfo +
               '}';
   }
}
ٹھیک ہے، چلو اسے عملی طور پر چیک کریں! آئیے ہر چیز کو ابھی کے لیے چھوڑ دیں اور آبجیکٹ کو سیریلائز کرنے کی کوشش کریں SavedGame:
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class Main {

   public static void main(String[] args) throws IOException {

       // create our object
       TerritoriesInfo territoriesInfo = new TerritoriesInfo("Spain has 6 provinces, Russia has 10 provinces, France has 8 provinces");
       ResourcesInfo resourcesInfo = new ResourcesInfo("Spain has 100 gold, Russia has 80 gold, France has 90 gold");
       DiplomacyInfo diplomacyInfo =  new DiplomacyInfo("France is at war with Russia, Spain has taken a position of neutrality");


       SavedGame savedGame = new SavedGame(territoriesInfo, resourcesInfo, diplomacyInfo);

       FileOutputStream fileOutputStream = new FileOutputStream("C:\\Users\\Username\\Desktop\\save.ser");
       ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);

       objectOutputStream.writeObject(savedGame);

       objectOutputStream.close();
   }
}
نتیجہ: تھریڈ "مین" میں استثنا java.io.NotSerializableException: DiplomacyInfo ناکام! دراصل، ہمارے سوال کا جواب یہ ہے۔ جب آپ کسی آبجیکٹ کو سیریلائز کرتے ہیں تو ان تمام اشیاء کو سیریلائز کیا جاتا ہے جن کا اس کے مثال کے متغیر میں حوالہ دیا جاتا ہے۔ اور اگر وہ اشیاء تیسرے آبجیکٹ کا بھی حوالہ دیتے ہیں تو وہ بھی سیریلائز ہوتے ہیں۔ اور اسی طرح اشتہار لامحدود پر۔ اس سلسلہ میں تمام کلاسز کو سیریلائز کرنے کے قابل ہونا چاہیے، بصورت دیگر وہ سیریلائز نہیں ہوں گی اور ایک استثناء دیا جائے گا۔ یہ، ویسے، مستقبل میں مسائل پیدا کر سکتا ہے. ہمیں کیا کرنا چاہیے، مثال کے طور پر، اگر ہمیں سیریلائزیشن کے دوران کلاس کے حصے کی ضرورت نہیں ہے؟ یا، مثال کے طور پر، TerritoryInfoہمیں اپنے پروگرام میں کسی لائبریری کے حصے کے طور پر ایک کلاس وراثت میں ملی ہے۔ تاہم، یہ سیریلائز نہیں ہے، اور، اس کے مطابق، ہم اسے تبدیل نہیں کر سکتے۔ یہ پتہ چلتا ہے کہ ہم TerritoryInfoاپنی کلاس میں فیلڈ شامل نہیں کر سکتے، کیونکہ اس کے بعد پوری کلاس غیر سیریلائز ہو جائے گی! مسئلہ:/ اس قسم کے مسائل جاوا میں کلیدی لفظ کے استعمال سے حل ہوتے ہیں ۔ اگر آپ اس کلیدی لفظ کو کلاس فیلڈ میں شامل کرتے ہیں، تو اس فیلڈ کی قدر کو سیریلائز نہیں کیا جائے گا۔ آئیے اپنی کلاس کے فیلڈ میں سے ایک بنانے کی کوشش کریں ، جس کے بعد ہم ایک آبجیکٹ کو سیریلائز اور بحال کریں گے۔ SavedGameSavedGameجاوا میں سیریلائزیشن اور ڈی سیریلائزیشن - 2transientSavedGame transient
import java.io.Serializable;

public class SavedGame implements Serializable {

   private transient TerritoriesInfo territoriesInfo;
   private ResourcesInfo resourcesInfo;
   private DiplomacyInfo diplomacyInfo;

   public SavedGame(TerritoriesInfo territoriesInfo, ResourcesInfo resourcesInfo, DiplomacyInfo diplomacyInfo) {
       this.territoriesInfo = territoriesInfo;
       this.resourcesInfo = resourcesInfo;
       this.diplomacyInfo = diplomacyInfo;
   }

   //...getters, setters, toString()...
}



import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class Main {

   public static void main(String[] args) throws IOException {

       // create our object
       TerritoriesInfo territoriesInfo = new TerritoriesInfo("Spain has 6 provinces, Russia has 10 provinces, France has 8 provinces");
       ResourcesInfo resourcesInfo = new ResourcesInfo("Spain has 100 gold, Russia has 80 gold, France has 90 gold");
       DiplomacyInfo diplomacyInfo =  new DiplomacyInfo("France is at war with Russia, Spain has taken a position of neutrality");


       SavedGame savedGame = new SavedGame(territoriesInfo, resourcesInfo, diplomacyInfo);

       FileOutputStream fileOutputStream = new FileOutputStream("C:\\Users\\Username\\Desktop\\save.ser");
       ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);

       objectOutputStream.writeObject(savedGame);

       objectOutputStream.close();
   }
}


import java.io.*;

public class Main {

   public static void main(String[] args) throws IOException, ClassNotFoundException {

       FileInputStream fileInputStream = new FileInputStream("C:\\Users\\Username\\Desktop\\save.ser");
       ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);

       SavedGame savedGame = (SavedGame) objectInputStream.readObject();

       System.out.println(savedGame);

       objectInputStream.close();


   }
}
اور نتیجہ یہ ہے: SavedGame{territoriesInfo=null, resourcesInfo=ResourcesInfo{info='اسپین کے پاس 100 سونا، روس کے پاس 80 سونا، فرانس کے پاس 90 سونا'}، diplomacyInfo=DiplomacyInfo{info='فرانس روس کے ساتھ جنگ ​​میں ہے، اسپین نے غیرجانبداری کی پوزیشن لی ہے'}} اسی وقت، ہمیں اس سوال کا جواب ملا کہ transientفیلڈ کو کیا قدر تفویض کی جائے گی۔ اسے ڈیفالٹ ویلیو تفویض کیا گیا ہے۔ اشیاء کے معاملے میں یہ ہے null۔ اپنی فرصت میں، آپ سیریلائزیشن کے بارے میں یہ بہترین مضمون پڑھ سکتے ہیں ۔ یہ انٹرفیس کے بارے میں بھی بات کرتا ہے Externalizable، جس کے بارے میں ہم اگلے لیکچر میں بات کریں گے۔ اس کے علاوہ کتاب "ہیڈ فرسٹ جاوا" میں اس موضوع پر ایک باب ہے، اس پر توجہ دیں :)
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION