উত্তর:
transient
জাভা শব্দ নির্দেশ করে একটি ক্ষেত্র ধারাবাহিকতাতে অংশ (যার মানে রক্ষা করা উচিত হবে না ব্যবহার করা হয় মত প্রক্রিয়া একটি ফাইলে)।
থেকে জাভা ল্যাঙ্গুএজ স্পেসিফিকেশন, জাভা SE 7 সংস্করণ , অনুচ্ছেদ 8.3.1.3। transient
ক্ষেত্রসমূহ :
ভেরিয়েবলগুলি চিহ্নিত
transient
করা যেতে পারে যে তারা কোনও বস্তুর স্থির অবস্থার অংশ নয় indicate
উদাহরণস্বরূপ, আপনার ক্ষেত্রগুলি থাকতে পারে যা অন্যান্য ক্ষেত্র থেকে উদ্ভূত হয়েছে এবং কেবল সিরিয়ালাইজেশনের মাধ্যমে রাজ্যকে অবিচল রাখার পরিবর্তে কেবল প্রোগ্রামিকভাবে এটি করা উচিত।
এখানে একটি GalleryImage
শ্রেণি এখানে একটি চিত্র এবং চিত্র থেকে প্রাপ্ত একটি থাম্বনেইল রয়েছে:
class GalleryImage implements Serializable
{
private Image image;
private transient Image thumbnailImage;
private void generateThumbnail()
{
// Generate thumbnail.
}
private void readObject(ObjectInputStream inputStream)
throws IOException, ClassNotFoundException
{
inputStream.defaultReadObject();
generateThumbnail();
}
}
এই উদাহরণে, এটি thumbnailImage
একটি থাম্বনেইল চিত্র যা generateThumbnail
পদ্ধতিটি আহ্বানের মাধ্যমে উত্পন্ন হয় ।
thumbnailImage
ক্ষেত্র হিসেবে চিহ্নিত করা হয় transient
, তাই শুধুমাত্র মূল image
উভয় মূল ইমেজ এবং থাম্বনেল চিত্র persisting বদলে ধারাবাহিকভাবে হয়। এর অর্থ সিরিয়ালযুক্ত বস্তুটি সংরক্ষণ করার জন্য কম স্টোরেজ প্রয়োজন হবে। (অবশ্যই, এটি সিস্টেমের প্রয়োজনীয়তার উপর নির্ভর করে কাঙ্ক্ষিত হতে পারে বা নাও পারে - এটি কেবল একটি উদাহরণ।)
ডিসেরায়ালাইজেশন করার সময়, readObject
পদ্ধতিটিকে বলা হয় যে ক্রিয়াকলাপটি ঘটেছিল সেই অবস্থায় ফিরে আসার জন্য অবজেক্টের অবস্থা পুনরুদ্ধার করতে প্রয়োজনীয় যে কোনও ক্রিয়াকলাপ করতে হবে। এখানে থাম্বনেইল তৈরি করা দরকার, সুতরাং readObject
পদ্ধতিটি ওভাররাইড করা হয় যাতে generateThumbnail
পদ্ধতিটি কল করে থাম্বনেল তৈরি করা যায় ।
অতিরিক্ত তথ্যের জন্য, জাভা সিরিয়ালাইজেশন এপিআই নিবন্ধের গোপন বিষয়গুলি আবিষ্কার করুন (যা মূলত সান ডেভেলপার নেটওয়ার্কে উপলব্ধ ছিল) এর একটি বিভাগ রয়েছে যা ব্যবহারের বিষয়ে আলোচনা করে এবং এমন একটি দৃশ্যের উপস্থাপন করে যেখানে transient
নির্দিষ্ট ক্ষেত্রের ক্রমিককরণ রোধ করতে মূল শব্দটি ব্যবহৃত হয়।
মূলশব্দটি বোঝার আগে transient
একজনকে সিরিয়ালকরণের ধারণাটি বুঝতে হবে। পাঠক যদি সিরিয়ালাইজেশন সম্পর্কে জানেন তবে দয়া করে প্রথম বিষয়টি এড়িয়ে যান।
সিরিয়ালাইজেশন হ'ল অবজেক্টের অবস্থা স্থির করার প্রক্রিয়া। তার অর্থ অব্যাহত রাখার জন্য (যেমন কোনও ফাইলের বাইটস সংরক্ষণ করা) বা স্থানান্তরিতকরণ (যেমন কোনও নেটওয়ার্ক জুড়ে বাইট প্রেরণ করা) ব্যবহারের জন্য অবজেক্টের অবস্থা বাইটের স্ট্রিমে রূপান্তরিত হয়। একইভাবে, আমরা বাইটগুলি থেকে অবজেক্টের স্থিতি ফিরিয়ে আনতে deserialization ব্যবহার করতে পারি। এটি জাভা প্রোগ্রামিংয়ের একটি গুরুত্বপূর্ণ ধারণা কারণ সিরিয়ালাইজেশন বেশিরভাগ নেটওয়ার্কিং প্রোগ্রামিংয়ে ব্যবহৃত হয়। নেটওয়ার্কের মাধ্যমে যে জিনিসগুলিকে সঞ্চারিত করতে হবে তাদের বাইটে রূপান্তর করতে হবে। সে লক্ষ্যে প্রতিটি শ্রেণি বা ইন্টারফেসকে অবশ্যই ইন্টারফেস প্রয়োগ করতে হবে Serializable
। এটি কোনও পদ্ধতি ছাড়াই একটি মার্কার ইন্টারফেস।
transient
কীওয়ার্ড এবং এর উদ্দেশ্য কী?ডিফল্টরূপে, অবজেক্টের সমস্ত ভেরিয়েবল স্থির অবস্থায় রূপান্তরিত হয়। কিছু ক্ষেত্রে, আপনি কিছু ভেরিয়েবলকে অবিরাম রাখতে এড়াতে চাইতে পারেন কারণ আপনার সেই ভেরিয়েবলগুলি বজায় রাখার দরকার নেই। সুতরাং আপনি সেই পরিবর্তনশীল হিসাবে ঘোষণা করতে পারেন transient
। যদি ভেরিয়েবল হিসাবে ঘোষিত হয় transient
তবে তা স্থির থাকবে না। এটি মূল শব্দটির মূল উদ্দেশ্য transient
।
আমি নিম্নলিখিত উদাহরণ দিয়ে উপরোক্ত দুটি বিষয়গুলি ব্যাখ্যা করতে চাই:
package javabeat.samples;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
class NameStore implements Serializable{
private String firstName;
private transient String middleName;
private String lastName;
public NameStore (String fName, String mName, String lName){
this.firstName = fName;
this.middleName = mName;
this.lastName = lName;
}
public String toString(){
StringBuffer sb = new StringBuffer(40);
sb.append("First Name : ");
sb.append(this.firstName);
sb.append("Middle Name : ");
sb.append(this.middleName);
sb.append("Last Name : ");
sb.append(this.lastName);
return sb.toString();
}
}
public class TransientExample{
public static void main(String args[]) throws Exception {
NameStore nameStore = new NameStore("Steve", "Middle","Jobs");
ObjectOutputStream o = new ObjectOutputStream(new FileOutputStream("nameStore"));
// writing to object
o.writeObject(nameStore);
o.close();
// reading from object
ObjectInputStream in = new ObjectInputStream(new FileInputStream("nameStore"));
NameStore nameStore1 = (NameStore)in.readObject();
System.out.println(nameStore1);
}
}
এবং আউটপুট নিম্নলিখিত হবে:
First Name : Steve
Middle Name : null
Last Name : Jobs
মধ্য নামটি ঘোষিত হয়েছে transient
, সুতরাং এটি অবিরাম স্টোরেজে সংরক্ষণ করা হবে না।
NameFormatter
ড্রাইভ করার জন্য ব্যবহৃত একটি রেফারেন্স থাকতে পারে toString()
। বা তথ্যের বিপরীতে কনফিগারেশন, বা দেখা, বা ব্যবসায়ের যুক্তি সম্পর্কিত ...
আপনাকে ভেরিয়েবলগুলি সংজ্ঞায়িত করার অনুমতি দেওয়ার জন্য যা আপনি সিরিয়ালাইজ করতে চান না।
কোনও অবজেক্টে আপনার কাছে এমন তথ্য থাকতে পারে যা আপনি সিরিয়ালাইজ / ক্রমাগত রাখতে চান না (সম্ভবত কোনও পিতামাতার ফ্যাক্টরি অবজেক্টের কোনও রেফারেন্স), বা সম্ভবত এটি সিরিয়ালিয়াস করার কোনও মানে হয় না। এগুলিকে 'ক্ষণস্থায়ী' হিসাবে চিহ্নিত করার অর্থ সিরিয়ালাইজেশন প্রক্রিয়া এই ক্ষেত্রগুলিকে উপেক্ষা করবে।
আমার ছোট অবদান:
ক্ষণস্থায়ী ক্ষেত্র কী?
মূলত, transient
কীওয়ার্ডের সাহায্যে সংশোধিত যে কোনও ক্ষেত্রই একটি ক্ষণস্থায়ী ক্ষেত্র।
জাভাতে কেন ক্ষণস্থায়ী ক্ষেত্রগুলির প্রয়োজন? শব্দ আপনি ধারাবাহিকতাতে প্রক্রিয়া কিছু নিয়ন্ত্রণ করতে সক্ষম হবেন এবং আপনি এই প্রক্রিয়া থেকে কিছু বস্তু বৈশিষ্ট্য অগ্রাহ্য করতে পারবেন। সিরিয়ালাইজেশন প্রক্রিয়াটি জাভা অবজেক্টগুলিকে টিকিয়ে রাখতে ব্যবহার করা হয়, বেশিরভাগ যাতে তাদের স্থানগুলি স্থানান্তরিত বা নিষ্ক্রিয় অবস্থায় সংরক্ষণ করা যায়। কখনও কখনও, এটি কোনও বস্তুর নির্দিষ্ট বৈশিষ্ট্যগুলি সিরিয়াল না করার অর্থ দেয়। কোন ক্ষেত্রটি আপনি ক্ষণস্থায়ী চিহ্নিত করা উচিত?
এখন আমরা এর উদ্দেশ্য জানিtransient
transient
কীওয়ার্ড এবং ক্ষণস্থায়ী ক্ষেত্র, কোন ক্ষেত্রকে ক্ষণস্থায়ী চিহ্নিত করতে হবে তা জানা গুরুত্বপূর্ণ। স্ট্যাটিক ক্ষেত্রগুলি সিরিয়ালিয়াল হয় না, সুতরাং সংশ্লিষ্ট কীওয়ার্ডটিও কৌশলটি করে। তবে এটি আপনার শ্রেণীর নকশা নষ্ট করতে পারে; এখানেই transient
কীওয়ার্ডটি উদ্ধারে আসে। আমি চেষ্টা করি যে ক্ষেত্রগুলির মানগুলি অন্যের কাছ থেকে সিরিয়ালায়িত হওয়ার অনুমতি দেওয়া হয় না, তাই আমি তাদের ক্ষণস্থায়ী হিসাবে চিহ্নিত করি। আপনার যদি এমন একটি ক্ষেত্র বলা হয় interest
যার মান অন্য ক্ষেত্রগুলি ( principal
, rate
এবং time
) থেকে গণনা করা যায় , এটি ক্রমিক করার দরকার নেই।
আর একটি ভাল উদাহরণ নিবন্ধের শব্দ গণনা সহ। আপনি যদি একটি সম্পূর্ণ নিবন্ধ সংরক্ষণ করে থাকেন তবে শব্দ গণনাটি সংরক্ষণ করার সত্যিই দরকার নেই, কারণ নিবন্ধটি "deserialized" হয়ে গেলে এটি গণনা করা যায়। বা লগার সম্পর্কে চিন্তা করুন;Logger
উদাহরণগুলি প্রায় কখনও ক্রমিক করা প্রয়োজন হয় না, যাতে সেগুলি ক্ষণস্থায়ী করা যায়।
transient
transient
একটি transient
ভেরিয়েবল একটি পরিবর্তনশীল যা সিরিয়ালাইজড নাও হতে পারে।
এটি কখন কার্যকর মনে আসবে সেগুলির একটি উদাহরণ হ'ল ভেরিয়েবলগুলি যা নির্দিষ্ট কোনও বস্তুর উদাহরণের প্রেক্ষিতে কেবল অর্থবোধ করে এবং যা আপনি অবজেক্টটিকে সিরিয়ালাইজড ও ডিসাইরিয়ালাইজ করার পরে অবৈধ হয়ে যায়। সেক্ষেত্রে সেই পরিবর্তনগুলি null
পরিবর্তে কার্যকর হওয়া কার্যকর হবে যাতে প্রয়োজনের সময় আপনি দরকারী ডেটা দিয়ে তাদের পুনরায় সূচনা করতে পারেন।
transient
শ্রেণিক ক্ষেত্রটি সিরিয়ালকরণের দরকার নেই তা বোঝাতে ব্যবহৃত হয় is সম্ভবত সর্বোত্তম উদাহরণ একটি Thread
ক্ষেত্র। Thread
এটিকে সিরিয়ালায়িত করার কোনও কারণ নেই কারণ এর রাজ্যটি খুব 'প্রবাহ নির্দিষ্ট'।
A
রেফারেন্স একটি না serializable বর্গ B
(যেমন Thread
আপনার উদাহরণে), তারপর A
পারেন রেফারেন্স চিহ্নিত করতে হবে যেমন transient
XOR যাও অর্ডার দিয়ে কিছু যুক্তিসঙ্গত করতে এ ডিফল্ট ধারাবাহিকতাতে প্রক্রিয়া ওভাররাইড আবশ্যক B
অনুমান শুধুমাত্র serializable উপশ্রেণী XOR যাও এর B
আসলে রেফারেন্সড হয় (সুতরাং প্রকৃত সাবক্লাস অবশ্যই তাদের "খারাপ" পিতামাতার যত্ন নিতে হবে B
) এক্সওআর স্বীকার করে নিন যে সিরিয়ালাইজেশন ব্যর্থ হবে। কেবলমাত্র একটি ক্ষেত্রে (ক্ষণস্থায়ী হিসাবে চিহ্নিত) B
স্বয়ংক্রিয়ভাবে এবং নিঃশব্দে এড়ানো যায়।
নেটিভ জাভা ব্যতীত সিরিয়ালাইজেশন সিস্টেমগুলিও এই সংশোধকটি ব্যবহার করতে পারে। হাইবারনেট উদাহরণস্বরূপ, @ ট্রান্সিয়েন্ট বা ক্ষণস্থায়ী সংশোধক হিসাবে চিহ্নিত ক্ষেত্রগুলি স্থির রাখবে না । টেরাকোটা পাশাপাশি এই সংশোধককে সম্মান করে।
আমি বিশ্বাস করি যে সংশোধনকারীটির আলঙ্কারিক অর্থ হ'ল "এই ক্ষেত্রটি কেবলমাত্র মেমরির ব্যবহারের জন্য। যেমন আপনি অন্য ভিএম মেমরি স্পেসে এর মানটির উপর নির্ভর করতে পারবেন না। অনেকটা অস্থিরতার অর্থ আপনি নির্দিষ্ট মেমরি এবং থ্রেড সিনটিকের উপর নির্ভর করতে পারবেন না।
transient
এটি কোনও কীওয়ার্ড হবে না যদি এটি এই সময়ে ডিজাইন করা হত। তারা সম্ভবত কোনও টিকা ব্যবহার করবে।
কারণ সমস্ত ভেরিয়েবলগুলি ক্রমিক আকারের নয়
আমি এই প্রশ্নের জবাব দেওয়ার আগে, আপনাকে অবশ্যই সিরিয়ালাইজেশনটি ব্যাখ্যা করতে হবে , কারণ আপনি যদি বিজ্ঞান কম্পিউটারে সিরিয়ালকরণ বলতে কী বোঝেন তবে আপনি সহজেই এই কীওয়ার্ডটি বুঝতে পারবেন।
সিরিয়ালাইজেশন
যখন কোনও বস্তু নেটওয়ার্কের মাধ্যমে স্থানান্তরিত হয় / শারীরিক মিডিয়া (ফাইল, ...) এ সংরক্ষণ করা হয় তখন অবজেক্টটি অবশ্যই "সিরিয়ালাইজড" হতে হবে। সিরিয়ালাইজেশন বাইট স্থিতি অবজেক্ট সিরিজের রূপান্তর করে। এই বাইটগুলি নেটওয়ার্কে / সেভ করা হয় এবং এই বাইটগুলি থেকে বস্তুটি পুনরায় তৈরি করা হয়।
উদাহরণ
public class Foo implements Serializable
{
private String attr1;
private String attr2;
...
}
এখন যদি তুমি না কি করতে চান স্থানান্তর / সংরক্ষিত এই বস্তুর ক্ষেত্রে তাই , আপনি ব্যবহার করতে পারেন শব্দ transient
private transient attr2;
এটি দরকার যখন আপনি সিরিয়ালাইজেশনের সাথে চলে এমন কিছু সংবেদনশীল ডেটা ভাগ করতে চান না।
Thread
(উদাহরণ হিসাবে @ আঃ এর কাছে ক্রেডিট) চান না, এমন ক্ষেত্রে আপনি এটিকে ক্ষণস্থায়ী হিসাবে চিহ্নিত করবেন। যাইহোক, একটি থ্রেড এবং নিজের মধ্যে সংবেদনশীল ডেটা নয়, এটি কেবল এটির সিরিয়ালাইজ করার জন্য কোনও যৌক্তিক ধারণা দেয় না (এবং এটি সিরিয়ালাইজযোগ্য নয়)।
গুগলের ক্ষণস্থায়ী অর্থ হিসাবে == কেবল অল্প সময়ের জন্য স্থায়ী; অস্থায়ী।
এখন আপনি যদি জাভাতে কিছু ক্ষণস্থায়ী করতে চান তবে ট্রান্সিয়েন্ট কীওয়ার্ডটি ব্যবহার করুন।
প্রশ্ন: ক্ষণস্থায়ী কোথায় ব্যবহার করবেন?
উত্তর: সাধারণত জাভাতে আমরা ফাইলগুলিতে ভেরিয়েবলগুলি অর্জন করে এবং ফাইলগুলিতে সেই পরিবর্তনশীলগুলি লিখে ডেটা সংরক্ষণ করতে পারি, এই প্রক্রিয়াটি সিরিয়ালাইজেশন হিসাবে পরিচিত। এখন যদি আমরা ভেরিয়েবল ডেটা ফাইলে লেখার জন্য এড়াতে চাই, আমরা সেই পরিবর্তনশীলটিকে ক্ষণস্থায়ী হিসাবে তৈরি করব।
transient int result=10;
দ্রষ্টব্য: ক্ষণস্থায়ী ভেরিয়েবল স্থানীয় হতে পারে না।
সহজ কথায়, ক্ষণস্থায়ী জাভা কীওয়ার্ড ক্ষেত্রগুলি তাদের অস্থায়ী ক্ষেত্রের কাউন্টার অংশ হিসাবে সিরিয়ালাইজ করা থেকে রক্ষা করে।
এই কোডটি স্নিপেটে আমাদের বিমূর্ত ক্লাস বেসজবব সিরিয়ালাইজেবল ইন্টারফেস বাস্তবায়িত করে, আমরা বেসজব থেকে প্রসারিত করি তবে আমাদের দূরবর্তী এবং স্থানীয় ডেটা উত্সগুলি সিরিয়ালকরণ করার দরকার নেই; শুধুমাত্র সিরিয়ালাইজেশন নাম এবং সংগঠন ক্ষেত্রের নাম।
public abstract class BaseJob implements Serializable{
public void ShouldRetryRun(){}
}
public class SyncOrganizationJob extends BaseJob {
public String organizationName;
public Boolean isSynced
@Inject transient RemoteDataSource remoteDataSource;
@Inject transient LocalDaoSource localDataSource;
public SyncOrganizationJob(String organizationName) {
super(new
Params(BACKGROUND).groupBy(GROUP).requireNetwork().persist());
this.organizationName = organizationName;
this.isSynced=isSynced;
}
}
স্থানান্তর-কীওয়ার্ডের জন্য সরলীকৃত উদাহরণ কোড।
import java.io.*;
class NameStore implements Serializable {
private String firstName, lastName;
private transient String fullName;
public NameStore (String fName, String lName){
this.firstName = fName;
this.lastName = lName;
buildFullName();
}
private void buildFullName() {
// assume building fullName is compuational/memory intensive!
this.fullName = this.firstName + " " + this.lastName;
}
public String toString(){
return "First Name : " + this.firstName
+ "\nLast Name : " + this.lastName
+ "\nFull Name : " + this.fullName;
}
private void readObject(ObjectInputStream inputStream)
throws IOException, ClassNotFoundException
{
inputStream.defaultReadObject();
buildFullName();
}
}
public class TransientExample{
public static void main(String args[]) throws Exception {
ObjectOutputStream o = new ObjectOutputStream(new FileOutputStream("ns"));
o.writeObject(new NameStore("Steve", "Jobs"));
o.close();
ObjectInputStream in = new ObjectInputStream(new FileInputStream("ns"));
NameStore ns = (NameStore)in.readObject();
System.out.println(ns);
}
}
একটি ক্ষেত্র যা ক্ষণস্থায়ী সংশোধক সহ ঘোষিত হয় এটি সিরিয়ালযুক্ত প্রক্রিয়াতে অংশ নেবে না। যখন কোনও বস্তুকে সিরিয়ালাইজ করা হয় (যে কোনও অবস্থায় সংরক্ষণ করা হয়), তখন এর ক্ষণস্থায়ী ক্ষেত্রগুলির মানগুলি সিরিয়াল উপস্থাপনায় উপেক্ষা করা হয়, যখন ক্ষণস্থায়ী ক্ষেত্রগুলি ব্যতীত অন্য ক্ষেত্রটি সিরিয়ালকরণ প্রক্রিয়াতে অংশ নেবে। এটি ক্ষণস্থায়ী কীওয়ার্ডের মূল উদ্দেশ্য।
@DoNotSerialize
?