কোন শ্রেণীর Serializable
জাভাতে থাকার অর্থ কী ? বা সাধারণভাবে, এই বিষয়ে ...
কোন শ্রেণীর Serializable
জাভাতে থাকার অর্থ কী ? বা সাধারণভাবে, এই বিষয়ে ...
উত্তর:
সিরিয়ালাইজেশন কোনও জিনিসকে মেমরি থেকে বিটের ক্রম পর্যন্ত স্থির করে রাখে, উদাহরণস্বরূপ ডিস্কে সংরক্ষণ করার জন্য। ডিসেরায়ালাইজেশন এর বিপরীত - ডিস্ক থেকে ডেটা পড়া বা হাইড্রেট করতে / কোনও বস্তু তৈরি করতে।
আপনার প্রশ্নের প্রসঙ্গে এটি একটি ইন্টারফেস যা কোনও শ্রেণিতে প্রয়োগ করা হলে এই শ্রেণিটি স্বয়ংক্রিয়ভাবে সিরিয়ালযুক্ত এবং বিভিন্ন সিরিয়ালেরাইজার দ্বারা deserialized করা যেতে পারে।
যদিও বেশিরভাগ ব্যবহারকারী ইতিমধ্যে উত্তরটি দিয়ে গেছেন, তবে আমি যারা ধারণা প্রয়োজন তাদের জন্য একটি উদাহরণ যুক্ত করতে চাই ধারণাটি ব্যাখ্যা করার জন্য:
ধরা যাক আপনার নিম্নলিখিত শ্রেণীর মতো শ্রেণির একজন ব্যক্তি আছেন:
public class Person implements java.io.Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
public String firstName;
public String lastName;
public int age;
public String address;
public void play() {
System.out.println(String.format(
"If I win, send me the trophy to this address: %s", address));
}
@Override
public String toString() {
return String.format(".....Person......\nFirst Name = %s\nLast Name = %s", firstName, lastName);
}
}
এবং তারপরে আপনি এটির মতো একটি বিষয় তৈরি করুন:
Person william = new Person();
william.firstName = "William";
william.lastName = "Kinaan";
william.age = 26;
william.address = "Lisbon, Portugal";
আপনি অনেকগুলি স্ট্রমে সেই বস্তুটিকে সিরিয়ালিয়াল করতে পারেন। আমি এটি দুটি ধারাতে করব:
স্ট্যান্ডার্ড আউটপুটে সিরিয়ালাইজেশন:
public static void serializeToStandardOutput(Person person)
throws IOException {
OutputStream outStream = System.out;
ObjectOutputStream stdObjectOut = new ObjectOutputStream(outStream);
stdObjectOut.writeObject(person);
stdObjectOut.close();
outStream.close();
}
একটি ফাইলে সিরিয়ালাইজেশন:
public static void serializeToFile(Person person) throws IOException {
OutputStream outStream = new FileOutputStream("person.ser");
ObjectOutputStream fileObjectOut = new ObjectOutputStream(outStream);
fileObjectOut.writeObject(person);
fileObjectOut.close();
outStream.close();
}
তারপর:
ফাইল থেকে deserialize:
public static void deserializeFromFile() throws IOException,
ClassNotFoundException {
InputStream inStream = new FileInputStream("person.ser");
ObjectInputStream fileObjectIn = new ObjectInputStream(inStream);
Person person = (Person) fileObjectIn.readObject();
System.out.println(person);
fileObjectIn.close();
inStream.close();
}
এর অর্থ হল শ্রেণীর উদাহরণগুলি বাইট-স্ট্রিমে পরিণত করা যেতে পারে (উদাহরণস্বরূপ, কোনও ফাইলে সংরক্ষণ করা) এবং তারপরে আবার ক্লাসে রূপান্তরিত হতে পারে। এই পুনরায় লোডিং প্রোগ্রামের ভিন্ন উদাহরণে বা অন্য কোনও মেশিনে ঘটতে পারে। সিরিয়ালাইজেশন (যে কোনও ভাষায়) সমস্ত ধরণের সমস্যা জড়িত, বিশেষত যখন আপনি সিরিয়ালের বাইরে থাকা অন্য সামগ্রীর জন্য রেফারেন্স পেয়েছেন।
সিরিয়ালাইজেশনের বিস্তারিত ব্যাখ্যা এখানে দেওয়া হয়েছে : (আমার নিজস্ব ব্লগ)
ধারাবাহিকতাতে:
সিরিয়ালাইজেশন হ'ল কোনও বস্তুর অবস্থার ক্রমিকায়ন করার প্রক্রিয়াটি বাইটের ক্রম আকারে উপস্থাপিত হয় এবং সংরক্ষণ করা হয়। এটি একটি ফাইলে সংরক্ষণ করা যেতে পারে। ফাইল থেকে অবজেক্টের অবস্থা পড়ার এবং পুনরুদ্ধার করার প্রক্রিয়াটিকে ডেসারিয়ালাইজেশন বলে।
সিরিয়ালাইজেশন করার দরকার কী?
আধুনিক দিনের স্থাপত্যে সর্বদা অবজেক্টের স্টেট সংরক্ষণ করা এবং তারপরে এটি পুনরুদ্ধার করা দরকার। হাইবারনেটে উদাহরণস্বরূপ, কোনও জিনিস সংরক্ষণ করার জন্য আমাদের ক্লাসটি সিরিয়ালাইজেবল করা উচিত। এটি কী করে তা হ'ল একবার যখন বস্তু রাজ্যটি বাইট আকারে সংরক্ষণ করা হয় তবে এটি অন্য সিস্টেমে স্থানান্তরিত হতে পারে যা পরে রাষ্ট্র থেকে পড়তে পারে এবং শ্রেণিটি পুনরুদ্ধার করতে পারে। অবজেক্টের স্টেটাসটি একটি ডাটাবেস বা একটি আলাদা জেভিএম বা একটি পৃথক উপাদান থেকে আসতে পারে। সিরিয়ালাইজেশনের সাহায্যে আমরা অবজেক্টের অবস্থাটি পুনরুদ্ধার করতে পারি।
কোড উদাহরণ এবং ব্যাখ্যা:
প্রথমে আইটেম ক্লাসটি দেখে নেওয়া যাক:
public class Item implements Serializable{
/**
* This is the Serializable class
*/
private static final long serialVersionUID = 475918891428093041L;
private Long itemId;
private String itemName;
private transient Double itemCostPrice;
public Item(Long itemId, String itemName, Double itemCostPrice) {
super();
this.itemId = itemId;
this.itemName = itemName;
this.itemCostPrice = itemCostPrice;
}
public Long getItemId() {
return itemId;
}
@Override
public String toString() {
return "Item [itemId=" + itemId + ", itemName=" + itemName + ", itemCostPrice=" + itemCostPrice + "]";
}
public void setItemId(Long itemId) {
this.itemId = itemId;
}
public String getItemName() {
return itemName;
}
public void setItemName(String itemName) {
this.itemName = itemName;
}
public Double getItemCostPrice() {
return itemCostPrice;
}
public void setItemCostPrice(Double itemCostPrice) {
this.itemCostPrice = itemCostPrice;
}
}
উপরের কোডে এটি দেখা যাবে যে আইটেম শ্রেণি সিরিয়ালাইজযোগ্য প্রয়োগ করে ।
এটি এমন ইন্টারফেস যা কোনও শ্রেণিকে সিরিয়ালাইজ করতে সক্ষম করে।
এখন আমরা দেখতে পাচ্ছি সিরিয়াল ভার্সনিউডিউড নামক একটি ভেরিয়েবল লম্ব ভেরিয়েবলের সাথে আরম্ভ করা হয়। এই সংখ্যাটি ক্লাসের অবস্থা এবং শ্রেণীর বৈশিষ্ট্যের ভিত্তিতে সংকলক দ্বারা গণনা করা হয়। এটি এমন নম্বর যা jvm কোনও বস্তুর অবস্থা শনাক্ত করতে সহায়তা করবে যখন এটি ফাইল থেকে অবজেক্টের অবস্থা পড়বে।
তার জন্য আমরা অফিসিয়াল ওরাকল ডকুমেন্টেশনের দিকে নজর রাখতে পারি:
সিরিয়ালাইজেশন রানটাইমটি প্রতিটি সিরিয়ালযোগ্য ক্লাসের সাথে একটি সংস্করণ সংখ্যার সাথে সহযোগিতা করে, যা একটি সিরিয়াল ভার্সনউইউডিএফ বলে, যা সিরিয়ালাইজড অবজেক্টের প্রেরক এবং রিসিভারের সেই সিরিজটির সাথে সামঞ্জস্যপূর্ণ সেই বস্তুর জন্য ক্লাসগুলি লোড করা হয়েছে তা যাচাই করার জন্য ব্যবহৃত হয় se যদি প্রাপকটি সংশ্লিষ্ট প্রেরকের শ্রেণীর চেয়ে পৃথক সিরিয়াল ভার্সনইউডিউযুক্ত কোনও বস্তুর জন্য কোনও শ্রেণি লোড করে থাকে, তবে ডিসিরিয়ালাইজেশন একটি অবৈধ ক্লাসেক্সেপশন এর ফলস্বরূপ। একটি সিরিয়ালাইজযোগ্য শ্রেণি স্পষ্টরূপে "সিরিয়াল ভার্সনউইডি" নামে একটি ক্ষেত্র ঘোষণা করে যা নিজের স্থির, চূড়ান্ত এবং দীর্ঘ প্রকারের হতে হবে: কোনও-অ্যাক্সেস-মোডিফায়ার স্ট্যাটিক চূড়ান্ত দীর্ঘ সিরিয়াল সংস্করণ = 42 এল; যদি সিরিয়ালাইজযোগ্য শ্রেণি স্পষ্টভাবে একটি সিরিয়াল ভার্সনিউডিউড ঘোষণা না করে, তারপরে সিরিয়ালাইজেশন রানটাইম জাভা (টিএম) অবজেক্ট সিরিয়ালাইজেশন স্পেসিফিকেশনে বর্ণিত শ্রেণীর বিভিন্ন দিকের ভিত্তিতে সেই শ্রেণীর জন্য একটি ডিফল্ট সিরিয়াল ভার্সনিউডিও মান গণনা করবে। যাইহোক, এটির দৃ recommended়ভাবে সুপারিশ করা হয় যে সমস্ত সিরিয়ালাইজযোগ্য ক্লাসগুলি স্পষ্টরূপে সিরিয়াল ভার্সনইউডিউ মানগুলি ঘোষণা করে, যেহেতু ডিফল্ট সিরিয়াল ভার্সনইউড গণনা শ্রেণীর বিবরণগুলির জন্য অত্যন্ত সংবেদনশীল যা সংকলক বাস্তবায়নের উপর নির্ভর করে পৃথক হতে পারে, এবং ফলস্বরূপ deserialization এর সময় অপ্রত্যাশিত অবৈত ক্লাস এক্সেকশন হতে পারে। অতএব, বিভিন্ন জাভা সংকলক প্রয়োগকরণের জুড়ে ধারাবাহিক সিরিয়াল ভার্সনউইড মানটির গ্যারান্টি দিতে, একটি সিরিয়ালাইজযোগ্য শ্রেণিকে অবশ্যই একটি সুস্পষ্ট সিরিয়াল ভার্সনিউড মান ঘোষণা করতে হবে। এটি দৃ strongly়ভাবে পরামর্শ দেওয়া হয় যে সুস্পষ্ট সিরিয়াল ভার্সনইউডিউ ঘোষণাগুলি যেখানে সম্ভব সেখানে ব্যক্তিগত সংশোধক ব্যবহার করুন,
আপনি যদি খেয়াল করে থাকেন যে আমরা ব্যবহার করেছি এমন আরও একটি কীওয়ার্ড রয়েছে যা ক্ষণস্থায়ী ।
যদি ক্ষেত্রটি সিরিয়ালযোগ্য না হয় তবে এটি অবশ্যই ক্ষণস্থায়ী হিসাবে চিহ্নিত করা উচিত। এখানে আমরা আইটেমোস্টপ্রাইসটিকে ক্ষণস্থায়ী হিসাবে চিহ্নিত করেছি এবং এটি কোনও ফাইলে লেখা না চাই
এখন আসুন কীভাবে ফাইলে কোনও বস্তুর অবস্থা লিখতে হবে এবং সেখান থেকে এটি পড়তে হবে সে সম্পর্কে একবার নজর দেওয়া যাক।
public class SerializationExample {
public static void main(String[] args){
serialize();
deserialize();
}
public static void serialize(){
Item item = new Item(1L,"Pen", 12.55);
System.out.println("Before Serialization" + item);
FileOutputStream fileOut;
try {
fileOut = new FileOutputStream("/tmp/item.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(item);
out.close();
fileOut.close();
System.out.println("Serialized data is saved in /tmp/item.ser");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void deserialize(){
Item item;
try {
FileInputStream fileIn = new FileInputStream("/tmp/item.ser");
ObjectInputStream in = new ObjectInputStream(fileIn);
item = (Item) in.readObject();
System.out.println("Serialized data is read from /tmp/item.ser");
System.out.println("After Deserialization" + item);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
উপরের দিকের মধ্যে আমরা কোনও বস্তুর সিরিয়ালাইজেশন এবং ডিসিরিয়ালাইজেশন এর উদাহরণ দেখতে পাচ্ছি।
তার জন্য আমরা দুটি ক্লাস ব্যবহার করেছি। অবজেক্টটি সিরিয়ালাইজ করার জন্য আমরা অবজেক্টআউটপুট স্ট্রিম ব্যবহার করেছি। ফাইলটিতে অবজেক্ট লেখার জন্য আমরা রেকর্ডওজেক্ট পদ্ধতি ব্যবহার করেছি।
ডিসরিয়ালাইজিংয়ের জন্য আমরা অবজেক্ট ইনপুট স্ট্রিম ব্যবহার করেছি যা ফাইল থেকে অবজেক্ট থেকে পড়ে। এটি ফাইল থেকে অবজেক্ট ডেটা পড়তে রিডঅবজেক্ট ব্যবহার করে।
উপরের কোডটির আউটপুটটি এমন হবে:
Before SerializationItem [itemId=1, itemName=Pen, itemCostPrice=12.55]
Serialized data is saved in /tmp/item.ser
After DeserializationItem [itemId=1, itemName=Pen, itemCostPrice=null]
লক্ষ করুন যে, itemCostPrice deserialized বস্তুর থেকে নাল যেমন না লেখা হয়েছিল।
সিরিয়ালাইজেশনের সাথে একটি স্ট্রমে কোনও অবজেক্টের বর্তমান অবস্থা সংরক্ষণ করা এবং সেই স্ট্রিম থেকে সমতুল্য কোনও বস্তু পুনরুদ্ধার করা জড়িত। স্ট্রিমটি অবজেক্টের ধারক হিসাবে কাজ করে
সিরিয়ালাইজেবলকে একটি ইন্টারফেসের মতো বলা হয় তবে এটি আরও সংকলকটির পতাকার মতো। এটি বলে যে এই বস্তুটি সংরক্ষণ করা যায়। সিরিয়ালযোগ্যযোগ্য কোনও বস্তু বাদ না দিয়ে সমস্ত বস্তুগুলির উদাহরণ ভেরিয়েবলগুলি সংরক্ষণ করা হবে।
আপনার অ্যাপ্লিকেশনটি কোনও বিকল্প হিসাবে রঙ পরিবর্তন করতে পারে তা কল্পনা করুন, বাহ্যিক সেটিংটি না রেখেই প্রতিবার যখন আপনি এটি চালান তখন আপনাকে রঙ পরিবর্তন করতে হবে।
সিরিয়ালাইজেশন হ'ল ফাইলগুলিতে অবজেক্ট এবং ডেটা সংরক্ষণ করার বা লেখার একটি কৌশল। ব্যবহার ObjectOutputStream
এবং FileOutputStream
ক্লাস দ্বারা। এই শ্রেণিগুলিতে অবিরত থাকার জন্য তাদের নির্দিষ্ট পদ্ধতি রয়েছে। মতwriteObject();
পরিসংখ্যান সহ স্পষ্ট ব্যাখ্যা জন্য। আরও তথ্যের জন্য এখানে দেখুন
অন্য দৃষ্টিকোণ থেকে উপস্থাপন করা। সিরিয়ালাইজেশন হ'ল এক ধরণের ইন্টারফেস যার নাম 'মার্কার ইন্টারফেস'। একটি চিহ্নিতকারী ইন্টারফেস এমন একটি ইন্টারফেস যা কোনও পদ্ধতি ঘোষণাপত্র রাখে না, তবে কেবলমাত্র এমন শ্রেণি মনোনীত করে (বা "চিহ্ন") যা কিছু সম্পত্তি থাকার হিসাবে ইন্টারফেস প্রয়োগ করে। যদি আপনি বহুত্ববাদ বুঝতে পারেন তবে এটি খুব তাৎপর্যপূর্ণ হবে। সিরিয়ালাইজেবল মার্কার ইন্টারফেসের ক্ষেত্রে, যদি তার যুক্তি ইন্টারফেসটি প্রয়োগ না করে তবে অবজেক্টআউটপুটস্ট্রিম.উইরাইট (অবজেক্ট) পদ্ধতিটি ব্যর্থ হবে। এটি জাভাতে একটি সম্ভাব্য ভুল, এটি অবজেক্টআউটপুট স্ট্রিম.উইরাইট (সিরিয়ালাইজযোগ্য) হতে পারে
উচ্চ প্রস্তাবিত: আরও শিখতে জোশুয়া ব্লচের কার্যকর জাভা থেকে আইটেম 37 পড়া ।
ক্রমিকায়ন: ফাইল / নেটওয়ার্ক বা অন্য কোথাও অবজেক্টের রাজ্য রচনা ing (ফাইল সমর্থিত ফর্ম বা নেটওয়ার্ক সমর্থিত ফর্মের কাছে জাভা অবজেক্ট সমর্থিত ফর্ম)
বিশৃঙ্খলা: ফাইল / নেটওয়ার্ক বা অন্য কোথাও থেকে অবজেক্টের অবস্থা পড়া Read (জাভা অবজেক্ট সমর্থিত ফর্মের কাছে ফাইল / নেটওয়ার্ক সমর্থিত ফর্ম)
কেবলমাত্র অন্যান্য উত্তরগুলিতে যোগ করার জন্য এবং সাধারণতার সাথে সম্মতি জানাতে। সিরিয়ালাইজেশন কখনও কখনও সংরক্ষণাগার হিসাবে পরিচিত, উদাহরণস্বরূপ উদ্দেশ্য-সি।
Serializable
:Serializability of a class is enabled by the class implementing the java.io.Serializable interface. Classes that do not implement this interface will not have any of their state serialized or deserialized. All subtypes of a serializable class are themselves serializable. The serialization interface has no methods or fields and serves only to identify the semantics of being serializable.