CodeGym /جاوا بلاگ /Random-SD /جاوا ۾ سيريلائيزيشن ۽ ڊيسيريلائيزيشن
John Squirrels
سطح
San Francisco

جاوا ۾ سيريلائيزيشن ۽ ڊيسيريلائيزيشن

گروپ ۾ شايع ٿيل
سلام اڄ جي سبق ۾، اسان جاوا ۾ serialization ۽ deserialization بابت ڳالهائينداسين. اسان هڪ سادي مثال سان شروع ڪنداسين. تصور ڪريو ته توهان هڪ ڪمپيوٽر گيم ڊولپر آهيو. جيڪڏهن توهان 90 جي ڏهاڪي ۾ وڏا ٿيا آهيو ۽ ان دور جي گيم ڪنسولز کي ياد ڪريو ٿا، توهان شايد ڄاڻو ٿا ته انهن وٽ ڪجهه نه آهي جنهن کي اسان اڄ تسليم ڪريون ٿا - راندين کي بچائڻ ۽ لوڊ ڪرڻ جي صلاحيت :) جيڪڏهن نه، تصور ڪريو ته! جاوا ۾ سيريلائيزيشن ۽ ڊيسيريلائيزيشن - 1مون کي ڊپ آهي ته اڄ انهن صلاحيتن کان سواء هڪ راند برباد ٿي ويندي! بهرحال، راند کي 'محفوظ ڪرڻ' ۽ 'لوڊ' ڪرڻ جو ڇا مطلب آهي؟ خير، اسان روزمره جي معني کي سمجھندا آهيون: اسان راند کي جاري رکڻ چاهيون ٿا جتان اسان ڇڏي ڏنو. هن کي ڪرڻ لاء، اسان هڪ خاص 'چڪ پوائنٽ' ٺاهيندا آهيون جنهن کي اسان بعد ۾ استعمال ڪندا آهيون راند کي لوڊ ڪرڻ لاء. پر انهي جو مطلب ڇا آهي هڪ پروگرامر بجاءِ هڪ آرامده گامر؟ جواب سادو آهي: اسان پنهنجي پروگرام جي حالت کي بچايو. اچو ته چوندا آهن ته توهان اسپين کي راند ڪري رهيا آهيو هڪ حڪمت عملي واري راند ۾. توھان جي راند ۾ رياست آھي: ڪھڙا علائقا ھر ڪنھن وٽ آھن، ھر ڪنھن وٽ ڪيترا وسيلا آھن، ڪھڙا اتحاد موجود آھن ۽ ڪنھن سان، ڪير جنگ ۾ آھي، وغيره. هي معلومات، اسان جي پروگرام جي رياست، ڊيٽا کي بحال ڪرڻ ۽ راند کي جاري رکڻ لاء ڪنهن به طرح محفوظ ڪيو وڃي. جيئن ته اهو ٿئي ٿو، سيريلائيزيشن ۽ ڊيسيريلائيزيشن هن لاء استعمال ڪيل ميکانيزم آهن. جاوا ۾ سيريلائيزيشن هڪ اعتراض جي حالت کي بائيٽ جي ترتيب جي طور تي محفوظ ڪرڻ جو عمل آهي. جاوا ۾ Deserialization انهن بائيٽ مان هڪ اعتراض کي بحال ڪرڻ جو عمل آهي. ڪنهن به جاوا اعتراض کي بائيٽ جي ترتيب ۾ تبديل ڪري سگھجي ٿو. اسان کي هن جي ضرورت ڇو آهي؟ اسان بار بار چيو آهي ته پروگرام پاڻ وٽ موجود نه آهن. گهڻو ڪري، اهي هڪ ٻئي سان رابطو ڪن ٿا، ڊيٽا مٽائي، وغيره. هڪ بائيٽ فارميٽ ان لاءِ آسان ۽ ڪارائتو آهي. مثال طور، اسان پنھنجي SavedGame ڪلاس جي ھڪڙي شئي کي بائيٽ جي ترتيب ۾ تبديل ڪري سگھون ٿا، انھن بائيٽن کي نيٽ ورڪ تي ٻئي ڪمپيوٽر ڏانھن منتقل ڪري سگھون ٿا، ۽ پوءِ ٻئي ڪمپيوٽر تي انھن بائيٽس کي واپس جاوا اعتراض ۾ تبديل ڪري سگھون ٿا! اهو ڏکيو آواز آهي، ها؟ اهو لڳي ٿو ته اهو سڀ ڪجهه ڪرڻ ڏکيو ٿيندو: / خوشيء سان، اهو معاملو ناهي! :) جاوا ۾، سيريلائيزبل انٽرفيس سيريلائيزيشن جي عمل لاء ذميوار آهي. هي انٽرفيس انتهائي سادو آهي: توهان کي ان کي استعمال ڪرڻ لاءِ هڪ طريقو لاڳو ڪرڻ جي ضرورت ناهي! ڏسو ته راندين کي بچائڻ لاءِ اسان جو ڪلاس ڪيترو سادو آهي:
import java.io.Serializable;
import java.util.Arrays;

