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

জাভাতে সিরিয়ালাইজেশন এবং ডিসিরিয়ালাইজেশন

এলোমেলো দলে প্রকাশিত
ওহে! আজকের পাঠে, আমরা জাভাতে সিরিয়ালাইজেশন এবং ডিসিরিয়ালাইজেশন সম্পর্কে কথা বলব। আমরা একটি সহজ উদাহরণ দিয়ে শুরু করব। কল্পনা করুন যে আপনি একজন কম্পিউটার গেম ডেভেলপার। আপনি যদি 90-এর দশকে বড় হয়ে থাকেন এবং সেই যুগের গেম কনসোলগুলি মনে রাখেন, আপনি সম্ভবত জানেন যে তাদের মধ্যে এমন কিছুর অভাব ছিল যা আমরা আজকে মঞ্জুর করে নিই — গেমগুলি সংরক্ষণ এবং লোড করার ক্ষমতা :) যদি না হয়, তাহলে কল্পনা করুন!জাভাতে সিরিয়ালাইজেশন এবং ডিসিরিয়ালাইজেশন - 1আমি ভীত যে আজ এই ক্ষমতা ছাড়া একটি খেলা ধ্বংস হয়ে যাবে! যাইহোক, একটি গেম 'সংরক্ষণ' এবং 'লোড' করার অর্থ কী? ঠিক আছে, আমরা প্রতিদিনের অর্থ বুঝতে পারি: আমরা যেখান থেকে খেলাটি ছেড়েছি সেখান থেকে খেলা চালিয়ে যেতে চাই। এটি করার জন্য, আমরা একটি নির্দিষ্ট 'চেক পয়েন্ট' তৈরি করি যা আমরা পরে গেমটি লোড করার জন্য ব্যবহার করি। কিন্তু একটি নৈমিত্তিক গেমার পরিবর্তে একটি প্রোগ্রামার মানে কি? উত্তরটি সহজ: আমরা আমাদের প্রোগ্রামের অবস্থা সংরক্ষণ করি। ধরা যাক আপনি একটি কৌশলগত খেলায় স্পেন খেলছেন। আপনার গেমের রাজ্য রয়েছে: প্রত্যেকের কাছে কোন অঞ্চল রয়েছে, প্রত্যেকের কাছে কতগুলি সংস্থান রয়েছে, কী জোট রয়েছে এবং কার সাথে যুদ্ধ চলছে ইত্যাদি। এই তথ্য, আমাদের প্রোগ্রামের অবস্থা, ডেটা পুনরুদ্ধার করতে এবং গেমটি চালিয়ে যাওয়ার জন্য কোনওভাবে সংরক্ষণ করতে হবে। হিসাবে এটা, জাভাতে সিরিয়ালাইজেশন হল বাইটের ক্রম হিসাবে একটি বস্তুর অবস্থা সংরক্ষণ করার প্রক্রিয়া। জাভাতে ডিসিরিয়ালাইজেশন হল এই বাইটগুলি থেকে একটি বস্তু পুনরুদ্ধার করার প্রক্রিয়া। যেকোনো জাভা অবজেক্টকে বাইট সিকোয়েন্সে রূপান্তর করা যায়। আমাদের কেন এটা দরকার? আমরা বারবার বলেছি যে প্রোগ্রামগুলি নিজেদের দ্বারা বিদ্যমান নেই। প্রায়শই, তারা একে অপরের সাথে যোগাযোগ করে, ডেটা বিনিময় করে, ইত্যাদি। এর জন্য একটি বাইট বিন্যাস সুবিধাজনক এবং দক্ষ। উদাহরণস্বরূপ, আমরা আমাদের সেভডগেমের একটি বস্তুকে রূপান্তর করতে পারিবাইটের ক্রমানুসারে ক্লাস করুন, নেটওয়ার্কের মাধ্যমে এই বাইটগুলিকে অন্য কম্পিউটারে স্থানান্তর করুন এবং তারপরে অন্য কম্পিউটারে এই বাইটগুলিকে জাভা অবজেক্টে রূপান্তর করুন! এটা কঠিন শোনাচ্ছে, হাহ? মনে হচ্ছে এই সব ঘটানো কঠিন হবে: / সুখের বিষয়, ব্যাপারটা এমন নয়! :) জাভাতে, সিরিয়ালাইজেবল ইন্টারফেস সিরিয়ালাইজেশন প্রক্রিয়ার জন্য দায়ী। এই ইন্টারফেসটি অত্যন্ত সহজ: এটি ব্যবহার করার জন্য আপনাকে একটি একক পদ্ধতি প্রয়োগ করতে হবে না! গেমগুলি সংরক্ষণের জন্য আমাদের ক্লাসটি কতটা সহজ তা দেখুন:

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) +
               '}';
   }
}
তিনটি অ্যারে অঞ্চল, সংস্থান এবং কূটনীতি সম্পর্কে তথ্যের জন্য দায়ী, এবং সিরিয়ালাইজেবল ইন্টারফেস জাভা মেশিনকে বলে: ' সবকিছু ঠিক আছে যদি এই শ্রেণীর বস্তুগুলিকে সিরিয়ালাইজ করা যায় '।' একটি ইন্টারফেস ছাড়া একটি ইন্টারফেস অদ্ভুত দেখায় :/ কেন এটি প্রয়োজনীয়? এই প্রশ্নের উত্তর উপরে দেওয়া হয়েছে: জাভা মেশিনে প্রয়োজনীয় তথ্য সরবরাহ করার জন্য এটি প্রয়োজন। একটি অতীত পাঠে, আমরা সংক্ষিপ্তভাবে মার্কার ইন্টারফেস উল্লেখ করেছি। এগুলি বিশেষ তথ্যগত ইন্টারফেস যা আমাদের ক্লাসগুলিকে অতিরিক্ত তথ্য দিয়ে চিহ্নিত করে যা ভবিষ্যতে জাভা মেশিনের জন্য উপযোগী হবে। তাদের কোন পদ্ধতি নেই যা আপনাকে বাস্তবায়ন করতে হবে। এখানে সিরিয়ালাইজেবল - এরকম একটি ইন্টারফেস। এখানে আরেকটি গুরুত্বপূর্ণ বিষয়: কেন আমাদের প্রয়োজনপ্রাইভেট স্ট্যাটিক ফাইনাল লং serialVersionUID ভেরিয়েবল যা আমরা ক্লাসে সংজ্ঞায়িত করেছি? এই ক্ষেত্রটিতে ক্রমিক শ্রেণির অনন্য সংস্করণ সনাক্তকারী রয়েছে। সিরিয়ালাইজেবল ইন্টারফেস প্রয়োগকারী প্রতিটি ক্লাসের একটি সংস্করণ শনাক্তকারী রয়েছে। এটি ক্লাসের বিষয়বস্তুর উপর ভিত্তি করে নির্ধারিত হয় — ক্ষেত্র এবং তাদের ঘোষণার আদেশ, এবং পদ্ধতি এবং তাদের ঘোষণার আদেশ। এবং যদি আমরা আমাদের ক্লাসে একটি ক্ষেত্রের ধরন এবং/অথবা ক্ষেত্রের সংখ্যা পরিবর্তন করি, সংস্করণ শনাক্তকারী তাত্ক্ষণিকভাবে পরিবর্তিত হয়। যখন ক্লাসটি সিরিয়াল করা হয় তখন serialVersionUIDও লেখা হয় যখন আমরা ডিসিরিয়ালাইজ করার চেষ্টা করি, অর্থাৎ একটি বাইট সিকোয়েন্স থেকে কোনো বস্তুকে পুনরুদ্ধার করি, সিরিয়াল ভার্সনইউআইডি- এর মানকে সিরিয়াল ভার্সনইউআইডি- এর মানের সঙ্গে তুলনা করা হয়।আমাদের প্রোগ্রামের ক্লাসের। যদি মান মেলে না, তাহলে একটি java.io.InvalidClassException নিক্ষেপ করা হবে। আমরা নীচে এই একটি উদাহরণ দেখতে পাবেন. এই ধরনের পরিস্থিতি এড়াতে, আমরা আমাদের ক্লাসের জন্য ম্যানুয়ালি সংস্করণ শনাক্তকারী সেট করি। আমাদের ক্ষেত্রে, এটি কেবল 1 এর সমান হবে (আপনি আপনার পছন্দ মতো অন্য যে কোনও নম্বর ব্যবহার করতে পারেন)। ঠিক আছে, আমাদের সেভডগেম অবজেক্টকে সিরিয়ালাইজ করার চেষ্টা করার এবং কী ঘটে তা দেখার সময় এসেছে !

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 । প্রথমটি জানে কিভাবে ফাইলে ডেটা লিখতে হয় এবং দ্বিতীয়টি বস্তুকে বাইটে রূপান্তর করে। আপনি ইতিমধ্যেই অনুরূপ নেস্টেড নির্মাণ দেখেছেন, উদাহরণস্বরূপ, নতুন বাফারডরিডার(নতুন ইনপুটস্ট্রিমরিডার(...)) , পূর্ববর্তী পাঠে, যাতে তারা আপনাকে ভয় না দেখায় :) দুটি স্ট্রীমের এই চেইন তৈরি করে, আমরা উভয় কাজ সম্পাদন করি: আমরা SavedGame অবজেক্টটিকে বাইটের ক্রমানুসারে রূপান্তর করি এবং writeObject() পদ্ধতি ব্যবহার করে একটি ফাইলে সংরক্ষণ করি। এবং, যাইহোক, আমরা যা পেয়েছি তার দিকেও তাকাইনি! এটা ফাইল দেখার সময়! *দ্রষ্টব্য: ফাইলটি আগে থেকে তৈরি করার প্রয়োজন নেই। যদি নির্দিষ্ট নামের একটি ফাইল বিদ্যমান না থাকে, তাহলে এটি স্বয়ংক্রিয়ভাবে তৈরি হয়ে যাবে* এবং এখানে এর বিষয়বস্তু রয়েছে: ¬н sr SavedGame [ diplomacyInfot [Ljava/lang/String; [ resourceInfoq ~ [ territoryInfoq ~ xpur [Ljava.lang। স্ট্রিং;¬ТVзй{G xp t pФранция РІРСЋРµС, СЃ Р РССЃСЃРёРµР, " етаuq ~ t "РЈ Р˜СЃРїР°РЅРё 100 Р·РслоС,Рt РЈ Р РѕСЃСЃСЃРёRё 80 золи°0РЈ 6% анции ৮টি ওহ, ওহ :( মনে হচ্ছে আমাদের প্রোগ্রামটি কাজ করেনি : ( আসলে, এটি কাজ করেছে। আপনার মনে আছে যে আমরা ফাইলটিতে একটি বস্তু বা পাঠ্য নয়, বাইটের একটি ক্রম পাঠিয়েছিলাম? আচ্ছা, এই বাইট ক্রমটি কি দেখে মনে হচ্ছে :) এটি আমাদের সংরক্ষিত গেম! আমরা যদি আমাদের আসল অবজেক্ট পুনরুদ্ধার করতে চাই, অর্থাত্‍ গেমটি যেখান থেকে ছেড়ে দিয়েছিলাম সেটি শুরু করতে এবং চালিয়ে যেতে চাই, তাহলে আমাদের বিপরীত প্রক্রিয়ার প্রয়োজন: ডিসিরিয়ালাইজেশন৷ এটি আমাদের কাছে এটির মতো দেখাচ্ছে:

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 ক্লাস থেকে সংস্করণ শনাক্তকারীকে সরিয়ে দেব । আমরা আমাদের উভয় ক্লাস পুনরায় লিখব না. তাদের কোড একই হবে। আমরা শুধু সেভডগেম ক্লাস থেকে ব্যক্তিগত স্ট্যাটিক চূড়ান্ত দীর্ঘ সিরিয়াল সংস্করণ ইউআইডি সরিয়ে দেব। ক্রমিককরণের পরে আমাদের অবজেক্ট এখানে: ¬ন sr সংরক্ষিত গেমই€মিউওম‰ [ কূটনীতি ইনফোট [Ljava/lang/String;[ resourceInfoq ~ [ territoryInfoq ~ xpur [Ljava.lang.String;¬TVзй{G xp t pРранСРСЏ ЃРёРµР№, আমি РсСр °T ЅС†РёР№t% РЈ РсСЃСЃРёРё 10 првинцийt &РЈ Фр°РЅС†РёРё 8 првинциР№ কিন্তু আমরা চেষ্টা করি যখন স্থানীয় ক্লাসে কি ঘটবে তা দেখুন প্যাটিবল: স্ট্রিম ক্লাসডেস্ক সিরিয়াল ভার্সন ইউআইডি = -196410440475012755, স্থানীয় ক্লাস সিরিয়াল ভার্সন ইউআইডি = -6675950253085108747 যাইহোক, আমরা গুরুত্বপূর্ণ কিছু মিস করেছি। স্পষ্টতই, স্ট্রিং এবং আদিম সহজে ক্রমিক করা হয়: জাভা অবশ্যই এর জন্য কিছু অন্তর্নির্মিত প্রক্রিয়া আছে। কিন্তু যদি আমাদের সিরিয়ালাইজেবল ক্লাসে এমন ক্ষেত্র থাকে যা আদিম নয়, বরং অন্যান্য বস্তুর উল্লেখ থাকে? উদাহরণস্বরূপ, আসুন আমাদের সেভডগেম ক্লাসের সাথে কাজ করার জন্য আলাদা 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 + '\'' +
               '}';
   }
}
এবং এখন আমরা একটি প্রশ্নের সম্মুখীন হচ্ছি: যদি আমরা আমাদের সেভডগেম ক্লাসকে সিরিয়ালাইজ করতে চাই তবে কি এই সমস্ত ক্লাস সিরিয়ালাইজযোগ্য হতে হবে ?

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();
   }
}
ফলাফল: "প্রধান" থ্রেডে ব্যতিক্রম java.io.NotSerializableException: DiplomacyInfo এটা কাজ করেনি! সুতরাং, এখানে আমাদের প্রশ্নের উত্তর. যখন একটি বস্তুকে ক্রমিক করা হয়, তখন তার দৃষ্টান্ত ভেরিয়েবল দ্বারা উল্লেখ করা সমস্ত বস্তুকে ক্রমিক করা হয়। এবং যদি সেই বস্তুগুলি অন্যান্য বস্তুরও উল্লেখ করে, তবে সেগুলিও সিরিয়ালাইজ করা হয়। এবং অনন্তকাল। এই চেইনের সমস্ত শ্রেণী অবশ্যই সিরিয়ালাইজযোগ্য হতে হবে , অন্যথায় সেগুলিকে সিরিয়াল করা অসম্ভব হবে এবং একটি ব্যতিক্রম নিক্ষেপ করা হবে। যাইহোক, এটি রাস্তার নিচে সমস্যা তৈরি করতে পারে। উদাহরণস্বরূপ, সিরিয়ালাইজেশনের সময় যদি আমাদের একটি ক্লাসের অংশের প্রয়োজন না হয় তবে আমাদের কী করা উচিত? অথবা যদি আমরা একটি লাইব্রেরির অংশ হিসাবে 'উত্তরাধিকারের মাধ্যমে' আমাদের টেরিটরি ইনফো ক্লাস পেয়েছি? এবং আরও ধরুন যে এটি 'এবং, সেই অনুযায়ী, আমরা এটি পরিবর্তন করতে পারি না। এর অর্থ হ'ল আমরা আমাদের সেভডগেম ক্লাসে একটি টেরিটরি ইনফো ক্ষেত্র যুক্ত করতে পারি না , কারণ তখন পুরো সেভডগেম ক্লাসটি সিরিয়ালাইজেবল হয়ে যাবে! এটি একটি সমস্যা: / জাভাতে, এই ধরণের সমস্যাটি ক্ষণস্থায়ী কীওয়ার্ড দ্বারা সমাধান করা হয়। আপনি যদি আপনার ক্লাসের একটি ক্ষেত্রে এই কীওয়ার্ড যোগ করেন, তাহলে সেই ক্ষেত্রটি সিরিয়াল করা হবে না। আসুন আমাদের সেভডগেম ক্লাসের একটি ক্ষেত্রকে ক্ষণস্থায়ী করার চেষ্টা করি , এবং তারপরে আমরা একটি একক অবজেক্টকে সিরিয়ালাইজ এবং পুনরুদ্ধার করব। জাভাতে সিরিয়ালাইজেশন এবং ডিসিরিয়ালাইজেশন - 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='ফ্রান্স রাশিয়া, স্পেনের সাথে যুদ্ধ করছে একটি নিরপেক্ষ অবস্থান নিয়েছে'}} এটি বলে, আমরা একটি ক্ষণস্থায়ী ক্ষেত্রের জন্য কী মান নির্ধারণ করা হবে সেই প্রশ্নের উত্তর পেয়েছি । এটি ডিফল্ট মান নির্ধারণ করা হয়। বস্তুর জন্য, এটি নাল । আপনি 'হেড-ফার্স্ট জাভা' বইটিতে এই বিষয়ে একটি চমৎকার অধ্যায় পড়তে পারেন, এটিতে মনোযোগ দিন :)
মন্তব্য
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION