CodeGym/Java Blog/এলোমেলো/জাভাতে সিরিয়ালাইজেশন এবং ডিসিরিয়ালাইজেশনের মধ্যে পার্থক...
John Squirrels
লেভেল 41
San Francisco

জাভাতে সিরিয়ালাইজেশন এবং ডিসিরিয়ালাইজেশনের মধ্যে পার্থক্য কী?

এলোমেলো দলে প্রকাশিত
সদস্যগণ
ওহে! আজকের পাঠে, আমরা জাভাতে সিরিয়ালাইজেশন এবং ডিসিরিয়ালাইজেশন সম্পর্কে কথা বলব। আমরা একটি সহজ উদাহরণ দিয়ে শুরু করব। ধরা যাক আপনি একটি কম্পিউটার গেম তৈরি করেছেন। আপনি যদি 90 এর দশকে বড় হয়ে থাকেন এবং সেই যুগের গেম কনসোলগুলি মনে রাখেন, আপনি সম্ভবত জানেন যে তাদের মধ্যে এমন কিছুর অভাব ছিল যা আমরা আজকে মঞ্জুর করে নিই — গেমগুলি সংরক্ষণ এবং লোড করার ক্ষমতা :) যদি না হয়, তাহলে কল্পনা করুন! জাভাতে সিরিয়ালাইজেশন এবং ডিসিরিয়ালাইজেশনের মধ্যে পার্থক্য কী?  - ১ আমি ভয় পাচ্ছি যে আজ এই ক্ষমতা ছাড়া একটি খেলা ধ্বংস হয়ে যাবে! যাইহোক একটি গেম "সংরক্ষণ" এবং "লোড" করার অর্থ কী? ঠিক আছে, আমরা সাধারণ অর্থ বুঝতে পারি: আমরা যেখান থেকে খেলাটি ছেড়েছিলাম সেখান থেকে আমরা খেলাটি চালিয়ে যেতে চাই। এটি করার জন্য, আমরা এক ধরণের "চেক পয়েন্ট" তৈরি করি, যা আমরা গেমটি লোড করতে ব্যবহার করি। কিন্তু এটি একটি নৈমিত্তিক গেমার পরিবর্তে একটি প্রোগ্রামার মানে কি? উত্তরটি সহজ: আমরা'. ধরা যাক আপনি স্ট্র্যাটেজিয়ামে স্পেন হিসেবে খেলছেন। আপনার খেলার একটি রাষ্ট্র আছে: কে কোন অঞ্চলের মালিক, কার কত সম্পদ আছে, কে কার সাথে জোটে আছে, কে কার সাথে যুদ্ধ করছে ইত্যাদি। ভবিষ্যতে এটি পুনরুদ্ধার করতে এবং গেমটি চালিয়ে যাওয়ার জন্য আমাদের অবশ্যই এই তথ্য, আমাদের প্রোগ্রামের অবস্থা সংরক্ষণ করতে হবে। এই জন্য অবিকল কি ক্রমিককরণ এবং deserealization জন্য. সিরিয়ালাইজেশন হল বাইটের ক্রমানুসারে বস্তুর অবস্থা সংরক্ষণ করার প্রক্রিয়া। ডিসিরিয়ালাইজেশনএই বাইটগুলি থেকে একটি বস্তু পুনরুদ্ধার করার প্রক্রিয়া। যেকোনো জাভা অবজেক্টকে বাইট সিকোয়েন্সে রূপান্তর করা যায়। কেন আমরা যে প্রয়োজন হবে? আমরা একাধিকবার বলেছি যে প্রোগ্রামগুলি তাদের নিজস্ব অস্তিত্ব নেই। প্রায়শই, তারা অন্যান্য প্রোগ্রামের সাথে ইন্টারঅ্যাক্ট করে, ডেটা বিনিময় করে। এবং একটি বাইট সিকোয়েন্স একটি সুবিধাজনক এবং কার্যকর বিন্যাস। উদাহরণস্বরূপ, আমরা আমাদের 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যারা ইন্টারফেস এক. আরেকটি গুরুত্বপূর্ণ বিষয়: কেন আমরা 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
এটি আমরা উপরে উল্লিখিত খুব ব্যতিক্রম। যাইহোক, আমরা গুরুত্বপূর্ণ কিছু মিস করেছি। এটা বোঝায় যে স্ট্রিং এবং আদিম সহজে ক্রমিক করা যেতে পারে: জাভা সম্ভবত এটি করার জন্য কিছু ধরণের অন্তর্নির্মিত ব্যবস্থা রয়েছে। কিন্তু যদি আমাদের 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 + '\'' +
               '}';
   }
}
এবং এখন একটি প্রশ্ন উঠছে: আমরা যদি আমাদের পরিবর্তিত ক্লাসকে সিরিয়ালাইজ করতে চাই তবে কি এই সমস্ত ক্লাস হওয়া দরকার ?SerializableSavedGame
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ক্লাসটাই সিরিয়াল করা যাবে না! এটি একটি সমস্যা :/ জাভাতে সিরিয়ালাইজেশন এবং ডিসিরিয়ালাইজেশনের মধ্যে পার্থক্য কী?  - 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, যা আমরা পরবর্তী পাঠে আলোচনা করব। উপরন্তু, "হেড-ফার্স্ট জাভা" বইটিতে এই বিষয়ে একটি অধ্যায় রয়েছে। একটু মনোযোগ দিন :)
মন্তব্য
  • জনপ্রিয়
  • নতুন
  • পুরানো
মন্তব্য লেখার জন্য তোমাকে অবশ্যই সাইন ইন করতে হবে
এই পাতায় এখনও কোনো মন্তব্য নেই