"আপনি মনে করবেন যে আজ আমরা একটি ফাইল থেকে বস্তু সংরক্ষণ এবং সেগুলি পড়ার তদন্ত করেছি?"

"হ্যাঁ, আমরা এইমাত্র একটি আউটপুট স্ট্রীমে সংরক্ষণ করেছি, একটি ইনপুট স্ট্রীম থেকে একটি পঠিত।"

"ভাল হয়েছে, অ্যামিগো। আপনি এই বিশদ বিবরণগুলি লক্ষ্য করছেন শুনে ভালো লাগছে। আপনি কি কোডটি সম্পূর্ণ করতে পারবেন যাতে এটি একটি ফাইলে সংরক্ষণ করে এবং পড়তে পারে?"

"কি সম্পূর্ণ?! একটি FileInputStream এবং FileOutputStream ঘোষণা করুন এবং সেগুলি সংরক্ষণ এবং লোড পদ্ধতিতে পাস করুন। এখানে বিভ্রান্ত হওয়ার কিছু নেই। খুব সহজ।"

"আমি আপনার জন্য খুশি। এখন একটি নতুন বিষয়ের জন্য: ধারাবাহিককরণ ।"

সিরিয়ালাইজেশন প্রায় একই রকম যা আমরা এইমাত্র করেছি, তবে অনেক ঠান্ডা এবং সরাসরি জাভা মেশিনে তৈরি। জাভা মেশিন তার বস্তু সংরক্ষণ ও লোড করতে পারে। এমনকি এটি করার জন্য সংরক্ষণ এবং লোড পদ্ধতিরও প্রয়োজন নেই: সমস্ত বস্তু জাভা মেশিনের ভিতরে সংরক্ষণ করা হয় এবং এটিতে তাদের সম্পূর্ণ অ্যাক্সেস রয়েছে।"

আমরা কেবল বস্তুটি নিয়ে যাই এবং এটিকে একটি স্ট্রীমে সংরক্ষণ করি এবং একটি প্রবাহ থেকে পড়ি:

কোড
public static void main(String[] args) throws Exception
{
 Cat cat = new Cat();

 //Save a cat to file
 FileOutputStream fileOutput = new FileOutputStream("cat.dat");
 ObjectOutputStream outputStream = new ObjectOutputStream(fileOutput);
 outputStream.writeObject(cat);
 fileOutput.close();
 outputStream.close();

 //Load a cat from file
 FileInputStream fiStream = new FileInputStream("cat.dat");
 ObjectInputStream objectStream = new ObjectInputStream(fiStream);
 Object object = objectStream.readObject();
 fiStream.close();
 objectStream.close();

 Cat newCat = (Cat)object;
}

"এটাই?"

"ঠিক আছে। এখানে একটি খুব বড় এবং জটিল সিরিয়ালাইজেশন মেকানিজম আছে যা আমাদের একটি স্ট্রীমে সেভ করতে দেয় এবং প্রায় যেকোনো ডাটা টাইপের একটি স্ট্রীম থেকে পড়তে দেয়।"

"প্রায় কোনো। তাই কোনো ডাটা টাইপ নয়?"

"হ্যাঁ, আসল বিষয়টি হল যে সমস্ত বস্তুর সংরক্ষণ করার অন্তর্নিহিত ক্ষমতা নেই । কিছু বস্তু তাদের সমস্ত ডেটা অভ্যন্তরীণভাবে সংরক্ষণ করে না। পরিবর্তে, তারা কেবলমাত্র অন্যান্য বস্তু এবং/অথবা ডেটা উত্স উল্লেখ করে। উদাহরণস্বরূপ, কনসোল (সিস্টেম। ইন), একটি ইনপুট স্ট্রীম (ইনপুটস্ট্রিম), এবং অন্যান্য জিনিস।"

এই কারণেই জাভার নির্মাতারা বিশেষ সিরিয়ালাইজেবল ইন্টারফেস মার্কার নিয়ে এসেছেন । এটিকে একটি মার্কার বলা হয় , কারণ এতে কোনো ডেটা এবং পদ্ধতি নেই। এটি শুধুমাত্র "ট্যাগ" বা "মার্ক" ক্লাসে ব্যবহৃত হয়। যদি আমরা বিশ্বাস করি যে আমাদের ক্লাস তার সমস্ত ডেটা অভ্যন্তরীণভাবে সঞ্চয় করে, তাহলে আমরা এটিকে সিরিয়ালাইজেবল প্রয়োগের মাধ্যমে চিহ্নিত করতে পারি ।

এখানে ক্রমিককরণের জন্য সমর্থন সহ একটি "বিড়াল" উদাহরণ রয়েছে:

কোড
class Cat implements Serializable
{
 public String name;
 public int age;
 public int weight;
}

যখন আমরা একটি বস্তুকে সিরিয়ালাইজ (সংরক্ষণ) করার চেষ্টা করি, তখন জাভা মেশিন পরীক্ষা করে যে এটি সিরিয়ালাইজেশন সমর্থন করে কিনা: এটি কি সিরিয়ালাইজেবল ইন্টারফেস বাস্তবায়ন করে? যদি এটি করে তবে এটি বস্তুটিকে সংরক্ষণ করে। যদি তা না হয়, তবে এটি একটি ব্যতিক্রম নির্দেশ করে যে সিরিয়ালাইজেশন অসম্ভব।
এখানে আপনাকে বুঝতে হবে যে একটি সিরিয়ালাইজেবল অবজেক্টে শুধুমাত্র সিরিয়ালাইজেবল অবজেক্ট থাকতে হবে।

"ঠিক আছে, এটা বোধগম্য। আপনি এর অংশগুলি সংরক্ষণ না করে পুরোটি সংরক্ষণ করতে পারবেন না।"

"ঠিক।"

"এবং ints, স্ট্রিং, এবং ArrayLists সম্পর্কে কি?"

"তারা সবাই সিরিয়ালাইজেশন সমর্থন করে। জাভা এর নির্মাতারা এটা নিশ্চিত করার জন্য বিশেষ যত্ন নিয়েছেন। এখানে কোন সমস্যা হওয়া উচিত নয়।"

তাছাড়া, অবজেক্টের টাইপ সেভ করা হয় যখন অবজেক্টটিকে সিরিয়ালাইজ করা হয়। এখন আপনি একটি অবজেক্ট ভেরিয়েবলে একটি Cat অবজেক্টের একটি রেফারেন্স সংরক্ষণ করতে পারেন। সবকিছু ঠিকঠাক সিরিয়াল এবং ডিসিরিয়ালাইজ হবে।

"ডিসিরিয়ালাইজ?"

" ডিসিরিয়ালাইজেশন হল সিরিয়ালাইজেশনকে বিপরীত করার প্রক্রিয়া: একটি স্ট্রিম/ফাইল থেকে একটি বস্তু পড়া এবং পুনর্গঠন করা।"

"আহ, তারপর আর কোন প্রশ্ন নেই।"