public class SavedGame implements Serializable {

   private static final long serialVersionUID = 1L;

   private String[] territoryInfo;
   private String[] resourceInfo;
   private String[] diplomacyInfo;

   public SavedGame(String[] territoryInfo, String[] resourceInfo, String[] diplomacyInfo){
       this.territoryInfo = territoryInfo;
       this.resourceInfo = resourceInfo;
       this.diplomacyInfo = diplomacyInfo;
   }

   public String[] getTerritoryInfo() {
       return territoryInfo;
   }

   public void setTerritoryInfo(String[] territoryInfo) {
       this.territoryInfo = territoryInfo;
   }

   public String[] getResourceInfo() {
       return resourceInfo;
   }

   public void setResourceInfo(String[] resourceInfo) {
       this.resourceInfo = resourceInfo;
   }

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

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

   @Override
   public String toString() {
       return "SavedGame{" +
               "territoryInfo=" + Arrays.toString(territoryInfo) +
               ", resourceInfo=" + Arrays.toString(resourceInfo) +
               ", diplomacyInfo=" + Arrays.toString(diplomacyInfo) +
               '}';
   }
}
ٽي صفون علائقا، وسيلن ۽ سفارتڪاريءَ بابت معلومات لاءِ ذميوار آهن، ۽ سيريلائيبل انٽرفيس جاوا مشين کي ٻڌائي ٿو: ' جيڪڏهن هن طبقي جون شيون سيريلائيز ڪري سگهجن ته سڀ ڪجهه ٺيڪ آهي '. هڪ انٽرفيس کان سواءِ هڪ انٽرفيس عجيب لڳندو آهي:/ اهو ڇو ضروري آهي؟ انهي سوال جو جواب مٿي ڏنو ويو آهي: اهو صرف جاوا مشين کي ضروري معلومات مهيا ڪرڻ جي ضرورت آهي. گذريل سبق ۾، اسان مختصر طور مارڪر انٽرفيس جو ذڪر ڪيو آهي. اهي خاص معلوماتي انٽرفيس آهن جيڪي صرف اسان جي ڪلاسن کي اضافي معلومات سان نشان لڳايو جيڪي مستقبل ۾ جاوا مشين لاءِ ڪارآمد ثابت ٿينديون. انهن وٽ ڪي به طريقا نه آهن جيڪي توهان کي لاڳو ڪرڻ گهرجن. هتي آهي Serializable - هڪ اهڙو انٽرفيس. هتي هڪ ٻيو اهم نقطو آهي: اسان کي نجي جامد آخري ڊگهي serialVersionUID متغير جي ضرورت ڇو آهي جيڪا اسان ڪلاس ۾ بيان ڪئي آهي؟ ھن فيلڊ ۾ سيريل ٿيل ڪلاس جي منفرد ورزن جي سڃاڻپ ڪندڙ آھي. هر ڪلاس جيڪو سيريلائيبل انٽرفيس کي لاڳو ڪري ٿو ان وٽ هڪ ورزن جي سڃاڻپ ڪندڙ آهي. اهو طئي ڪيو ويو آهي ڪلاس جي مواد جي بنياد تي - فيلڊز ۽ انهن جي اعلان جي ترتيب، ۽ طريقن ۽ انهن جي اعلان جي ترتيب. ۽ جيڪڏھن اسان پنھنجي ڪلاس ۾ ھڪڙي فيلڊ جو قسم ۽/يا فيلڊن جو تعداد تبديل ڪريون ٿا، ورجن جي سڃاڻپ ڪندڙ فوري طور تي تبديل ڪري ٿو. serialVersionUID پڻ لکيو ويندو آهي جڏهن ڪلاس سيريل ڪيو ويندو آهي . جڏهن اسان ڊيسيريلائيز ڪرڻ جي ڪوشش ڪندا آهيون، يعني ڪنهن شئي کي بائيٽ جي ترتيب مان بحال ڪندا آهيون، ته serialVersionUID جي قيمت اسان جي پروگرام ۾ ڪلاس جي serialVersionUID جي قدر سان ڀيٽي ويندي آهي . جيڪڏهن قيمتون نه ملنديون آهن، ته پوء هڪ java.io.InvalidClassException اڇلايو ويندو. اسان ان جو هڪ مثال هيٺ ڏسنداسين. اهڙين حالتن کان بچڻ لاءِ، اسان دستي طور اسان جي ڪلاس لاءِ ورزن جي سڃاڻپ ڪندڙ کي ترتيب ڏيون ٿا. اسان جي حالت ۾، اهو صرف 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[] resourceInfo = {"Spain has 100 gold", "Russia has 80 gold", "France has 90 gold"};
       String[] diplomacyInfo = {"France is at war with Russia, Spain has taken a neutral position"};

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

       // Create 2 streams 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 the game to a file
       objectOutputStream.writeObject(savedGame);

       // Close the stream and release resources
       objectOutputStream.close();
   }
}
جئين توهان ڏسي سگهو ٿا، اسان 2 اسٽريم ٺاهيا: FileOutputStream ۽ ObjectOutputStream . پهريون ڄاڻي ٿو ته فائل ۾ ڊيٽا ڪيئن لکجي، ۽ ٻيو شيون شيون بائيٽ ۾ بدلائي ٿو. توهان اڳ ۾ ئي هڪجهڙا nested تعميرات ڏٺا آهن، مثال طور، نئون BufferedReader(new InputStreamReader(...)) , پوئين سبقن ۾، پوءِ اهي توهان کي خوفزده نه ڪن :) ٻن اسٽريمز جو هي سلسلو ٺاهي، اسان ٻئي ڪم سرانجام ڏيون ٿا: اسان SavedGame اعتراض کي بائيٽ جي ترتيب ۾ تبديل ڪريون ٿا ۽ ان کي فائل ۾ محفوظ ڪريون ٿا writeObject() طريقو استعمال ڪندي. ۽، رستي ۾، اسان اهو به نه ڏٺو ته اسان کي ڇا مليو! اهو فائل ڏسڻ جو وقت آهي! *نوٽ: اهو ضروري ناهي ته فائل اڳ ۾ ٺاهي. جيڪڏهن مخصوص نالي سان ڪا فائل موجود نه آهي، ته اها خودڪار طريقي سان ٺاهي ويندي* ۽ هتي ان جا مواد آهن: ¬н sr SavedGame [diplomacyInfot [Ljava/lang/String;[ resourceInfoq ~ [ territoryInfoq ~ xpur [Ljava.lang. اسٽرنگ؛¬TVZI{G xp t pФрРнция РІРСЋРµС, СЃ Р РСссией, Р˜СЃїRї°RЅRёСЏ № РµС,R°uq ~ t "РЈ Р˜СЃРїРЅРёРё 100 Р·Р»РСС,Р РЈ Р РССЃСЃСЃРёР 80 »واقع ~ ~ ~ ~ 6 ~ ~ ~ ~ анции 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{territoryInfo=[اسپين وٽ 6 صوبا آهن، روس وٽ 10 صوبا آهن، فرانس وٽ 8 صوبا آهن]، resourceInfo=[اسپين وٽ 100 سون آهن، روس وٽ 80 سون آهن، فرانس وٽ 90 سون آهن]، diplomacyInfo=[فرانس وٽ روس سان جنگ آهي، اسپين هڪ غير جانبدار پوزيشن ورتي آهي]} بهترين! اسان منظم ڪيو پهرين اسان جي راند جي حالت کي فائل ۾، ۽ پوء ان کي فائل مان بحال ڪرڻ لاء. ھاڻي اچو ته ساڳيو ڪم ڪرڻ جي ڪوشش ڪريون، پر اسان پنھنجي SavedGame ڪلاس مان ورزن جي سڃاڻپ ڪندڙ کي ختم ڪنداسين. اسان پنهنجي ٻنهي طبقن کي ٻيهر نه لکنداسين. انهن جو ڪوڊ ساڳيو هوندو. اسان صرف SavedGame ڪلاس مان پرائيويٽ جامد آخري ڊگھو سيريل ورجن يو آءِ ڊي کي ختم ڪنداسين . سيريلائيزيشن کان پوءِ اسان جو اعتراض هي آهي: ¬н sr SavedGameі€MіuOm‰ [ diplomacyInfot [Ljava/lang/String؛[ resourceInfoq ~ [ territoryInfoq ~ xpur , СЃ Р РССЃСЃ РµR№, Р˜СЃїРЅРЅРЏ Р·°РЅСЏР» Рїрс·Rё СЈЈ ° С ° ~ ~ ~ 100 Р ✓ ✓✓✋✋✋✋✋✋✋ ههههههههههههههههههههههههههههههههههههههههههههه 10 % 10 InvalidClassException : local class incompatible: stream classdesc serialVersionUID = - 196410440475012755، local class serialVersionUID = -6675950253085108747 رستي ۾، اسان ڪجهه اهم وڃائي ڇڏيو. ظاهر آهي، اسٽرنگ ۽ پرائمري آساني سان ترتيب ڏنل آهن: جاوا يقيني طور تي ڪجهه بلٽ ان ميڪانيزم آهي، پر جيڪڏهن اهو اسان جي فيلڊ ۾ قابل نه آهي، ته ڇا اسان جي ڪلاس جي قابل نه آهي . بلڪه ٻين شين جي حوالي سان؟ مثال طور، اچو ته اسان جي SavedGame ڪلاس سان ڪم ڪرڻ لاءِ الڳ TerritoryInfo ، ResourceInfo ۽ DiplomacyInfo ڪلاس ٺاھيون .
public class TerritoryInfo {

   private String info;

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

   public String getInfo() {
       return info;
   }

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

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

public class ResourceInfo {

   private String info;

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

   public String getInfo() {
       return info;
   }

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

   @Override
   public String toString() {
       return "ResourceInfo{" +
               "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 TerritoryInfo territoryInfo;
   private ResourceInfo resourceInfo;
   private DiplomacyInfo diplomacyInfo;

   public SavedGame(TerritoryInfo territoryInfo, ResourceInfo resourceInfo, DiplomacyInfo diplomacyInfo) {
       this.territoryInfo = territoryInfo;
       this.resourceInfo = resourceInfo;
       this.diplomacyInfo = diplomacyInfo;
   }

   public TerritoryInfo getTerritoryInfo() {
       return territoryInfo;
   }

   public void setTerritoryInfo(TerritoryInfo territoryInfo) {
       this.territoryInfo = territoryInfo;
   }

   public ResourceInfo getResourceInfo() {
       return resourceInfo;
   }

   public void setResourceInfo(ResourceInfo resourceInfo) {
       this.resourceInfo = resourceInfo;
   }

   public DiplomacyInfo getDiplomacyInfo() {
       return diplomacyInfo;
   }

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

   @Override
   public String toString() {
       return "SavedGame{" +
               "territoryInfo=" + territoryInfo +
               ", resourceInfo=" + resourceInfo +
               ", 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
       TerritoryInfo territoryInfo = new TerritoryInfo("Spain has 6 provinces, Russia has 10 provinces, France has 8 provinces");
       ResourceInfo resourceInfo = new ResourceInfo("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 neutral position");


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

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

       objectOutputStream.writeObject(savedGame);

       objectOutputStream.close();
   }
}
نتيجو: سلسلي ۾ استثنا "main" java.io.NotSerializableException: DiplomacyInfo اهو ڪم نه ڪيو! تنهن ڪري، هتي اسان جي سوال جو جواب آهي. جڏهن هڪ اعتراض سيريل ڪيو ويندو آهي، سڀني شين جو حوالو ڏنو ويو آهي ان جي مثال جي متغيرن جي ترتيب سان. ۽ جيڪڏهن اهي شيون ٻين شين جو حوالو ڏين ٿيون، ته اهي پڻ سيريل آهن. ۽ هميشه لاءِ. ھن زنجير ۾ سڀني طبقن کي لازمي طور تي سيريلائز ڪرڻ گھرجي ، ٻي صورت ۾ انھن کي سيريل ڪرڻ ناممڪن ھوندو ۽ ھڪڙو استثنا اڇلايو ويندو. رستي ۾، اهو روڊ هيٺ مسئلا پيدا ڪري سگهي ٿو. مثال طور، اسان کي ڇا ڪرڻ گهرجي جيڪڏهن اسان کي سيريلائيزيشن دوران ڪلاس جو حصو نه گهرجي؟ يا ڇا جيڪڏھن اسان کي پنھنجي TerritoryInfo ڪلاس ’وراثت ذريعي‘ لائبريري جي حصي طور ملي؟ ۽ وڌيڪ فرض ڪريو ته اهو سيريلائيبل نه آهي ۽، مطابق، اسان ان کي تبديل نٿا ڪري سگهون. ان جو مطلب اهو ٿيندو ته اسان پنهنجي SavedGame ڪلاس ۾ TerritoryInfo فيلڊ شامل نٿا ڪري سگهون ، ڇو ته پوءِ سڄو SavedGame ڪلاس غير سيريلائز ٿي ويندو! اھو ھڪڙو مسئلو آھي: / جاوا ۾، ھن قسم جو مسئلو عارضي لفظ ذريعي حل ڪيو ويو آھي. جيڪڏھن توھان ھي لفظ پنھنجي ڪلاس جي ھڪڙي فيلڊ ۾ شامل ڪريو ٿا، ته اھو فيلڊ سيريل نه ڪيو ويندو. اچو ته ڪوشش ڪريون اسان جي SavedGame ڪلاس جي ھڪڙي فيلڊ کي Transient ، ۽ پوءِ اسين ھڪڙي شئي کي سيريلائيز ۽ بحال ڪنداسين. جاوا ۾ سيريلائيزيشن ۽ ڊيسيريلائيزيشن - 2
import java.io.Serializable;

public class SavedGame implements Serializable {

   private transient TerritoryInfo territoryInfo;
   private ResourceInfo resourceInfo;
   private DiplomacyInfo diplomacyInfo;

   public SavedGame(TerritoryInfo territoryInfo, ResourceInfo resourceInfo, DiplomacyInfo diplomacyInfo) {
       this.territoryInfo = territoryInfo;
       this.resourceInfo = resourceInfo;
       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
       TerritoryInfo territoryInfo = new TerritoryInfo("Spain has 6 provinces, Russia has 10 provinces, France has 8 provinces");
       ResourceInfo resourceInfo = new ResourceInfo("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 neutral position");


       SavedGame savedGame = new SavedGame(territoryInfo, resourceInfo, 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{territoryInfo=null, resourceInfo=ResourceInfo{info='اسپين وٽ 100 سون آھي، روس وٽ 80 سون آھي، فرانس وٽ 90 سون آھي'}، diplomacyInfo=DiplomacyInfo{info='فرانس روس، اسپين سان جنگ ۾ آھي. هڪ غيرجانبدار پوزيشن ورتي آهي'}} اهو چيو ته، اسان کي ان سوال جو جواب مليو ته هڪ عارضي فيلڊ کي ڪهڙي قيمت ڏني ويندي. اهو مقرر ڪيل آهي ڊفالٽ قدر. شين لاءِ، هي null آهي . توهان هن موضوع تي هڪ بهترين باب پڙهي سگهو ٿا ڪتاب ’هيڊ فرسٽ جاوا‘ ۾، ان تي ڌيان ڏيو :)
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION