java - জাভা কেন ক্ষণস্থায়ী ক্ষেত্র আছে?




field transient (8)

জাভা কেন ক্ষণস্থায়ী ক্ষেত্র আছে?


আপনি সিরিয়ালাইজ করতে চান না এমন ভেরিয়েবল সংজ্ঞায়িত করার অনুমতি দেয়।

কোনও বস্তুর মধ্যে আপনার কাছে এমন তথ্য থাকতে পারে যা আপনি সিরিয়ালাইজ করতে চান না / স্থির রাখতে চান (সম্ভবত পিতামাতার কারখানার বস্তুর একটি রেফারেন্স), অথবা সম্ভবত এটি সিরিয়ালিয়াকে বোঝা যায় না। এই 'ক্ষণস্থায়ী' হিসাবে চিহ্নিত মানে সিরিয়ালাইজেশন প্রক্রিয়া এই ক্ষেত্রগুলিকে উপেক্ষা করবে।


আমার ছোট অবদান:

একটি ক্ষণস্থায়ী ক্ষেত্র কি?
মূলত, transient কীওয়ার্ড দিয়ে সংশোধন করা কোন ক্ষেত্রটি একটি ক্ষণস্থায়ী ক্ষেত্র।

কেন জাভা মধ্যে ক্ষণস্থায়ী ক্ষেত্র প্রয়োজন?
transient কীওয়ার্ড আপনাকে সিরিয়ালাইজেশান প্রক্রিয়ার উপর কিছু নিয়ন্ত্রণ দেয় এবং আপনাকে এই প্রক্রিয়া থেকে কিছু বস্তুর বৈশিষ্ট্যগুলি বাদ দেওয়ার অনুমতি দেয়। সিরিয়ালাইজেশান প্রক্রিয়াটি জাভা বস্তুগুলিকে স্থির রাখতে ব্যবহৃত হয়, যাতে বেশিরভাগ ক্ষেত্রে তাদের রাষ্ট্রগুলি স্থানান্তরিত বা নিষ্ক্রিয় অবস্থায় সংরক্ষণ করা যেতে পারে। কখনও কখনও, এটি একটি বস্তুর নির্দিষ্ট গুণাবলী serialize না অনুভূতি তোলে।

কোন ক্ষেত্র আপনি ক্ষণস্থায়ী চিহ্নিত করা উচিত?
এখন আমরা transient কীওয়ার্ড এবং ক্ষণস্থায়ী ক্ষেত্রগুলির উদ্দেশ্য জানি, তা জানা অপরিহার্য যা ক্ষেত্রগুলি জানা গুরুত্বপূর্ণ। স্ট্যাটিক ক্ষেত্রগুলি সিরিয়ালাইজড হয় না, তাই সংশ্লিষ্ট কীওয়ার্ডও কৌশলটি করবে। কিন্তু এটি আপনার বর্গ নকশা ধ্বংস করতে পারে; এই transient কীওয়ার্ড রেসকিউ আসে। আমি এমন ক্ষেত্রগুলিকে অনুমতি দেওয়ার চেষ্টা করি না যার মানগুলি অন্যদের থেকে সিরিয়ালাইজ করা যেতে পারে, তাই আমি তাদের ক্ষণস্থায়ী চিহ্নিত করি। যদি আপনার interest একটি ক্ষেত্র থাকে যার মানটি অন্যান্য ক্ষেত্রগুলির ( principal , rate এবং time ) থেকে গণনা করা যেতে পারে তবে এটি সিরিয়াল করার প্রয়োজন নেই।

আরেকটি ভাল উদাহরণ নিবন্ধ শব্দ গণনা সঙ্গে হয়। যদি আপনি একটি সম্পূর্ণ নিবন্ধ সংরক্ষণ করেন তবে শব্দ গণনা সংরক্ষণ করার কোনও প্রয়োজন নেই কারণ নিবন্ধটি "বিকৃত করা" হলে এটি গণনা করা যেতে পারে। অথবা লগগার সম্পর্কে চিন্তা করুন; Logger উদাহরণগুলি প্রায়শই সিরিয়ালাইজড হওয়ার প্রয়োজন নেই, তাই তারা ক্ষণস্থায়ী হতে পারে।


একটি transient পরিবর্তনশীল একটি পরিবর্তনশীল যে serialized নাও হতে পারে।

যখন এটি মনের মধ্যে আসে তখন এটি কার্যকর হতে পারে এমন একটি উদাহরণ, ভেরিয়েবল যা একটি নির্দিষ্ট বস্তুর দৃষ্টান্তের প্রসঙ্গে কেবলমাত্র ইন্দ্রিয় তৈরি করে এবং বস্তুটি ক্রমানুসারে এবং বিকৃত করে একবার একবার অবৈধ হয়ে যায়। সেই ক্ষেত্রে এটি পরিবর্তিত হওয়ার পরিবর্তে সেই ভেরিয়েবলগুলি null হয়ে যায় যাতে আপনি প্রয়োজনে দরকারী ডেটা দিয়ে পুনরায় সূচনা করতে পারেন।


কারণ সব ভেরিয়েবল একটি serializable প্রকৃতির হয় না


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

আমি বিশ্বাস করি মডিফায়ারের লক্ষণীয় অর্থ হল "এই ক্ষেত্রটি শুধুমাত্র মেমরির ব্যবহারের জন্য। কোনও ভাবেই এই বিশেষ VM এর বাইরে থাকা বা স্থানান্তর করবেন না। এটির পোর্টেবল"। অর্থাৎ আপনি অন্য ভিএম মেমরি স্পেসে তার মান নির্ভর করতে পারবেন না। অত্যন্ত উদ্বায়ী মানে আপনি নির্দিষ্ট মেমরি এবং থ্রেড শব্দকোষ উপর নির্ভর করতে পারবেন না।


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


transient একটি শ্রেণী ক্ষেত্র serialized করার প্রয়োজন হয় না যে ইঙ্গিত ব্যবহৃত হয়। সম্ভবত সেরা উদাহরণ একটি Thread ক্ষেত্র। সাধারণত Thread সিরিয়াল করার কোন কারণ নেই, কারণ এটির অবস্থা খুব 'প্রবাহ নির্দিষ্ট'।


transient শব্দ বোঝার আগে, একটি serialization ধারণা বুঝতে হবে। পাঠক সিরিয়ালাইজেশন সম্পর্কে জানেন, তাহলে প্রথম বিন্দু এড়িয়ে যান।

সিরিয়ালাইজেশন কি?

সিরিয়ালাইজেশন বস্তুর স্থায়ী রাষ্ট্র গঠনের প্রক্রিয়া। এর অর্থ হচ্ছে বস্তুর অবস্থা বাইটের একটি প্রবাহে রূপান্তরিত এবং একটি ফাইলে সংরক্ষিত। একইভাবে, আমরা বাইট থেকে বস্তুর অবস্থা ফিরিয়ে আনতে 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 হিসাবে ঘোষণা করা হয়, তাই এটি স্থায়ী সঞ্চয়স্থানে সংরক্ষণ করা হবে না।

Source





transient