CodeGym /جاوا بلاگ /Random-SD /جاوا ۾ serialization ۽ deserialization جي وچ ۾ ڇا فرق آهي...
John Squirrels
سطح
San Francisco

جاوا ۾ serialization ۽ deserialization جي وچ ۾ ڇا فرق آهي؟

گروپ ۾ شايع ٿيل
سلام اڄ جي سبق ۾، اسان جاوا ۾ سيريلائيزيشن ۽ ڊيسيريلائيزيشن بابت ڳالهائينداسين. اسان هڪ سادي مثال سان شروع ڪنداسين. اچو ته چئو ته توهان هڪ ڪمپيوٽر گيم ٺاهيو آهي. جيڪڏهن توهان 90 جي ڏهاڪي ۾ وڏا ٿيا آهيو ۽ ان دور جي گيم ڪنسولز کي ياد ڪريو ٿا، توهان شايد ڄاڻو ٿا ته انهن وٽ ڪجهه نه آهي جنهن کي اسان اڄ تسليم ڪريون ٿا - راندين کي بچائڻ ۽ لوڊ ڪرڻ جي صلاحيت :) جيڪڏهن نه، تصور ڪريو ته! جاوا ۾ serialization ۽ deserialization جي وچ ۾ ڇا فرق آهي؟  - 1 مون کي ڊپ آهي ته اڄ هڪ راند انهن صلاحيتن کان سواء برباد ٿي ويندي! ڪنهن به راند کي ”محفوظ ڪرڻ“ ۽ ”لوڊ“ ڪرڻ جو ڇا مطلب آهي؟ خير، اسان عام معني کي سمجھندا آهيون: اسان راند کي جاري رکڻ چاهيون ٿا جتان اسان ڇڏي ڏنو. هن کي ڪرڻ لاء، اسان هڪ قسم جو "چيڪ پوائنٽ" ٺاهيندا آهيون، جنهن کي اسان وري راند کي لوڊ ڪرڻ لاء استعمال ڪندا آهيون. پر هن جو مطلب ڇا آهي هڪ پروگرامر بجاءِ هڪ آرامده گامر؟ جواب سادو آهي: اسان پنهنجي پروگرام جي حالت بچائي رهيا آهيون . اچو ته چوندا آهن ته توهان اسٽريٽيجيم ۾ اسپين وانگر راند ڪري رهيا آهيو. توھان جي راند ۾ ھڪڙي رياست آھي: ڪير آھي جنھن جا علائقا آھن، ڪنھن وٽ ڪيترا وسيلا آھن، ڪير ڪنھن سان اتحاد ۾ آھي، ڪير ڪنھن سان جنگ ۾ آھي، وغيره. اسان کي ڪنهن به طرح هن معلومات کي محفوظ ڪرڻ گهرجي، اسان جي پروگرام جي رياست، مستقبل ۾ ان کي بحال ڪرڻ ۽ راند کي جاري رکڻ لاء. ان لاءِ اهو ئي آهي ته سيريلائيزيشن ۽ ڊيسيريلائيزيشن ڇا لاءِ آهي. سيريلائيزيشن بائيٽ جي هڪ ترتيب ۾ ڪنهن شئي جي حالت کي محفوظ ڪرڻ جو عمل آهي. Deserialization انهن بائيٽ مان هڪ اعتراض کي بحال ڪرڻ جو عمل آهي. ڪنهن به جاوا اعتراض کي بائيٽ جي ترتيب ۾ تبديل ڪري سگھجي ٿو. اسان کي اها ضرورت ڇو پوندي؟ اسان هڪ دفعو کان وڌيڪ چيو آهي ته پروگرام پنهنجو پاڻ تي موجود نه آهن. گهڻو ڪري، اهي ٻين پروگرامن سان رابطو ڪن ٿا، ڊيٽا مٽائي، وغيره. ۽ هڪ بائيٽ ترتيب هڪ آسان ۽ موثر شڪل آهي. مثال طور، اسان پنهنجي SavedGameاعتراض کي بائيٽ جي ترتيب ۾ تبديل ڪري سگهون ٿا، انهن بائيٽس کي نيٽ ورڪ تي ٻئي ڪمپيوٽر ڏانهن موڪليو، ۽ پوء ٻئي ڪمپيوٽر تي انهن بائيٽ کي واپس جاوا اعتراض ۾ ڦيرايو! ڏکيو آواز، صحيح؟ ۽ هن عمل تي عمل ڪرڻ هڪ درد وانگر لڳي ٿو:/ خوشيء سان، ائين ناهي! :) جاوا ۾، Serializableانٽرفيس سيريلائيزيشن جي عمل لاء ذميوار آهي. هي انٽرفيس انتهائي سادو آهي: توهان کي ان کي استعمال ڪرڻ لاءِ هڪ طريقو لاڳو ڪرڻ جي ضرورت ناهي! ھي آھي ڪيئن سادو اسان جي راند بچائڻ وارو ڪلاس نظر اچي ٿو:
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انهن interfaces مان هڪ آهي. ٻيو اهم نقطو: اسان کي ان private static final long serialVersionUIDمتغير جي ضرورت ڇو آهي جيڪا اسان ڪلاس ۾ بيان ڪئي آهي؟ ان جي ضرورت ڇو آهي؟ ھن فيلڊ ۾ سيريل ٿيل ڪلاس جي ورزن لاءِ ھڪڙو منفرد سڃاڻپ ڪندڙ آھي . ڪو به طبقو جيڪو Serializableانٽرفيس کي لاڳو ڪري ٿو ان کي هڪ versionسڃاڻپ ڪندڙ آهي. اهو ڪلاس جي مواد جي بنياد تي ڳڻيو ويندو آهي: ان جا شعبا، ترتيب جنهن ۾ اهي اعلان ڪيا ويا آهن، طريقا، وغيره. جيڪڏهن اسان تبديل ڪريون ٿا فيلڊ جو قسم ۽/يا پنهنجي ڪلاس ۾ فيلڊن جو تعداد، پوءِ ورجن جي سڃاڻپ ڪندڙ فوري طور تي تبديل ٿي وڃي ٿو. . 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[] 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 neutral position"};

       SavedGame savedGame = new SavedGame(territoryInfo, resourcesInfo, 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 free resources
       objectOutputStream.close();
   }
}
جئين توهان ڏسي سگهو ٿا، اسان 2 اسٽريمز ٺاهيا آهن: FileOutputStream۽ ObjectOutputStream. پهريون هڪ فائل ۾ ڊيٽا لکي سگهي ٿو، ۽ ٻيو هڪ شيون بائيٽ ۾ تبديل ڪري ٿو. توهان اڳ ۾ ئي اهڙيون ”نسٽڊ“ تعميرات ڏٺيون آهن، مثال طور new BufferedReader(new InputStreamReader(...))، پوئين سبقن ۾، تنهن ڪري اهي توهان کي خوفزده نه ڪرڻ گهرجن :) ٻن اسٽريمز جي اهڙي ”زنجيرن“ ٺاهي، اسان ٻئي ڪم سرانجام ڏيون ٿا: اسان اعتراض کي SavedGameهڪ سيٽ ۾ تبديل ڪريون ٿا. of bytes ۽ طريقي سان استعمال ڪندي فائل ۾ محفوظ ڪريو writeObject(). ۽، رستي ۾، اسان اهو به نه ڏٺو ته اسان کي ڇا مليو! اهو فائل ڏسڻ جو وقت آهي! *نوٽ: توهان کي فائل اڳ ۾ ٺاهڻ جي ضرورت ناهي. جيڪڏهن ان نالي سان ڪا فائيل موجود نه آهي، ته اها خود بخود ٺاهي ويندي* ۽ هتي ان جا مواد آهن!

