প্রথমে আমাকে সিরিয়ালাইজেশন কী তা বোঝাতে হবে।
সিরিয়ালাইজেশন কোনও বস্তুকে নেটওয়ার্কের মাধ্যমে প্রবাহে রূপান্তরিত করতে বা ফাইলটিতে সংরক্ষণ করতে বা অক্ষরে ব্যবহারের জন্য ডিবিতে সংরক্ষণ করতে দেয়।
সিরিয়ালাইজেশনের জন্য কিছু নিয়ম রয়েছে ।
কোনও শ্রেণি বা এর সুপারক্লাস সিরিয়ালাইজেবল ইন্টারফেস প্রয়োগ করলেই কোনও বস্তু সিরিয়ালাইজযোগ্য
কোনও বস্তু সিরিয়ালাইজযোগ্য (নিজেই সিরিয়ালাইজেবল ইন্টারফেস প্রয়োগ করে) এমনকি তার সুপারক্লাস না থাকলেও। তবে সিরিয়ালাইজযোগ্য শ্রেণির শ্রেণিবিন্যাসের প্রথম সুপারক্লাস, যা সিরিয়ালাইজেবল ইন্টারফেস প্রয়োগ করে না, অবশ্যই একটি নো-আরগ কনস্ট্রাক্টর থাকতে হবে। যদি এটি লঙ্ঘন করা হয় তবে রিডওবজেক্ট () একটি জাভা.ইও উত্পাদন করবে run
সমস্ত আদিম ধরণের সিরিয়ালাইজযোগ্য।
ক্ষণস্থায়ী ক্ষেত্রগুলি (ক্ষণস্থায়ী সংশোধক সহ) ক্রমিক নয়, (যেমন, সংরক্ষণ বা পুনরুদ্ধার করা হয়নি)। সিরিয়ালাইজেবল প্রয়োগ করে এমন একটি শ্রেণীর অবশ্যই শ্রেণিবদ্ধের ক্ষণস্থায়ী ক্ষেত্রগুলি চিহ্নিত করতে হবে যা সিরিয়ালাইজেশন সমর্থন করে না (যেমন, একটি ফাইল স্ট্রিম)।
স্ট্যাটিক ক্ষেত্রগুলি (স্ট্যাটিক মডিফায়ার সহ) সিরিয়ালযুক্ত হয় না।
যখন Object
ধারাবাহিকভাবে হয়, জাভা রানটাইম সিরিয়াল সংস্করণ সংখ্যা ওরফে সঙ্ঘ, serialVersionID
।
যেখানে আমাদের সিরিয়াল ভার্সনআইডি দরকার: ডিসিরিয়ালেসনের
সময় প্রেরক এবং গ্রহীতা সিরিয়ালের জন্য সম্মতিযুক্ত তা যাচাই করতে। যদি রিসিভারটি ক্লাসে আলাদা করে লোড করেserialVersionID
তবে ডেসারিয়ালাইজেশনটি শেষ হবেInvalidClassCastException
।
সিরিয়ালীকরণযোগ্য শ্রেণীরserialVersionUID
নামserialVersionUID
স্থির, চূড়ান্ত এবং দীর্ঘ প্রকারের হতে হবে এমনএকটি ক্ষেত্রঘোষণা করে নিজেরস্পষ্টরূপে ঘোষণাকরতে পারে।
এর একটি উদাহরণ দিয়ে চেষ্টা করুন।
import java.io.Serializable;
public class Employee implements Serializable {
private static final long serialVersionUID = 1L;
private String empname;
private byte empage;
public String getEmpName() {
return name;
}
public void setEmpName(String empname) {
this.empname = empname;
}
public byte getEmpAge() {
return empage;
}
public void setEmpAge(byte empage) {
this.empage = empage;
}
public String whoIsThis() {
StringBuffer employee = new StringBuffer();
employee.append(getEmpName()).append(" is ).append(getEmpAge()).append("
years old "));
return employee.toString();
}
}
সিরিয়ালাইজ অবজেক্ট তৈরি করুন
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
public class Writer {
public static void main(String[] args) throws IOException {
Employee employee = new Employee();
employee.setEmpName("Jagdish");
employee.setEmpAge((byte) 30);
FileOutputStream fout = new
FileOutputStream("/users/Jagdish.vala/employee.obj");
ObjectOutputStream oos = new ObjectOutputStream(fout);
oos.writeObject(employee);
oos.close();
System.out.println("Process complete");
}
}
অবজেক্টটি ডিসরিয়ালাইজ করুন
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
public class Reader {
public static void main(String[] args) throws ClassNotFoundException,
IOException {
Employee employee = new Employee();
FileInputStream fin = new
FileInputStream("/users/Jagdish.vala/employee.obj");
ObjectInputStream ois = new ObjectInputStream(fin);
employee = (Employee) ois.readObject();
ois.close();
System.out.println(employee.whoIsThis());
}
}
দ্রষ্টব্য: এখন কর্মচারী শ্রেণীর ক্রমিক সংস্করণ পরিবর্তন করুন এবং সংরক্ষণ করুন:
private static final long serialVersionUID = 4L;
এবং রিডার ক্লাসটি কার্যকর করুন। রাইটার ক্লাসটি কার্যকর করতে নয় এবং আপনি ব্যতিক্রম পাবেন।
Exception in thread "main" java.io.InvalidClassException:
com.jagdish.vala.java.serialVersion.Employee; local class incompatible:
stream classdesc serialVersionUID = 1, local class serialVersionUID = 4
at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:616)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1623)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1518)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1774)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)
at com.krishantha.sample.java.serialVersion.Reader.main(Reader.java:14)