জাভা Serializable
এবং পার্থক্য কি Externalizable
?
জাভা Serializable
এবং পার্থক্য কি Externalizable
?
উত্তর:
অন্যান্য উত্তরগুলিতে যোগ করার জন্য, প্রয়োগ করে java.io.Serializable
আপনি আপনার শ্রেণীর অবজেক্টের জন্য "স্বয়ংক্রিয়" সিরিয়ালাইজেশন ক্ষমতা পাবেন। অন্য কোনও যুক্তি বাস্তবায়নের দরকার নেই, এটি কেবল কাজ করবে। জাভা রানটাইম কীভাবে আপনার জিনিসগুলি মার্শাল এবং আনমারশাল করতে পারে তা নির্ধারণ করতে প্রতিবিম্ব ব্যবহার করবে।
জাভার পূর্ববর্তী সংস্করণে প্রতিফলন খুব ধীর ছিল, এবং তাই বৃহত অবজেক্ট গ্রাফগুলিকে সিরিয়ালাইজ করা (যেমন ক্লায়েন্ট-সার্ভার আরএমআই অ্যাপ্লিকেশনগুলিতে) কিছুটা পারফরম্যান্স সমস্যা ছিল। এই পরিস্থিতিটি পরিচালনা করার java.io.Externalizable
জন্য, ইন্টারফেসটি সরবরাহ করা হয়েছিল, যা java.io.Serializable
মার্শেলিং এবং আনমারশেলিং ফাংশনগুলি সম্পাদন করার জন্য কাস্টম-লিখিত পদ্ধতিগুলির সাথে ( আপনার ক্লাসে আপনার প্রয়োগ readExternal
এবং writeExternal
পদ্ধতিগুলি প্রয়োজন) like এটি আপনাকে প্রতিবিম্ব কর্মক্ষমতা বাধা অতিক্রম করার উপায় দেয়।
জাভার সাম্প্রতিক সংস্করণগুলিতে (অবশ্যই 1.3 এর পরে, অবশ্যই) প্রতিচ্ছবিটির পারফরম্যান্স আগের তুলনায় অনেক বেশি ভাল, এবং তাই এটি কোনও সমস্যার তুলনায় অনেক কম। আমি সন্দেহ করি যে আপনি Externalizable
একটি আধুনিক জেভিএম এর মাধ্যমে অর্থবহ সুবিধা পেতে কঠোর চাপ পেয়েছেন ।
এছাড়াও, অন্তর্নির্মিত জাভা সিরিয়ালাইজেশন প্রক্রিয়াটি কেবলমাত্র একটিই নয়, আপনি তৃতীয় পক্ষের প্রতিস্থাপন যেমন জেবস সিরিয়ালাইজেশন পেতে পারেন যা যথেষ্ট দ্রুত এবং এটি ডিফল্টর জন্য একটি ড্রপ-ইন প্রতিস্থাপন।
একটি বড় Externalizable
ক্ষয়ক্ষতি হ'ল আপনাকে এই যুক্তিটি নিজেই বজায় রাখতে হবে - আপনি যদি নিজের ক্লাসে কোনও ক্ষেত্র যুক্ত করেন, সরিয়ে ফেলেন বা পরিবর্তন করেন তবে আপনাকে অ্যাকাউন্ট writeExternal
/ readExternal
অ্যাকাউন্টগুলি পরিবর্তন করতে হবে।
সংক্ষেপে, Externalizable
জাভা 1.1 দিনের একটি প্রতীক। এটির আর আর দরকার নেই।
Externalizable
সাহায্য করে ।
Externalizable
আমার চেয়ে আরও ভাল its -ক্লাস সহজেই কলটিতে কল করে লকিং যুক্ত করতে পারে writeExternal()
। হ্যাঁ, বহিরাগত এখনও খুব প্রাসঙ্গিক, অবশ্যই বড় বা জটিল বস্তুর জন্য।
সিরিয়ালাইজেশন বস্তুটি সংরক্ষণ এবং পরে পুনরায় তৈরি করতে ডিফল্ট কার্যকারিতা সরবরাহ করে। এটি সংরক্ষণ করার জন্য সামগ্রীর পুরো গ্রাফটি সংজ্ঞায়িত করতে ভার্বোজ ফর্ম্যাট ব্যবহার করে যেমন ধরুন আপনার লিঙ্কযুক্ত তালিকা রয়েছে এবং নীচের মতো আপনার কোড রয়েছে, তবে ডিফল্ট সিরিয়ালাইজড সমস্ত বস্তু আবিষ্কার করবে যা সংযুক্ত রয়েছে এবং সিরিয়াল হবে will ডিফল্ট সিরিয়ালাইজেশনে অবজেক্টটি সম্পূর্ণরূপে তার সঞ্চিত বিট থেকে তৈরি করা হয়, কোনও কনস্ট্রাক্টর কল ছাড়াই।
ObjectOutputStream oos = new ObjectOutputStream(
new FileOutputStream("/Users/Desktop/files/temp.txt"));
oos.writeObject(linkedListHead); //writing head of linked list
oos.close();
তবে আপনি যদি সীমাবদ্ধ সিরিয়ালাইজেশন চান বা আপনার অবজেক্টের কিছু অংশ ক্রমিকায়িত করতে চান না তবে এক্সটার্নালাইজেবল ব্যবহার করুন। বাহ্যিক ইন্টারফেস ইন্টারফেস সিরিয়ালাইজেবল ইন্টারফেস প্রসারিত করে এবং দুটি পদ্ধতি যুক্ত করে, WritExtern () এবং readExtern ()। সিরিয়ালাইজেশন বা ডেসারিয়ালাইজেশন করার সময় এগুলি স্বয়ংক্রিয়ভাবে বলা হয়। এক্সটার্নাইজেবলের সাথে কাজ করার সময় আমাদের মনে রাখা উচিত যে ডিফল্ট নির্মাতা জনসাধারণের হওয়া উচিত অন্যথায় কোডটি ব্যতিক্রম ছুঁড়ে দেবে। নীচের কোডটি অনুসরণ করুন:
public class MyExternalizable implements Externalizable
{
private String userName;
private String passWord;
private Integer roll;
public MyExternalizable()
{
}
public MyExternalizable(String userName, String passWord, Integer roll)
{
this.userName = userName;
this.passWord = passWord;
this.roll = roll;
}
@Override
public void writeExternal(ObjectOutput oo) throws IOException
{
oo.writeObject(userName);
oo.writeObject(roll);
}
@Override
public void readExternal(ObjectInput oi) throws IOException, ClassNotFoundException
{
userName = (String)oi.readObject();
roll = (Integer)oi.readObject();
}
public String toString()
{
StringBuilder b = new StringBuilder();
b.append("userName: ");
b.append(userName);
b.append(" passWord: ");
b.append(passWord);
b.append(" roll: ");
b.append(roll);
return b.toString();
}
public static void main(String[] args)
{
try
{
MyExternalizable m = new MyExternalizable("nikki", "student001", 20);
System.out.println(m.toString());
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("/Users/Desktop/files/temp1.txt"));
oos.writeObject(m);
oos.close();
System.out.println("***********************************************************************");
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("/Users/Desktop/files/temp1.txt"));
MyExternalizable mm = (MyExternalizable)ois.readObject();
mm.toString();
System.out.println(mm.toString());
}
catch (ClassNotFoundException ex)
{
Logger.getLogger(MyExternalizable.class.getName()).log(Level.SEVERE, null, ex);
}
catch(IOException ex)
{
Logger.getLogger(MyExternalizable.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
এখানে আপনি যদি ডিফল্ট নির্মাতাকে মন্তব্য করেন তবে কোডটি ব্যতিক্রমের নীচে ফেলে দেবে:
java.io.InvalidClassException: javaserialization.MyExternalizable;
javaserialization.MyExternalizable; no valid constructor.
আমরা পর্যবেক্ষণ করতে পারি যে পাসওয়ার্ডটি সংবেদনশীল তথ্য, সুতরাং আমি এটিকে লেখার বাহ্যিক (অবজেক্টআউটপুট oo) পদ্ধতিতে সিরিয়াল করছি না এবং পঠন-বহিরাগতের (অবজেক্টইনপুট ওআই) এর মান নির্ধারণ করছি না। এটি নমনীয়তা যা বহিরাগত দ্বারা সরবরাহ করা হয়।
উপরের কোডটির আউটপুট নীচে অনুযায়ী:
userName: nikki passWord: student001 roll: 20
***********************************************************************
userName: nikki passWord: null roll: 20
আমরা পর্যবেক্ষণ করতে পারি যেহেতু আমরা পাসওয়ার্ডের মান নির্ধারণ করছি না তাই এটি বাতিল।
পাসওয়ার্ড ক্ষেত্রকে ক্ষণস্থায়ী হিসাবে ঘোষণা করেও এটি অর্জন করা যায়।
private transient String passWord;
আশা করি এটা সাহায্য করবে. আমি কোন ভুল হলে আমি ক্ষমা চাই। ধন্যবাদ।
Serializable
এবং মধ্যে মূল পার্থক্যExternalizable
Serializable
কোনও পদ্ধতি ছাড়াই চিহ্নিত ইন্টারফেস। Externalizable
ইন্টারফেস দুটি পদ্ধতি রয়েছে: writeExternal()
এবং readExternal()
।Serializable
ইন্টারফেস প্রয়োগকারী ক্লাসগুলির জন্য শুরু করা হবে । প্রোগ্রামার সংজ্ঞায়িত সিরিয়ালাইজেশন প্রক্রিয়াটি Externalizable
ইন্টারফেস প্রয়োগকারী ক্লাসগুলির জন্য লাথি-ইন করা হবে ।Externalizable
ইন্টারফেসের সাথে পুরো নিয়ন্ত্রণ থাকতে পারে । আপনি আপনার বস্তুর বিভিন্ন সংস্করণ সমর্থন করতে পারেন। আপনি যদি প্রয়োগ করেন Externalizable
তবে super
ক্লাসটি সিরিয়াল করা আপনার দায়িত্বSerializable
অবজেক্ট তৈরিতে প্রতিবিম্ব ব্যবহার করে এবং কোনও আরগ কনস্ট্রাক্টরের প্রয়োজন হয় না। তবে Externalizable
পাবলিক নো-আরগ কনস্ট্রাক্টর দাবি করে।পড়ুন ব্লগ দ্বারা Hitesh Garg
আরো বিস্তারিত জানার জন্য।
সিরিয়ালাইজেশন অবজেক্টটি সংরক্ষণ এবং পুনরায় তৈরি করতে নির্দিষ্ট ডিফল্ট আচরণ ব্যবহার করে। রেফারেন্স এবং জটিল ডেটা স্ট্রাকচার কী অর্ডারে বা পরিচালনা করতে হয় তা আপনি নির্দিষ্ট করতে পারেন তবে শেষ পর্যন্ত এটি প্রতিটি আদিম ডেটা ক্ষেত্রের জন্য ডিফল্ট আচরণ ব্যবহার করে নেমে আসে।
বাহ্যিকরণ এমন বিরল ক্ষেত্রে ব্যবহৃত হয় যা আপনি সত্যই আপনার অবজেক্টটিকে সম্পূর্ণ ভিন্ন উপায়ে সঞ্চয় করতে এবং পুনর্নির্মাণ করতে চান এবং ডেটা ক্ষেত্রগুলির জন্য ডিফল্ট সিরিয়ালাইজেশন প্রক্রিয়া ব্যবহার না করেই ব্যবহার করেন। উদাহরণস্বরূপ, কল্পনা করুন যে আপনার নিজের অনন্য এনকোডিং এবং সংক্ষেপণ স্কিম ছিল।
অবজেক্ট সিরিয়ালাইজেশন সিরিয়ালাইজেবল এবং এক্সটার্নালাইজেবল ইন্টারফেস ব্যবহার করে। একটি জাভা অবজেক্ট কেবল সিরিয়ালাইজযোগ্য। যদি কোনও শ্রেণি বা এর সুপারক্লাসগুলির কোনওটি জাভা.আইও.সিরাইজযোগ্য ইন্টারফেস বা এর সাব-ইন্টারফেস, জাভা.আই.ও এক্সটার্নালাইজেবল কার্যকর করে। জাভা ক্লাসের বেশিরভাগই সিরিয়ালযোগ্য ।
NotSerializableException
: packageName.ClassName
Serial সিরিয়ালাইজেশন প্রক্রিয়াতে কোনও ক্লাস অবজেক্টে অংশ নিতে, শ্রেণিকে অবশ্যই সিরিয়ালাইজেবল বা বহিরাগতযোগ্য ইন্টারফেস প্রয়োগ করতে হবে।অবজেক্ট সিরিয়ালাইজেশন সেভ করা হচ্ছে এমন বস্তুর জাভা ক্লাস সম্পর্কে তথ্য সহ একটি স্ট্রিম তৈরি করে। সিরিয়ালাইজযোগ্য অবজেক্টের জন্য, শ্রেণি বাস্তবায়নের একটি পৃথক (তবে সামঞ্জস্যপূর্ণ) সংস্করণ উপস্থিত থাকলেও সেই তথ্যগুলি পুনরুদ্ধার করার জন্য পর্যাপ্ত তথ্য রাখা হয়। সিরিয়ালাইজেবল ইন্টারফেসটি এমন শ্রেণিগুলি সনাক্ত করতে সংজ্ঞায়িত করা হয় যা সিরিয়ালাইজযোগ্য প্রোটোকল প্রয়োগ করে:
package java.io;
public interface Serializable {};
InvalidClassException
Se deserialization প্রক্রিয়ায়, যদি স্থানীয় শ্রেণীর ক্রমিক সংস্করণ মান সংশ্লিষ্ট প্রেরকের শ্রেণীর চেয়ে আলাদা হয়। তারপরে ফলাফল হিসাবে বিরোধ হিসাবে
java.io.InvalidClassException: com.github.objects.User; local class incompatible: stream classdesc serialVersionUID = 5081877, local class serialVersionUID = 50818771
বহির্মুখী বস্তুর জন্য, কেবলমাত্র বস্তুর শ্রেণীর পরিচয় ধারক দ্বারা সংরক্ষণ করা হয়; শ্রেণিকে অবশ্যই সামগ্রীগুলি সংরক্ষণ এবং পুনরুদ্ধার করতে হবে। বহির্মুখী ইন্টারফেসটি নিম্নলিখিত হিসাবে সংজ্ঞায়িত করা হয়েছে:
package java.io;
public interface Externalizable extends Serializable
{
public void writeExternal(ObjectOutput out)
throws IOException;
public void readExternal(ObjectInput in)
throws IOException, java.lang.ClassNotFoundException;
}
OptionalDataException
We ক্ষেত্রগুলি একই অর্ডার এবং প্রকারের মধ্যে থাকা উচিত যেমন আমরা তাদের লিখেছি। স্ট্রিম থেকে যদি কোনও অমিলের ধরণ থাকে তবে এটি ptionচ্ছিক ডেটাএক্সসেপশনকে ছুড়ে ফেলে।
@Override public void writeExternal(ObjectOutput out) throws IOException {
out.writeInt( id );
out.writeUTF( role );
out.writeObject(address);
}
@Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
this.id = in.readInt();
this.address = (Address) in.readObject();
this.role = in.readUTF();
}
শ্রেণীর উদাহরণ ক্ষেত্র যা সিরিয়ালযুক্ত হওয়ার জন্য লিখিত (উন্মুক্ত)ObjectOutput
।
উদাহরণ « কার্যকরী Serializable
class Role {
String role;
}
class User extends Role implements Serializable {
private static final long serialVersionUID = 5081877L;
Integer id;
Address address;
public User() {
System.out.println("Default Constructor get executed.");
}
public User( String role ) {
this.role = role;
System.out.println("Parametarised Constructor.");
}
}
class Address implements Serializable {
private static final long serialVersionUID = 5081877L;
String country;
}
উদাহরণ « বহির্মুখী প্রয়োগ করে
class User extends Role implements Externalizable {
Integer id;
Address address;
// mandatory public no-arg constructor
public User() {
System.out.println("Default Constructor get executed.");
}
public User( String role ) {
this.role = role;
System.out.println("Parametarised Constructor.");
}
@Override
public void writeExternal(ObjectOutput out) throws IOException {
out.writeInt( id );
out.writeUTF( role );
out.writeObject(address);
}
@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
this.id = in.readInt();
this.address = (Address) in.readObject();
this.role = in.readUTF();
}
}
উদাহরণ
public class CustomClass_Serialization {
static String serFilename = "D:/serializable_CustomClass.ser";
public static void main(String[] args) throws IOException {
Address add = new Address();
add.country = "IND";
User obj = new User("SE");
obj.id = 7;
obj.address = add;
// Serialization
objects_serialize(obj, serFilename);
objects_deserialize(obj, serFilename);
// Externalization
objects_WriteRead_External(obj, serFilename);
}
public static void objects_serialize( User obj, String serFilename ) throws IOException{
FileOutputStream fos = new FileOutputStream( new File( serFilename ) );
ObjectOutputStream objectOut = new ObjectOutputStream( fos );
// java.io.NotSerializableException: com.github.objects.Address
objectOut.writeObject( obj );
objectOut.flush();
objectOut.close();
fos.close();
System.out.println("Data Stored in to a file");
}
public static void objects_deserialize( User obj, String serFilename ) throws IOException{
try {
FileInputStream fis = new FileInputStream( new File( serFilename ) );
ObjectInputStream ois = new ObjectInputStream( fis );
Object readObject;
readObject = ois.readObject();
String calssName = readObject.getClass().getName();
System.out.println("Restoring Class Name : "+ calssName); // InvalidClassException
User user = (User) readObject;
System.out.format("Obj[Id:%d, Role:%s] \n", user.id, user.role);
Address add = (Address) user.address;
System.out.println("Inner Obj : "+ add.country );
ois.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static void objects_WriteRead_External( User obj, String serFilename ) throws IOException {
FileOutputStream fos = new FileOutputStream(new File( serFilename ));
ObjectOutputStream objectOut = new ObjectOutputStream( fos );
obj.writeExternal( objectOut );
objectOut.flush();
fos.close();
System.out.println("Data Stored in to a file");
try {
// create a new instance and read the assign the contents from stream.
User user = new User();
FileInputStream fis = new FileInputStream(new File( serFilename ));
ObjectInputStream ois = new ObjectInputStream( fis );
user.readExternal(ois);
System.out.format("Obj[Id:%d, Role:%s] \n", user.id, user.role);
Address add = (Address) user.address;
System.out.println("Inner Obj : "+ add.country );
ois.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
@দেখা
বহির্মুখী ইন্টারফেসটি সিরিয়ালাইজেশন প্রক্রিয়াটির পারফরম্যান্সটিকে অনুকূল করার জন্য আসলে সরবরাহ করা হয়নি! তবে আপনার নিজস্ব কাস্টম প্রসেসিং বাস্তবায়নের মাধ্যম সরবরাহ করার জন্য এবং কোনও অবজেক্ট এবং এর সুপার টাইপের স্ট্রিমের ফর্ম্যাট এবং সামগ্রীর উপর সম্পূর্ণ নিয়ন্ত্রণ অফার করুন!
নেটওয়ার্কের মাধ্যমে নেটিভ অ্যাকশন স্ক্রিপ্ট অবজেক্টগুলি স্থানান্তর করতে এএমএফ (অ্যাকশনস্ক্রিপ্ট মেসেজ ফর্ম্যাট) রিমোটিং এর উদাহরণগুলি।
https://docs.oracle.com/javase/8/docs/platform/serialization/spec/serialTOC.html
ডিফল্ট সিরিয়ালাইজেশন কিছুটা ভার্বোজ, এবং সিরিয়ালাইজড অবজেক্টের আরও প্রশস্ত সম্ভাব্য ব্যবহারের দৃশ্যধারণ করে এবং তদনুসারে ডিফল্ট ফর্ম্যাট (সিরিয়ালাইজেবল) সিরিয়ালাইজড অবজেক্টের শ্রেণি সম্পর্কে তথ্য সহ ফলস্রোত স্ট্রোমে টীকায় দেয়।
বহিরাগতকরণ অবজেক্টের স্ট্রিমের প্রযোজককে শ্রেণীর সর্বনিম্ন প্রয়োজনীয় সনাক্তকরণ (যেমন এর নাম) এর বাইরে নির্দিষ্ট শ্রেণির মেটা-ডেটা (যদি থাকে তবে) এর উপরে সম্পূর্ণ নিয়ন্ত্রণ দেয় complete এটি নির্দিষ্ট পরিস্থিতিতে যেমন স্পষ্টভাবে কাম্য, যেমন বন্ধ পরিবেশ, যেখানে বস্তু স্ট্রিমের প্রযোজক এবং তার গ্রাহক (যা স্ট্রিম থেকে বস্তুকে পুনরায় বোঝায়) মিলছে এবং শ্রেণি সম্পর্কে অতিরিক্ত মেটাডেটা কোনও উদ্দেশ্য করে না এবং কর্মক্ষমতা হ্রাস করে।
অতিরিক্তভাবে (উরি উল্লেখ হিসাবে) বহিরাগতকরণ জাভা প্রকারের সাথে সম্পর্কিত স্ট্রিমে ডেটা এনকোডিংয়ের উপর সম্পূর্ণ নিয়ন্ত্রণেরও সরবরাহ করে। (স্বীকৃত) উদাহরণস্বরূপ, আপনি বুলিয়ান সত্য হিসাবে 'Y' হিসাবে এবং মিথ্যাটিকে 'N' হিসাবে রেকর্ড করতে পারেন। বাহ্যিকরণ আপনাকে এটি করতে দেয়।
কর্মক্ষমতা উন্নয়নের জন্য বিকল্পগুলি বিবেচনা করার সময়, কাস্টম সিরিয়ালাইজেশন ভুলবেন না। আপনি জাভা যা ভাল তা করতে পারেন বা কমপক্ষে যথেষ্ট ভাল, নিখরচায় করতে পারেন এবং এটি খারাপভাবে করার জন্য কাস্টম সহায়তা সরবরাহ করতে পারে। এটি সাধারণত সম্পূর্ণ বহিরাগত সাপোর্টের তুলনায় অনেক কম কোড।
সিরিয়ালাইজেবল এবং এক্সটারনালাইজেবলের মধ্যে অনেক পার্থক্য রয়েছে তবে আমরা যখন কাস্টম সিরিয়ালাইজেবল (ওভাররাইডেড রাইটওজেক্ট () এবং রিডঅবজেক্ট ()) এবং এক্সটারনালাইজেবলের মধ্যে পার্থক্যটি তুলনা করি তখন আমরা দেখতে পাই কাস্টম প্রয়োগটি দৃ Ob়ভাবে অবজেক্ট আউটপুটস্ট্রিম শ্রেণীর সাথে আবদ্ধ যেখানে বহিরাগত ক্ষেত্রে আমরা নিজেরাই অবজেক্টআউটপুট একটি বাস্তবায়ন সরবরাহ করুন যা অবজেক্টআউটপুট স্ট্রিম শ্রেণি হতে পারে বা এটি org.apache.mina.filter.codec.serialization.ObjectSerializationOutputStream এর মতো অন্য কিছু হতে পারে provide
বাহ্যিক ইন্টারফেসের ক্ষেত্রে
@Override
public void writeExternal(ObjectOutput out) throws IOException {
out.writeUTF(key);
out.writeUTF(value);
out.writeObject(emp);
}
@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
this.key = in.readUTF();
this.value = in.readUTF();
this.emp = (Employee) in.readObject();
}
**In case of Serializable interface**
/*
We can comment below two method and use default serialization process as well
Sequence of class attributes in read and write methods MUST BE same.
// below will not work it will not work .
// Exception = java.io.StreamCorruptedException: invalid type code: 00\
private void writeObject(java.io.ObjectOutput stream)
*/
private void writeObject(java.io.ObjectOutputStream Outstream)
throws IOException {
System.out.println("from writeObject()");
/* We can define custom validation or business rules inside read/write methods.
This way our validation methods will be automatically
called by JVM, immediately after default serialization
and deserialization process
happens.
checkTestInfo();
*/
stream.writeUTF(name);
stream.writeInt(age);
stream.writeObject(salary);
stream.writeObject(address);
}
private void readObject(java.io.ObjectInputStream Instream)
throws IOException, ClassNotFoundException {
System.out.println("from readObject()");
name = (String) stream.readUTF();
age = stream.readInt();
salary = (BigDecimal) stream.readObject();
address = (Address) stream.readObject();
// validateTestInfo();
}
আমি আরও ভালভাবে ব্যাখ্যা করতে স্যাম্পল কোড যুক্ত করেছি। দয়া করে বাহ্যিকের ক্ষেত্রে / আউট অবজেক্টের ক্ষেত্রে চেক করুন। এগুলি সরাসরি কোনও প্রয়োগের জন্য আবদ্ধ নয়।
যেখানে আউটস্ট্রিম / ইনস্ট্রিমেশন ক্লাসের সাথে দৃly়ভাবে আবদ্ধ। আমরা অবজেক্টআউটপুটস্ট্রিম / অবজেক্টআইপুট স্ট্রিম প্রসারিত করতে পারি তবে এটি ব্যবহার করা কিছুটা কঠিন।
মূলত, Serializable
এটি একটি মার্কার ইন্টারফেস যা বোঝায় যে কোনও শ্রেণি সিরিয়ালাইজেশনের জন্য নিরাপদ এবং জেভিএম নির্ধারণ করে যে এটি কীভাবে সিরিয়ালায়িত হয়। Externalizable
2 পদ্ধতি রয়েছে, readExternal
এবং writeExternal
। Externalizable
প্রবর্তককে কোনও বস্তু কীভাবে সিরিয়ালাইজ করা হয় তা নির্ধারণের অনুমতি দেয়, যেখানে Serializable
সিরিয়াল হিসাবে বস্তুগুলি ডিফল্ট উপায়ে হয়।
কিছু পার্থক্য:
সিরিয়ালাইজেশনের জন্য class শ্রেণীর ডিফল্ট নির্মাণকারীর প্রয়োজন নেই কারণ অবজেক্ট কারণ জেভিএম রিফ্লেকশন এপিআইয়ের সাহায্যে একইটি নির্মাণ করে। কোনও আরগের সাথে বহিরাগতকরণের কনট্রাক্টরের ক্ষেত্রে প্রয়োজনীয়তা নেই, কারণ নিয়ন্ত্রণটি প্রোগ্রামারের হাতে থাকে এবং পরে সেটটারগুলির মাধ্যমে আপত্তি জানাতে ডিসরিওলাইজড ডেটা নির্ধারণ করে।
সিরিয়ালাইজেশনে ব্যবহারকারী যদি নির্দিষ্ট বৈশিষ্ট্যগুলি সিরিয়ালায়িত করার জন্য ছেড়ে যেতে চান তবে সেই বৈশিষ্ট্যটিকে ক্ষণস্থায়ী হিসাবে চিহ্নিত করতে হবে, বিপরীতে বহিরাগতকরণের জন্য প্রয়োজনীয় নয়।
যখন কোনও শ্রেণীর জন্য পশ্চাদপটে সামঞ্জস্য সমর্থন সমর্থন করা হয় তখন বহিরাগতের সাথে যাওয়ার পরামর্শ দেওয়া হয়। সিরিয়ালাইজেশন ডিফল্ট অবজেক্ট অব্যাহত রাখার সমর্থন করে এবং যদি অবজেক্টের কাঠামোটি ভেঙে যায় তবে এটি ডিসস্রায়ালাইজ করার সময় সমস্যা তৈরি করবে।