¬н sr SavedGame [ diplomacyInfot [Ljava/lang/String;[ resourcesInfoq ~ [ territoriesInfoq ~ xpur [Ljava.lang.String;­ТVзй{G xp t pФранция воюет СЃ Россией, Испания заняла позицию нейтралитетаuq ~ t "РЈ Испании 100 золотаt РЈ Р РѕСЃСЃРёРё 80 золотаt !РЈ Франции 90 золотаuq ~ t &РЈ Испании 6 провинций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=["Spain has 6 provinces, Russia has 10 provinces, France has 8 provinces], resourcesInfo=[Spain has 100 gold, Russia has 80 gold, France has 90 gold], diplomacyInfo=[France is at war with Russia, Spain has taken a neutral position]}
تمام سٺو! اسان منظم ڪيو ته پهرين اسان جي راند جي حالت کي فائل ۾ محفوظ ڪيو، ۽ پوء ان کي فائل مان بحال ڪيو. هاڻي اچو ته ساڳيو ڪم ڪرڻ جي ڪوشش ڪريون، پر اسان جي SavedGameڪلاس لاء ورزن جي سڃاڻپ ڪندڙ کان سواء. اسان پنهنجي ٻنهي طبقن کي ٻيهر نه لکنداسين. انهن جو ڪوڊ ساڳيو رهندو، پر اسان ڪلاس private static final long serialVersionUIDمان هٽائي ڇڏينداسين SavedGame. هتي سيريلائيزيشن کان پوء اسان جو اعتراض آهي:

¬н sr SavedGameі€MіuОm‰ [ diplomacyInfot [Ljava/lang/String;[ resourcesInfoq ~ [ territoriesInfoq ~ xpur [Ljava.lang.String;­ТVзй{G xp t pФранция воюет СЃ Россией, Испания заняла позицию нейтралитетаuq ~ t "РЈ Испании 100 золотаt РЈ Р РѕСЃСЃРёРё 80 золотаt !РЈ Франции 90 золотаuq ~ t &РЈ Испании 6 провинцийt %РЈ Р РѕСЃСЃРёРё 10 провинцийt &РЈ Франции 8 провинций
پر ڏسو ته ڇا ٿيندو جڏهن اسان ان کي ختم ڪرڻ جي ڪوشش ڪندا آهيون:

InvalidClassException: local class incompatible: stream classdesc serialVersionUID = -196410440475012755, local class serialVersionUID = -6675950253085108747
اھو ھڪڙو استثنا آھي جيڪو اسان مٿي ذڪر ڪيو آھي. رستي ۾، اسان ڪجهه اهم وڃائي ڇڏيو. اهو سمجهه ۾ اچي ٿو ته Strings ۽ primitives آساني سان ترتيب ڏئي سگھجن ٿيون: جاوا شايد اهو ڪرڻ لاءِ ڪجهه قسم جو ٺهيل ميڪانيزم آهي. پر ڇا جيڪڏهن اسان جي serializableطبقي ۾ اهڙا شعبا آهن جيڪي ابتدائي نه آهن، بلڪه ٻين شين جي حوالي سان؟ مثال طور، اچو ته اسان جي طبقي سان ڪم ڪرڻ لاءِ الڳ TerritoriesInfo، ResourcesInfo۽ DiplomacyInfoڪلاس ٺاھيون SavedGame.
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 + '\'' +
               '}';
   }
}
۽ هاڻي هڪ سوال اڀري ٿو: ڇا انهن سڀني طبقن جي ضرورت آهي Serializableجيڪڏهن اسان پنهنجي بدليل 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
       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(territoriesInfo, resourcesInfo, diplomacyInfo);

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

       objectOutputStream.writeObject(savedGame);

       objectOutputStream.close();
   }
}
نتيجو:

Exception in thread "main" java.io.NotSerializableException: DiplomacyInfo
اهو ڪم نه ڪيو! بنيادي طور تي، اهو اسان جي سوال جو جواب آهي. جڏهن هڪ اعتراض سيريل ڪيو ويندو آهي، سڀ شيون ان جي مثال جي متغير جي حوالي سان ترتيب ڏنل آهن. ۽ جيڪڏهن اهي شيون ٻين شين جو حوالو ڏين ٿيون، ته اهي پڻ سيريل آهن. ۽ ائين ئي اشتهار لامحدود. هن زنجير ۾ سڀ طبقن جو هجڻ لازمي آهيSerializable ، ٻي صورت ۾ انهن کي ترتيب ڏيڻ ناممڪن ٿي ويندو ۽ هڪ استثنا اڇلايو ويندو. رستي ۾، اهو روڊ هيٺ مسئلا پيدا ڪري سگهي ٿو. اسان کي ڇا ڪرڻ گهرجي، مثال طور، اسان کي ڪنهن طبقي جي حصي جي ضرورت ناهي جڏهن اسان سيريل ڪريون ٿا؟ يا، مثال طور، جيڪڏهن TerritoryInfoڪلاس اسان وٽ آيو ته ڪنهن ٽئين پارٽي لائبريري جي حصي طور. ۽ وڌيڪ فرض ڪريو ته اهو ناهي Serializable۽، مطابق، اسان ان کي تبديل نٿا ڪري سگهون. اهو ظاهر ٿيو ته اسان TerritoryInfoپنهنجي SavedGameڪلاس ۾ هڪ فيلڊ شامل نه ٿا ڪري سگهون، ڇو ته ائين ڪرڻ سان سڄي SavedGameڪلاس کي غير سيريلائز ٿي ويندو! اھو ھڪڙو مسئلو آھي:/ جاوا ۾ serialization ۽ deserialization جي وچ ۾ ڇا فرق آهي؟  - 2جاوا ۾، ھن قسم جا مسئلا transientلفظ استعمال ڪندي حل ڪيا ويا آھن. جيڪڏھن توھان ھي لفظ پنھنجي ڪلاس جي ھڪڙي فيلڊ ۾ شامل ڪريو ٿا، ته اھو فيلڊ سيريل نه ڪيو ويندو. اچو ته ڪوشش ڪريون ته SavedGameڪلاس جي مثال واري فيلڊ مان هڪ کي عارضي. ان کان پوء اسان هڪ اعتراض کي ترتيب ۽ بحال ڪنداسين.
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
       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(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='Spain has 100 gold, Russia has 80 gold, France has 90 gold'}, diplomacyInfo=DiplomacyInfo{info='France is at war with Russia, Spain has taken a neutral position'}}
اضافي طور تي، اسان کي اسان جي سوال جو جواب مليو ته ڪهڙي قيمت کي transientفيلڊ ۾ لڳايو وڃي ٿو. اهو مقرر ڪيو ويو آهي ڊفالٽ قدر. شين لاء، هي آهي null. توھان پڙھي سگھوٿا ھي شاندار مضمون سيريلائيزيشن تي جڏھن توھان وٽ ڪجھ منٽ آھن. اهو پڻ Externalizableانٽرفيس جو ذڪر ڪري ٿو، جنهن بابت اسان ايندڙ سبق ۾ ڳالهائينداسين. ان کان علاوه، ڪتاب ”هيڊ فرسٽ جاوا“ ۾ ان موضوع تي هڪ باب آهي. ان تي ڪجهه ڌيان ڏيو :)
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION