JavaRush /جاوا بلاگ /Random-SD /جاوا ۾ سيريلائيزيشن ۽ ڊيسيريلائيزيشن

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

گروپ ۾ شايع ٿيل
سلام! اڄ جي ليڪچر ۾ اسين جاوا ۾ سيريلائيزيشن ۽ ڊيسيريلائيزيشن بابت ڳالهائينداسين. اچو ته هڪ سادي مثال سان شروع ڪريون. اچو ته چئو ته توهان ڪمپيوٽر جي راند جو خالق آهيو. جيڪڏهن توهان 90 جي ڏهاڪي ۾ وڌيا آهيو ۽ انهن وقتن جي راند ڪنسولز کي ياد ڪريو، توهان شايد ڄاڻو ٿا ته اهي اڄ واضح طور تي ڪجهه نه هئا - راندين کي بچائڻ ۽ لوڊ ڪرڻ :) جيڪڏهن نه ... تصور ڪريو! مون کي ڊپ آهي ته اڄ هڪ راند بغير ڪنهن موقعي جي ناڪام ٿي ويندي! ۽، اصل ۾، ڇا آهي "بچائي" ۽ "لوڊنگ" هڪ راند؟ خير، معمولي معنى ۾، اسان سمجھون ٿا ته اهو ڇا آهي: اسان راند کي جاري رکڻ چاهيون ٿا جتان اسان آخري ڀيرو ڇڏيا هئا. هن کي ڪرڻ لاء، اسان هڪ قسم جو "چوڪ پوائنٽ" ٺاهيندا آهيون، جنهن کي اسين پوء راند کي لوڊ ڪرڻ لاء استعمال ڪندا آهيون. پر اهو ڇا مطلب آهي، روزمره جي معني ۾ نه، پر "پروگرامر" جي معني ۾؟ جواب سادو آهي: اسان پنهنجي پروگرام جي حالت کي بچايو. اچو ته چئو ته توهان اسپين لاءِ حڪمت عملي واري راند کيڏي رهيا آهيو. توهان جي راند ۾ هڪ رياست آهي: ڪير ڪهڙين علائقن جو مالڪ آهي، ڪنهن وٽ ڪيترا وسيلا آهن، ڪير ڪنهن سان اتحاد ۾ آهي، ۽ ڪير، ان جي برعڪس، جنگ ۾ آهي، وغيره. هي معلومات، اسان جي پروگرام جي حالت، ڪنهن به طرح محفوظ ڪيو وڃي ته جيئن بعد ۾ ڊيٽا کي بحال ڪرڻ ۽ راند کي جاري رکڻ لاء. اهو ئي آهي جيڪو سيريلائيزيشن ۽ ڊيسيريلائيزيشن جي ميڪانيزم لاء استعمال ڪيو ويو آهي . سيريلائيزيشن هڪ اعتراض جي حالت کي بائيٽ جي ترتيب ۾ محفوظ ڪرڻ جو عمل آهي. Deserialization انهن بائيٽس مان ڪنهن شئي کي ٻيهر ٺاهڻ جو عمل آهي. ڪنهن به جاوا اعتراض کي بائيٽ جي ترتيب ۾ تبديل ڪيو ويندو آهي. ڇا لاءِ آهي؟ اسان هڪ کان وڌيڪ ڀيرا چيو آهي ته پروگرام پنهنجو پاڻ تي موجود نه آهن. گهڻو ڪري اهي هڪ ٻئي سان لهه وچڙ، مٽا سٽا ڊيٽا، وغيره. ۽ بائيٽ فارميٽ هن لاءِ آسان ۽ ڪارائتو آهي. اسان، مثال طور، اسان جي ڪلاس آبجیکٹ 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جيڪو اسان ڪلاس ۾ بيان ڪيو آهي. ان جي ضرورت ڇو آهي؟ ھن فيلڊ ۾ سيريل ٿيل ڪلاس جي منفرد ورزن جي سڃاڻپ ڪندڙ آھي . ڪو به طبقو جيڪو لاڳو ڪري ٿو Serializable انٽرفيس وٽ هڪ ورزن جي سڃاڻپ ڪندڙ آهي. اهو ڪلاس جي مواد جي بنياد تي حساب ڪيو ويو آهي - فيلڊ، اعلان آرڊر، طريقا. ۽ جيڪڏھن اسان پنھنجي ڪلاس ۾ فيلڊ جو قسم ۽/يا فيلڊن جو تعداد تبديل ڪريون ٿا، ورجن جي سڃاڻپ ڪندڙ فوري طور تي تبديل ٿي ويندو. 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(). ۽، رستي ۾، اسان اهو به نه چيڪ ڪيو ته اسان کي ڇا مليو! اهو فائل ڏسڻ جو وقت آهي! *نوٽ: فائل کي اڳ ۾ پيدا ٿيڻ جي ضرورت ناهي. جيڪڏهن ان نالي سان ڪا فائيل موجود نه آهي، ته اها خود بخود ٺاهي ويندي* ۽ هتي ان جا مواد آهن! ¬n sr محفوظ ٿيل راند [ سفارتي ڄاڻ [Ljava/lang/String؛ [sourceInfoq ~ [ territoriesInfoq ~ xpur їР° هههههههههههههههههههههههههههههههههههههههههههههههه рѓѓѓѓѓѓѓѓѓѓѓѓѓѓѓѓѓѓѓѓёёёёёё · · »° ° ј !ёёёё 90 рё ·ё ·ё · · · ~ ~ ѓ ~ ј ~їј ~ёј їј ~ї№ђђ ٪сс р ѓѓёёёёёѓёѓѓѓёѓёё ѓёїёёђђђђіёёёёіі " †RёR№t &RЈ ФрРРЅС†РеРё 8 првввнций اڙي :( لڳي ٿو اسان جو پروگرام ڪم نه ڪيو :( اصل ۾، اهو ڪم ڪيو. توهان کي ياد آهي ته اسان فائلن جو بلڪل هڪ سيٽ، بائيٽ ۽ بائيٽ کي منتقل ڪيو آهي. نه صرف هڪ اعتراض يا متن؟ خير، هي اهو آهي جيڪو هي سيٽ ڏسڻ ۾ اچي ٿو :) هي اسان جي محفوظ ڪيل راند آهي! جيڪڏهن اسان پنهنجي اصل اعتراض کي بحال ڪرڻ چاهيون ٿا، اهو آهي، لوڊ ڪريو ۽ راند کي جاري رکو جتان اسان ڇڏيا هئا، اسان کي ضرورت آهي ريورس عمل , deserialization ... اھو اھو آھي جيڪو اسان جي صورت ۾ نظر ايندو:
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 صوبا آهن]، ResourceInfo=[اسپين وٽ 100 سونا آهن، روس وٽ 80 سون آهن، فرانس وٽ 90 سون آهن]، diplomacyInfo=[فرانس وٽ روس سان جنگ آهي، اسپين غيرجانبداريءَ جي پوزيشن تي قبضو ڪري ورتو آهي]} زبردست! اسان منظم ڪيو ته پهرين اسان جي راند جي حالت کي فائل ۾ محفوظ ڪيو، ۽ پوء ان کي فائل مان بحال ڪيو. هاڻي اچو ته ساڳيو ڪم ڪرڻ جي ڪوشش ڪريو، پر SavedGameاسان جي ڪلاس مان ورجن جي سڃاڻپ ڪندڙ کي هٽائي ڇڏيو. اسان پنهنجي ٻنهي طبقن کي ٻيهر نه لکنداسين، انهن ۾ ڪوڊ ساڳيو هوندو، اسان صرف SavedGameهٽائي ڇڏينداسين private static final long serialVersionUID. هتي اسان جو اعتراض آهي سيريلائيزيشن کان پوءِ: ¬н sr SavedGameі€MіuOm‰ [ diplomacyInfot [Ljava/lang/String؛ [sourceInfoq ~ [ territoriesInfoq ~ xpur ، ѓѓ ёёѓѓѓѓѓѓѓѓѓѓѓѓѓѓсѓѓѕѓѓѓѓѓџ ° №ѕѕѕѕѕѕѕѕћћћћћћћћћћћћћћрррррррррррђђђррјјјј ћ~ ~јјјррр ёрё 100 р · РсР»РСС,Р РЈ Р СЃСЃСЃ Рё 80 Р·Р»РС,RС,R !RЈ ¤ ¤ ¤ ¤ ¤ ¤ ¤ ¤ ¤ ¤ , , , ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, 10 فيصد ۽ 8 ёРЅА ۽ جڏهن ان کي ختم ڪرڻ جي ڪوشش ڪئي وئي، اهو ئي ٿيو: 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();
   }
}
نتيجو: سلسلي ۾ استثنا "main" 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,sourceInfo=ResourcesInfo{info='اسپين وٽ 100 سون، روس وٽ 80 سون، فرانس وٽ 90 سون آھن'}، diplomacyInfo=DiplomacyInfo{info='فرانس روس سان جنگ ۾ آھي، اسپين هڪ پوزيشن غير جانبداري ورتي آهي'}} ساڳئي وقت، اسان کي ان سوال جو جواب مليو ته ڪهڙي قيمت transient-فيلڊ کي مقرر ڪيو ويندو. اهو هڪ ڊفالٽ قدر مقرر ڪيو ويو آهي. شين جي صورت ۾ اهو آهي null. توھان جي فرصت ۾، توھان پڙھي سگھوٿا ھي شاندار مضمون سيريلائيزيشن بابت . اهو پڻ انٽرفيس بابت ڳالهائيندو آهي Externalizable، جنهن بابت اسان ايندڙ ليڪچر ۾ ڳالهائينداسين. ان کان سواء، هن موضوع تي ڪتاب ۾ هڪ باب آهي "سر پهريون جاوا"، ان تي ڌيان ڏيو :)
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION