অবজেক্ট সিরিয়ালাইজেশন কী?


384

"অবজেক্ট সিরিয়ালাইজেশন" বলতে কী বোঝায়? আপনি কিছু উদাহরণ দিয়ে ব্যাখ্যা করতে পারেন?


2
যদি আপনি একটি বাস্তব জগতে জাভা EE দৃশ্যকল্প যেখানে ধারাবাহিকতাতে জড়িত করতে আগ্রহী হন, এখানে প্রধান: stackoverflow.com/q/2294551
BalusC

উত্তর:


400

সিরিয়ালাইজেশন হ'ল অবজেক্টকে ধারাবাহিক বাইটে রূপান্তর করা, যাতে অবজেক্টটি সহজেই অবিরাম সঞ্চয়স্থানে সংরক্ষণ করা যায় বা যোগাযোগের লিঙ্কে প্রবাহিত হয়। এরপরে বাইট স্ট্রিমটি ডিসিরিয়ালাইজ করা যায় - মূল বস্তুর প্রতিরূপে রূপান্তরিত।


16
এটা কি ফরয? ডেটা পাঠানোর আগে আমাকে কি সিরিয়ালাইজ করতে হবে? এটি কোন ফর্ম্যাটে রূপান্তরিত হয়?
ফ্রান্সিসকো

15
@ ফ্রেঞ্চিসকো কররেলেস মোরেলস - পর্দার আড়ালে সমস্ত তথ্য এটি স্ট্রিমের উপরে প্রেরণের আগে সিরিয়ালায়িত করা হবে। আপনাকে কতটা করতে হবে এবং এটি কোন ফর্ম্যাটে থাকবে তা উভয়ই নির্ভর করে আপনি কোন প্ল্যাটফর্ম এবং লাইব্রেরি ব্যবহার করছেন।
তারকাডাল

3
আপনি এটি কীভাবে বলছেন? মানে আপনি বলছেন যে ফর্ম্যাটটি প্ল্যাটফর্ম এবং লাইব্রেরিগুলির উপর নির্ভর করে I আমি সত্যই ফর্ম্যাটটি জানতে চাই।
জাভা

1
এটি কি কেবলমাত্র বস্তুর জন্য প্রযোজ্য? আমরা কী ভেরিয়েবলকে সিরিয়ালাইজ করতে পারি (অবজেক্ট ব্যবহার না করেই ঘোষিত)?
রুমাদো

@ রুমাদো কেবলমাত্র অবজেক্টস
অ্যানকোটলিনার

395

সিরিয়ালাইজেশনকে আপনি কোনও বস্তুর উদাহরণকে বাইটের ক্রমে রূপান্তর করার প্রক্রিয়া হিসাবে ভাবতে পারেন (যা বাইনারি হতে পারে বা প্রয়োগের উপর নির্ভর করে না)।

এটি খুব কার্যকর যখন আপনি নেটওয়ার্ক জুড়ে একটি অবজেক্ট ডেটা প্রেরণ করতে চান, উদাহরণস্বরূপ এক JVM থেকে অন্যটিতে।

জাভাতে, সিরিয়ালাইজেশন প্রক্রিয়াটি প্ল্যাটফর্মের মধ্যে নির্মিত হয়, তবে আপনাকে কোনও বস্তুকে সিরিয়ালাইজ করার জন্য সিরিয়ালাইজেবল ইন্টারফেস প্রয়োগ করতে হবে।

ক্ষণস্থায়ী হিসাবে গুণকে চিহ্নিত করে আপনি নিজের অবজেক্টের কিছু ডেটা ক্রমিকায়িত হওয়া থেকে আটকাতে পারেন ।

অবশেষে আপনি ডিফল্ট প্রক্রিয়াটি ওভাররাইড করতে পারেন এবং আপনার নিজের সরবরাহ করতে পারেন; এটি কিছু বিশেষ ক্ষেত্রে উপযুক্ত হতে পারে। এটি করার জন্য, আপনি জাভাতে একটি লুকানো বৈশিষ্ট্য ব্যবহার করেন

এটি লক্ষ করা জরুরী যে সিরিয়ালযুক্তটি কী হয় তা হ'ল বস্তুর "মান" বা বিষয়বস্তু এবং শ্রেণিক সংজ্ঞা নয়। সুতরাং পদ্ধতিগুলি সিরিয়ালযুক্ত হয় না।

এখানে পড়ার সুবিধার্থে মন্তব্যগুলির সাথে একটি খুব বুনিয়াদি নমুনা:

import java.io.*;
import java.util.*;

// This class implements "Serializable" to let the system know
// it's ok to do it. You as programmer are aware of that.
public class SerializationSample implements Serializable {

    // These attributes conform the "value" of the object.

    // These two will be serialized;
    private String aString = "The value of that string";
    private int    someInteger = 0;

    // But this won't since it is marked as transient.
    private transient List<File> unInterestingLongLongList;

    // Main method to test.
    public static void main( String [] args ) throws IOException  { 

        // Create a sample object, that contains the default values.
        SerializationSample instance = new SerializationSample();

        // The "ObjectOutputStream" class has the default 
        // definition to serialize an object.
        ObjectOutputStream oos = new ObjectOutputStream( 
                               // By using "FileOutputStream" we will 
                               // Write it to a File in the file system
                               // It could have been a Socket to another 
                               // machine, a database, an in memory array, etc.
                               new FileOutputStream(new File("o.ser")));

        // do the magic  
        oos.writeObject( instance );
        // close the writing.
        oos.close();
    }
}

আমরা যখন এই প্রোগ্রামটি চালাই, তখন "o.ser" ফাইলটি তৈরি হয় এবং আমরা কী ঘটতে পারি তা দেখতে পাই।

: আমরা এর মান পরিবর্তন করেন তাহলে someInteger উদাহরণস্বরূপ করা, Integer.MAX_VALUE , আমরা তা দেখতে পার্থক্য নেই আউটপুট তুলনা হতে পারে।

এখানে একটি স্ক্রিনশট ঠিক সেই তফাতটি দেখায়:

বিকল্প পাঠ

আপনি পার্থক্য স্পট করতে পারেন? ;)

জাভা সিরিয়ালাইজেশনে একটি অতিরিক্ত প্রাসঙ্গিক ক্ষেত্র রয়েছে: সিরিয়াল রূপান্তরনীতি কিন্তু আমার ধারণা এটি ইতিমধ্যে এটি আবরণে অনেক দীর্ঘ।


1
@ raam86 উদাহরণ হ'ল বস্তুটি ক্রমিকায়িত হচ্ছে। আপনি মূল পদ্ধতিতে একটি পৃথক প্রোগ্রাম হিসাবে ভাবতে পারেন যা কোনও ধরণের অবজেক্ট তৈরি করেSerializationSample
অস্কাররাইজ

2
@ raam86 হ'ল মূল পদ্ধতির প্রথম বিবৃতি: SerializationSample instance = new SerializationSample();তারপরে আউটপুট তৈরি হয় এবং সেই আউটপুটে অবজেক্টটি লেখা হয়।
অস্কাররাজ

1
উহু. যথেষ্ট পরিমাণে অনুসরণ করা হয়নি। গ্রেট !!
raam86

1
@ জ্যাকট্রেডস কেন আপনি এটি চেষ্টা করেন না? কেবল উদাহরণটি অনুলিপি করুন / আটকান এবং "নোটশিয়ারাইজেবল এক্সপশন" নিক্ষিপ্ত হচ্ছে দেখুন :)
অস্কার রাইজ

1
@ জ্যাকট্রেডস কারণ কম্পিউটারটিকে বলা হয়নি যে অবজেক্টটি সিরিয়ালাইজ করার অনুমতি দেওয়া হয়েছে :) ওও বলতে কী বোঝায়?
ক্রিস বেনেট

101

জাভাতে নতুনদের জন্য খুব উচ্চ-স্তরের বোঝাপড়া যুক্ত করে 6-বছরের পুরানো প্রশ্নের উত্তর দেওয়ার সাহস aring

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

কোনও বস্তুকে বাইটে রূপান্তর করা

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

বাইটগুলিকে কোনও বস্তুর কাছে ফিরিয়ে দেওয়া (ডেসারিয়ালাইজেশন)।

সিরিয়ালাইজেশন কখন ব্যবহৃত হয়?

যখন আমরা অবজেক্টটি পার্সিস্ট করতে চাই। আমরা যখন জেভিএম-এর জীবদ্দশার বাইরে বস্তুটির অস্তিত্ব পেতে চাই।

বাস্তব বিশ্বের উদাহরণ:

এটিএম: অ্যাকাউন্টধারক যখন এটিএমের মাধ্যমে সার্ভার থেকে অর্থ উত্তোলনের চেষ্টা করবেন, তখন অ্যাকাউন্টের ধারক তথ্য প্রত্যাহারের বিবরণ মতো সিরিয়ালিয়াল করে সার্ভারে প্রেরণ করা হবে যেখানে বিশদটি বিশৃঙ্খলিত হয় এবং পরিচালনা করতে ব্যবহৃত হয়।

জাভাতে সিরিয়ালাইজেশন কীভাবে করা হয়।

  1. java.io.Serializableইন্টারফেস প্রয়োগ করুন (মার্কার ইন্টারফেস তাই প্রয়োগের জন্য কোনও পদ্ধতি নেই)।

  2. অবজেক্টটি ধরে রাখুন: java.io.ObjectOutputStreamক্লাসটি ব্যবহার করুন , একটি ফিল্টার স্ট্রিম যা নিম্ন-স্তরের বাইট স্ট্রিমের চারপাশে মোড়ক (ফাইল সিস্টেমে অবজেক্ট লিখতে বা একটি নেটওয়ার্ক ওয়্যার জুড়ে একটি সমতল বস্তু স্থানান্তর করতে এবং অন্যদিকে পুনর্নির্মাণ) Use

    • writeObject(<<instance>>) - একটি অবজেক্ট লিখতে
    • readObject() - সিরিয়ালযুক্ত অবজেক্ট পড়তে

মনে রাখবেন:

আপনি যখন কোনও বস্তুকে সিরিয়ালাইজ করবেন, তখন কেবলমাত্র বস্তুর অবস্থা সংরক্ষণ করা হবে, বস্তুর শ্রেণি ফাইল বা পদ্ধতিগুলি নয়।

আপনি যখন 2-বাইট অবজেক্টটি সিরিয়াল করেছেন, আপনি 51 বাইট সিরিয়ালযুক্ত ফাইলটি দেখুন।

কীভাবে অবজেক্টটি সিরিয়ালাইজড এবং ডি-সিরিয়ালাইজ করা হয় সেগুলি পদক্ষেপ।

এর উত্তর: এটি কীভাবে 51 বাইট ফাইল রূপান্তর করে?

  • প্রথমে সিরিয়ালাইজেশন স্ট্রিম ম্যাজিক ডেটা লিখেছেন (STREAM_MAGIC = "এসি ইডি" এবং STREAM_VERSION = জেভিএম এর সংস্করণ)।
  • তারপরে এটি ক্লাসের মেটাডেটাটি উদাহরণের সাথে যুক্ত হয় (শ্রেণীর দৈর্ঘ্য, শ্রেণীর নাম, সিরিয়াল ভার্সনিউডিউড)।
  • তারপরে এটি সুপারক্লাসের মেটাডেটা খুঁজে না পাওয়া পর্যন্ত এটি পুনরাবৃত্তভাবে লিখে রাখে java.lang.Object
  • তারপরে উদাহরণের সাথে যুক্ত প্রকৃত ডেটা দিয়ে শুরু হয়।
  • অবশেষে মেটাডেটা থেকে আসল সামগ্রীতে শুরু হওয়া উদাহরণের সাথে যুক্ত অবজেক্টের ডেটা লিখুন।

আপনি যদি জাভা সিরিয়ালাইজেশন সম্পর্কে আরও গভীরতার তথ্যে আগ্রহী হন তবে এই লিঙ্কটি দেখুন

সম্পাদনা : পড়ার জন্য আরও একটি ভাল লিঙ্ক

এটি কয়েকটি ঘন ঘন প্রশ্নের উত্তর দেবে:

  1. ক্লাসে কোনও ফিল্ড সিরিয়াল করবেন না কীভাবে।
    উত্তর: ক্ষণস্থায়ী কীওয়ার্ড ব্যবহার করুন

  2. যখন শিশু শ্রেণি সিরিয়ালযুক্ত হয় তখন পিতামাতার ক্লাসটি সিরিয়ালযুক্ত হয়?
    উত্তর: না, যদি কোনও পিতা-মাতা সিরিয়ালাইজযোগ্য ইন্টারফেসটি না বাড়িয়ে দেয় তবে পিতামাতাদের ক্ষেত্রটি সিরিয়ালীকৃত হবে না।

  3. যখন কোনও পিতামাতাকে সিরিয়ালযুক্ত করা হয় তখন কি শিশু শ্রেণি ক্রমিকায়িত হয়?
    উত্তর: হ্যাঁ, ডিফল্টরূপে শিশু শ্রেণিটিও সিরিয়ালযুক্ত হয়।

  4. কীভাবে শিশু শ্রেণি সিরিয়াল হওয়ার হাত থেকে বাঁচবেন?
    উত্তর: ক। রাইটিংঅজেক্ট এবং রিডঅবজেক্ট পদ্ধতিতে ওভাররাইড করুন এবং নিক্ষেপ করুন NotSerializableException

    খ। এছাড়াও আপনি শিশু শ্রেণিতে সমস্ত ক্ষেত্রকে ক্ষণস্থায়ী হিসাবে চিহ্নিত করতে পারেন।

  5. থ্রেড, আউটপুট স্ট্রিম এবং এর সাবক্লাস এবং সকেটের মতো কিছু সিস্টেম-স্তরের শ্রেণি সিরিয়ালযোগ্য নয়।

3
এই সংক্ষিপ্ত উত্তরের জন্য আপনাকে অনেক ধন্যবাদ, এটি খুব সহায়ক ছিল!
নবি

21

সিরিয়ালাইজেশন মেমোরিতে একটি "লাইভ" অবজেক্ট গ্রহণ করছে এবং এটিকে এমন বিন্যাসে রূপান্তর করছে যা কোথাও সংরক্ষণ করা যেতে পারে (উদাহরণস্বরূপ, মেমরিতে, ডিস্কে) এবং পরে "ডিস্রায়ালাইজড" ফিরে লাইভ অবজেক্টে পরিণত করা যেতে পারে।


14

@ অস্কার রাইজ উপস্থাপনের উপায়টি আমার পছন্দ হয়েছে। যদিও এখানে আমি ধারাবাহিকতার গল্পটি চালিয়ে যাচ্ছি যা মূলত @ মমিতগুপ্ত লিখেছিলেন।

যদিও রোবট শ্রেণীর কাঠামো সম্পর্কে জানার এবং সিরিয়ালাইজড ডেটা থাকার কারণে পৃথিবীর বিজ্ঞানী ডেটাটি ডিসেরায়ালাইজ করতে সক্ষম হননি যা রোবটকে কাজ করতে পারে।

Exception in thread "main" java.io.InvalidClassException:
SerializeMe; local class incompatible: stream classdesc
:

মঙ্গল গ্রহের বিজ্ঞানীরা সম্পূর্ণ অর্থ প্রদানের অপেক্ষায় ছিলেন। অর্থ প্রদান শেষ হয়ে গেলে মঙ্গল গ্রহের বিজ্ঞানীরা পৃথিবীর বিজ্ঞানীদের সাথে সিরিয়াল রূপান্তর এলইডি ভাগ করেছিলেন । পৃথিবীর বিজ্ঞানী এটিকে রোবট শ্রেণিতে স্থাপন করলেন এবং সবকিছু ঠিকঠাক হয়ে গেল।


9

সিরিয়ালাইজেশন মানে জাভাতে থাকা অবজেক্টগুলি। আপনি যদি অবজেক্টের অবস্থা সংরক্ষণ করতে চান এবং রাষ্ট্রটি পরে পুনর্নির্মাণ করতে চান তবে (অন্য কোনও জেভিএম হতে পারে) সিরিয়ালাইজেশন ব্যবহার করা যেতে পারে।

নোট করুন যে কোনও সামগ্রীর বৈশিষ্ট্যগুলি কেবল সংরক্ষণ করতে চলেছে। আপনি যদি আবার বস্তুটিকে পুনরুত্থিত করতে চান তবে আপনার ক্লাস ফাইলটি থাকা উচিত, কারণ সদস্য ভেরিয়েবলগুলি কেবল স্টোর হবে এবং সদস্য ফাংশনগুলি নয়।

উদাহরণ:

ObjectInputStream oos = new ObjectInputStream(                                 
                                 new FileInputStream(  new File("o.ser")) ) ;
SerializationSample SS = (SearializationSample) oos.readObject();

সিয়েরিয়ালাইজেবল একটি মার্কার ইন্টারফেস যা চিহ্নিত করে যে আপনার শ্রেণি সিরিয়ালযোগ্য able মার্কার ইন্টারফেসের অর্থ হল যে এটি কেবল একটি খালি ইন্টারফেস এবং সেই ইন্টারফেসটি ব্যবহার করা JVM কে জানিয়ে দেবে যে এই শ্রেণিটি সিরিয়ালযোগ্য করে তোলা যায়।


9

আমার নিজের ব্লগ থেকে আমার দুটি সেন্ট:

সিরিয়ালাইজেশনের বিস্তারিত ব্যাখ্যা এখানে দেওয়া হল : (আমার নিজস্ব ব্লগ)

ধারাবাহিকতাতে:

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

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

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

কোড উদাহরণ এবং ব্যাখ্যা:

প্রথমে আইটেম ক্লাসটি দেখে নেওয়া যাক:

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 যদি প্রাপকটি সংশ্লিষ্ট প্রেরকের শ্রেণীর চেয়ে পৃথক সিরিয়াল ভার্সনইউডিউযুক্ত কোনও বস্তুর জন্য কোনও শ্রেণি লোড করে থাকে, তবে deserialization এর ফলে একটি অবৈধ ক্লাসেক্সেপশন হবে। একটি সিরিয়ালাইজযোগ্য শ্রেণি স্পষ্টরূপে "সিরিয়াল ভার্সনিউডিউ" নামে একটি ক্ষেত্র ঘোষণা করে যা নিজের স্থির, চূড়ান্ত এবং দীর্ঘ প্রকারের হতে হবে: কোনও-অ্যাক্সেস-মোডিফায়ার স্ট্যাটিক চূড়ান্ত দীর্ঘ সিরিয়াল সংস্করণ = 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]

লক্ষ্য করুন যে ডিসিরিয়ালাইজড অবজেক্ট থেকে আইটেমকস্টপ্রাইসটি শূন্য যেমন না লেখা হয়েছিল।

আমরা ইতিমধ্যে এই নিবন্ধটির প্রথম অংশে জাভা সিরিয়ালাইজেশনের মূল বিষয়গুলি নিয়ে আলোচনা করেছি।

এখন আসুন এটি গভীরভাবে আলোচনা করুন এবং এটি কীভাবে কাজ করে।

প্রথমে সিরিয়ালটি পরিবর্তন করা যাক।

SerialVersionUID একটি Serializable ক্লাসে একটি সংস্করণ নিয়ন্ত্রণ হিসেবে ব্যবহৃত হয়।

যদি আপনি স্পষ্টভাবে কোনও সিরিয়াল ভার্সনিউডিউড ঘোষণা না করেন তবে জেভিএম সিরিয়ালাইজেবল শ্রেণীর বিভিন্ন বৈশিষ্ট্যের ভিত্তিতে স্বয়ংক্রিয়ভাবে এটি আপনার জন্য করবে।

জাভার অ্যালগোরিদম সিরিয়াল রূপান্তরকরণের গণনা চলছে (আরও বিশদ এখানে পড়ুন)

  1. শ্রেণীর নাম
    1. ক্লাস সংশোধকগুলি 32-বিট পূর্ণসংখ্যা হিসাবে লেখা।
    2. নাম অনুসারে বাছাই করা প্রতিটি ইন্টারফেসের নাম।
    3. শ্রেণীর প্রতিটি ক্ষেত্রের জন্য ক্ষেত্রের নাম অনুসারে বাছাই করা (ব্যক্তিগত স্ট্যাটিক এবং বেসরকারী ক্ষণস্থায়ী ক্ষেত্র ব্যতীত: ক্ষেত্রের নাম 32২-বিট পূর্ণসংখ্যার হিসাবে ক্ষেত্রের সংশোধক। ক্ষেত্রটির বর্ণনাকারী।
    4. যদি কোনও ক্লাস ইনিশিয়ালাইজার উপস্থিত থাকে তবে নিম্নলিখিতটি লিখুন: পদ্ধতির নাম,।
    5. 32-বিট পূর্ণসংখ্যা হিসাবে লেখা পদ্ধতির সংশোধক, java.lang.reflect.Modifier.STATIC।
    6. পদ্ধতির বর্ণনাকারী, () ভি।
    7. পদ্ধতির নাম এবং স্বাক্ষর অনুসারে বাছাই করা প্রতিটি বেসরকারী নির্মাতার জন্য: পদ্ধতির নাম,। 32-বিট পূর্ণসংখ্যা হিসাবে লেখা পদ্ধতির সংশোধক। পদ্ধতির বর্ণনাকারী।
    8. পদ্ধতির নাম এবং স্বাক্ষর অনুসারে বাছাই করা প্রতিটি বেসরকারী পদ্ধতির জন্য: পদ্ধতির নাম। 32-বিট পূর্ণসংখ্যা হিসাবে লেখা পদ্ধতির সংশোধক। পদ্ধতির বর্ণনাকারী।
    9. SHA-1 অ্যালগরিদম ডেটাআউটপুটস্ট্রিম দ্বারা উত্পাদিত বাইটের প্রবাহে কার্যকর করা হয় এবং পাঁচটি 32-বিট মান শ [0..4] উত্পাদন করে। SHA-1 বার্তা হজমের প্রথম এবং দ্বিতীয় 32-বিট মানগুলি থেকে হ্যাশ মানটি একত্রিত হয়। যদি বার্তাটির ফলাফল হজম হয়, পাঁচটি 32-বিট শব্দ H0 H1 H2 H3 H4, পাঁচটি শ নামের পাঁচটি মানের অ্যারেতে থাকে, হ্যাশ মানটি নিম্নরূপে গণনা করা হবে:
    long hash = ((sha[0] >>> 24) & 0xFF) |
>            ((sha[0] >>> 16) & 0xFF) << 8 |
>            ((sha[0] >>> 8) & 0xFF) << 16 |
>            ((sha[0] >>> 0) & 0xFF) << 24 |
>            ((sha[1] >>> 24) & 0xFF) << 32 |
>            ((sha[1] >>> 16) & 0xFF) << 40 |
>            ((sha[1] >>> 8) & 0xFF) << 48 |
>        ((sha[1] >>> 0) & 0xFF) << 56;

জাভার সিরিয়ালাইজেশন অ্যালগরিদম

কোনও বস্তুকে সিরিয়ালাইজ করার জন্য অ্যালগরিদমটি নীচে বর্ণিত হয়েছে:
১. এটি উদাহরণের সাথে সম্পর্কিত শ্রেণীর মেটাডেটা লিখেছে।
২. এটি জাভা.লং.অবজেক্ট না পাওয়া পর্যন্ত এটি সুপারক্লাসের বিবরণটি পুনরাবৃত্তভাবে লিখে রাখে ।
৩. এটি একবার মেটাডেটা তথ্য লেখার কাজ শেষ করে, তারপরে এটি উদাহরণের সাথে যুক্ত প্রকৃত ডেটা দিয়ে শুরু হয়। তবে এবার এটি শীর্ষস্থানীয় সুপারক্লাস থেকে শুরু হয়।
৪. এটি সংক্ষিপ্ত সুপারক্লাস থেকে সর্বাধিক উদ্ভূত শ্রেণীর থেকে শুরু করে উদাহরণের সাথে সম্পর্কিত তথ্যগুলি পুনরাবৃত্তভাবে লিখেছে।

জিনিষ মনে রাখা:

  1. কোনও শ্রেণিতে স্ট্যাটিক ক্ষেত্রগুলি সিরিয়াল করা যায় না।

    public class A implements Serializable{
         String s;
         static String staticString = "I won't be serializable";
    }
  2. সিরিয়ালভার্সনুইডটি যদি পড়ার শ্রেণিতে আলাদা হয় তবে এটি একটি InvalidClassExceptionব্যতিক্রম ছুঁড়ে দেবে ।

  3. যদি কোনও শ্রেণি সিরিয়ালাইজেবল প্রয়োগ করে তবে এর সমস্ত সাব ক্লাসগুলি সিরিয়ালযোগ্যও হবে।

    public class A implements Serializable {....};
    
    public class B extends A{...} //also Serializable
  4. কোনও শ্রেণীর যদি অন্য শ্রেণীর রেফারেন্স থাকে তবে সমস্ত উল্লেখ অবশ্যই সিরিয়ালাইজেবল হতে হবে অন্যথায় সিরিয়ালাইজেশন প্রক্রিয়া সম্পাদিত হবে না। এই জাতীয় ক্ষেত্রে, নোটসিরাইজিয়েবল এক্সসেপশন রানটাইমের সময় নিক্ষেপ করা হয়।

উদাহরণ:

public class B{
     String s,
     A a; // class A needs to be serializable i.e. it must implement Serializable
}

1
'সিরিয়ালাইজেশন হ'ল কোনও বস্তুর অবস্থার ক্রমিকায়ন করার প্রক্রিয়াটি বাইটের ক্রমের আকারে উপস্থাপিত হয় এবং সংরক্ষণ করা হয়' অর্থহীন। তাহলে serialVersionUIDভিন্ন এটি একটি নিক্ষেপ করা হবে InvalidClassException, না একটি ClassCastException। গণনাটি সম্মান করে এমন সমস্ত স্থান নষ্ট করার প্রয়োজন নেই serialVersionUID। ডকুমেন্টেশন অতিরিক্ত দৈর্ঘ্যে উদ্ধৃত করা হয়েছে, তবে সংযুক্ত বা সঠিকভাবে উদ্ধৃত হয়নি। এখানে খুব বেশি ফ্লফ এবং অনেকগুলি ত্রুটি।
লার্নের মার্কুইস

'সিরিয়ালাইজেশন হ'ল সিরিয়ালাইজেশন প্রক্রিয়া' অর্থহীন থেকে যায়।
মারকুইস অফ লরেন

6

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

http://en.wikipedia.org/wiki/Serialization


"... যাতে এটি একটি হার্ড ড্রাইভে সঞ্চয় করা যায়।" বা বাইনারি প্রোটোকলের মাধ্যমে স্থানান্তরিত।
জিম অ্যান্ডারসন

4

জাভা অবজেক্ট সিরিয়ালাইজেশন

এখানে চিত্র বর্ণনা লিখুন

Serializationস্টোরেজ ( to disk file) বা ট্রান্সমিশন ( across a network) এর জন্য জাভা অবজেক্টের কোনও গ্রাফকে বাইটের অ্যারে রূপান্তরিত করার একটি প্রক্রিয়া , তারপরে ডিসরিয়ালাইজেশন ব্যবহার করে আমরা বস্তুর গ্রাফটি পুনরুদ্ধার করতে পারি। একটি রেফারেন্স ভাগ করে নেওয়ার প্রক্রিয়া ব্যবহার করে অবজেক্টের গ্রাফগুলি সঠিকভাবে পুনরুদ্ধার করা হয়। তবে সঞ্চয় করার আগে, ইনপুট ফাইল / নেটওয়ার্ক এবং .class ফাইলের সিরিয়াল ভার্সনইউইড একই কিনা তা পরীক্ষা করুন। যদি না হয়, একটি নিক্ষেপ java.io.InvalidClassException

প্রতিটি সংস্করণযুক্ত শ্রেণিকে অবশ্যই মূল শ্রেণীর সংস্করণটি সনাক্ত করতে হবে যার জন্য এটি স্ট্রিম লেখার পক্ষে সক্ষম এবং যার থেকে এটি পড়তে পারে। উদাহরণস্বরূপ, কোনও সংস্করণযুক্ত শ্রেণিকে অবশ্যই ঘোষণা করতে হবে:

সিরিয়াল ভার্সনিউড সিন্ট্যাক্স

// ANY-ACCESS-MODIFIER static final long serialVersionUID = (64-bit has)L;
private static final long serialVersionUID = 3487495895819393L;

serialVersionUIDসিরিয়ালভিশন প্রক্রিয়াটির জন্য সিরিয়াল অপরিহার্য। তবে এটি বিকাশকারীদের জন্য এটি জাভা উত্স ফাইলটিতে যুক্ত করা optionচ্ছিক। যদি সিরিয়াল ভার্সনইউইউডিটি অন্তর্ভুক্ত না করা হয় তবে সিরিয়ালাইজেশন রানটাইম একটি সিরিয়াল ভার্সনইউডিউ উত্পন্ন করে শ্রেণীর সাথে সংযুক্ত করে। সিরিয়ালযুক্ত অবজেক্টটিতে অন্যান্য ডেটা সহ এই সিরিয়াল ভার্সনইউডিটি থাকবে।

দ্রষ্টব্য - দৃ serial়ভাবে সুপারিশ করা হয় যে সমস্ত সিরিয়ালাইজযোগ্য ক্লাসগুলি স্পষ্টরূপে একটি সিরিয়াল ভার্সনিউডিউড ঘোষণা করে since the default serialVersionUID computation is highly sensitive to class details that may vary depending on compiler implementationsএবং deserialization এর সময় অপ্রত্যাশিত সিরিয়াল ভার্সনইউড বিবাদগুলির ফলে ডেসরিয়ালাইজেশন ব্যর্থ হয় to

সিরিয়ালাইজেবল ক্লাস পরিদর্শন করা হচ্ছে

এখানে চিত্র বর্ণনা লিখুন


একটি জাভা অবজেক্ট কেবল সিরিয়ালাইজযোগ্য। যদি কোনও শ্রেণি বা এর সুপারক্লাসগুলির কোনওটি জাভা.আইও.সিরাইজযোগ্য ইন্টারফেস বা এর সাব- ইন্টারফেস, জাভা.আই.ও এক্সটার্নালাইজেবল কার্যকর করে

  • কোনও শ্রেণীর অবশ্যই তার জাভ্যাকে সফলভাবে সিরিয়ালাইজ করতে জাভা.ও.সিরাইজযোগ্য ইন্টারফেস প্রয়োগ করতে হবে। সিরিয়ালাইজেবল একটি চিহ্নিত ইন্টারফেস এবং সংকলককে অবহিত করতে ব্যবহৃত হয় যে এটি বাস্তবায়নকারী শ্রেণিটি সিরিয়ালাইজযোগ্য আচরণ যুক্ত করতে হবে। এখানে জাভা ভার্চুয়াল মেশিন (জেভিএম) এর স্বয়ংক্রিয় সিরিয়ালাইজেশনের জন্য দায়ী।

    ক্ষণস্থায়ী কীওয়ার্ড: java.io.Serializable interface

    কোনও বস্তুকে সিরিয়ালাইজ করার সময় আমরা যদি অবজেক্টের নির্দিষ্ট ডেটা সদস্যদের সিরিয়ালাইজড না করতে চাই তবে আমরা ক্ষণস্থায়ী পরিবর্তনকারীটি ব্যবহার করতে পারি। ক্ষণস্থায়ী কীওয়ার্ডটি সেই ডেটা সদস্যকে ক্রমিকায়িত হতে বাধা দেবে।

    • ক্ষণস্থায়ী বা স্থির হিসাবে ঘোষিত ক্ষেত্রগুলি সিরিয়ালকরণ প্রক্রিয়া দ্বারা উপেক্ষা করা হয়।

    স্থানান্তর এবং ভলিটাইল

    +--------------+--------+-------------------------------------+
    |  Flag Name   |  Value | Interpretation                      |
    +--------------+--------+-------------------------------------+
    | ACC_VOLATILE | 0x0040 | Declared volatile; cannot be cached.|
    +--------------+--------+-------------------------------------+
    |ACC_TRANSIENT | 0x0080 | Declared transient; not written or  |
    |              |        | read by a persistent object manager.|
    +--------------+--------+-------------------------------------+
    class Employee implements Serializable {
        private static final long serialVersionUID = 2L;
        static int id;
    
        int eno; 
        String name;
        transient String password; // Using transient keyword means its not going to be Serialized.
    }
  • বহির্মুখী ইন্টারফেস বাস্তবায়ন বস্তুটির সিরিয়ালাইজড ফর্মের বিষয়বস্তু এবং বিন্যাসের উপর সম্পূর্ণ নিয়ন্ত্রণ ধরে রাখতে। বাহ্যিক ইন্টারফেস, রাইটইটার্নটার্নাল এবং রিড ইন্টারটার্নাল এর পদ্ধতিগুলিকে বস্তুর স্থিতি সংরক্ষণ এবং পুনরুদ্ধার করার জন্য ডাকা হয়। শ্রেণি দ্বারা প্রয়োগ করা হলে তারা অবজেক্টআউটপুট এবং অবজেক্টইনপুটের সমস্ত পদ্ধতি ব্যবহার করে নিজের রাষ্ট্র লিখতে এবং পড়তে পারে। ঘটে যাওয়া যে কোনও সংস্করণ পরিচালনা করা অবজেক্টগুলির দায়িত্ব।

    class Emp implements Externalizable {
        int eno; 
        String name;
        transient String password; // No use of transient, we need to take care of write and read.
    
        @Override
        public void writeExternal(ObjectOutput out) throws IOException {
            out.writeInt(eno);
            out.writeUTF(name);
            //out.writeUTF(password);
        }
        @Override
        public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
            this.eno = in.readInt();
            this.name = in.readUTF();
            //this.password = in.readUTF(); // java.io.EOFException
        }
    }
  • কেবল java.io.Serializable বা java.io.Externizable ইন্টারফেস সমর্থন করে এমন বস্তুগুলি written to/read from স্ট্রিম হতে পারে । প্রতিটি সিরিয়ালাইজযোগ্য অবজেক্টের শ্রেণি শ্রেণীর শ্রেণীর নাম এবং স্বাক্ষর, বস্তুর ক্ষেত্র এবং অ্যারের মান এবং প্রাথমিক অবজেক্টগুলি থেকে রেফারেন্সযুক্ত অন্য কোনও বস্তুর সমাপ্তকরণ সহ এনকোড থাকে।

ফাইলের জন্য সিরিয়ালযোগ্য উদাহরণ

public class SerializationDemo {
    static String fileName = "D:/serializable_file.ser";

    public static void main(String[] args) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException {
        Employee emp = new Employee( );
        Employee.id = 1; // Can not Serialize Class data.
        emp.eno = 77;
        emp.name = "Yash";
        emp.password = "confidential";
        objects_WriteRead(emp, fileName);

        Emp e = new Emp( );
        e.eno = 77;
        e.name = "Yash";
        e.password = "confidential";
        objects_WriteRead_External(e, fileName);

        /*String stubHost = "127.0.0.1";
        Integer anyFreePort = 7777;
        socketRead(anyFreePort); //Thread1
        socketWrite(emp, stubHost, anyFreePort); //Thread2*/

    }
    public static void objects_WriteRead( Employee obj, String serFilename ) throws IOException{
        FileOutputStream fos = new FileOutputStream( new File( serFilename ) );
        ObjectOutputStream objectOut = new ObjectOutputStream( fos );
        objectOut.writeObject( obj );
        objectOut.close();
        fos.close();

        System.out.println("Data Stored in to a file");

        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

            Employee emp = (Employee) readObject;
            System.out.format("Obj[No:%s, Name:%s, Pass:%s]", emp.eno, emp.name, emp.password);

            ois.close();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    public static void objects_WriteRead_External( Emp 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.
            Emp emp = new Emp();

            FileInputStream fis = new FileInputStream(new File( serFilename ));
            ObjectInputStream ois = new ObjectInputStream( fis );

            emp.readExternal(ois);

            System.out.format("Obj[No:%s, Name:%s, Pass:%s]", emp.eno, emp.name, emp.password);

            ois.close();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

নেটওয়ার্কের মাধ্যমে সিরিয়ালযোগ্য উদাহরণ

একই কম্পিউটারে বিভিন্ন প্রক্রিয়াতে, এমনকি কোনও নেটওয়ার্কের মাধ্যমে সংযুক্ত একাধিক কম্পিউটারেও কোনও ঠিকানার জায়গাগুলিতে অবজেক্টের অবস্থা বিতরণ করা হয়, তবে যা ডেটা ভাগ করে নেওয়ার এবং পদ্ধতিতে প্রার্থনা করে একত্রে কাজ করে।

/**
 * Creates a stream socket and connects it to the specified port number on the named host. 
 */
public static void socketWrite(Employee objectToSend, String stubHost, Integer anyFreePort) {
    try { // CLIENT - Stub[marshalling]
        Socket client = new Socket(stubHost, anyFreePort);
        ObjectOutputStream out = new ObjectOutputStream(client.getOutputStream());
        out.writeObject(objectToSend);
        out.flush();
        client.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
// Creates a server socket, bound to the specified port. 
public static void socketRead(  Integer anyFreePort ) {
    try { // SERVER - Stub[unmarshalling ]
        ServerSocket serverSocket = new ServerSocket( anyFreePort );
        System.out.println("Server serves on port and waiting for a client to communicate");
            /*System.in.read();
            System.in.read();*/

        Socket socket = serverSocket.accept();
        System.out.println("Client request to communicate on port server accepts it.");

        ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
        Employee objectReceived = (Employee) in.readObject();
        System.out.println("Server Obj : "+ objectReceived.name );

        socket.close();
        serverSocket.close();
    } catch (IOException | ClassNotFoundException e) {
        e.printStackTrace();
    }
}

@দেখা


1
আপনি যখন ছয় বছরের পুরানো প্রশ্নের একটি উত্তর যুক্ত করেছেন যার ইতিমধ্যে বেশ কয়েকটি বেশ কয়েকটি ভাল উত্তর রয়েছে, তখন আপনাকে বানান ত্রুটির একটি কাকফোনির চেয়ে আরও অনেক ভাল কাজ করতে হবে।
লার্নের মারকুইস

@ ইজেপ ডাউনভোটিং হল আপনার নেতিবাচক মতামত প্রকাশের হাতিয়ার। আপত্তিকর এবং সীমান্তরেখার অভদ্রতা গ্রহণযোগ্য নয়।
কনস্টান্টিনোস চের্তোরাস

1
@ কনস্টান্টিনোস চের্তুরাস ডাউনটোটের কারণ প্রদান করা পোস্টারের পক্ষে সহায়ক এবং এটি আমার কারণ, তাদের মতো বা আপনার মতো নয়।
লার্নের মারকুইস

আপনার ত্রুটিগুলি এড়াতে হবে যেমন জোর দেওয়া যে সিরিয়ালাইজেশনের একটি সুরক্ষিত উদ্দেশ্য রয়েছে। এটা হয় না।
লার্নের মার্কুইস

@ ইজেপি আমি আমার পোস্ট আপডেট করেছি, সংশোধন করেছি যে সিরিয়ালাইজেশন সুরক্ষার উদ্দেশ্যে নয়, তবে এটি কোনও বস্তুর অবস্থাকে কোনও স্টোরেজে রূপান্তর করতে এবং ডিসিজারাইজিং মেকানিসামের মাধ্যমে এসআইডি ব্যবহার করে কোনও অবজেক্টের মূল অবস্থা ফিরে পেতে ব্যবহার করা হয়। JVM to JVM
যশ

3

সিরিয়ালাইজেশন হ'ল স্টোরেজ মিডিয়ামে কোনও বস্তু সংরক্ষণ করার প্রক্রিয়া (যেমন কোনও ফাইল, বা একটি মেমরি বাফার) বা বাইনারি আকারে নেটওয়ার্ক সংযোগের মাধ্যমে এটিকে প্রেরণ করা। সিরিয়ালযুক্ত অবজেক্টগুলি জেভিএম স্বতন্ত্র এবং যে কোনও জেভিএম পুনরায় সিরিয়ালাইজ করা যায়। এই ক্ষেত্রে "মেমরি ইন" জাভা অবজেক্টস স্টেট বাইট স্ট্রিমে রূপান্তরিত হয়। এই ধরণের ফাইলটি ব্যবহারকারী বুঝতে পারে না। এটি একটি বিশেষ ধরণের অবজেক্ট অর্থাৎ জেভিএম (জাভা ভার্চুয়াল মেশিন) দ্বারা পুনরায় ব্যবহৃত। কোনও বস্তুকে সিরিয়ালাইজ করার এই প্রক্রিয়াটিকে কোনও বস্তুকে Deflating বা মার্শালিংও বলা হয়।

সিরিয়ালযুক্ত হওয়া অবজেক্টটির অবশ্যই java.io.Serializableইন্টারফেস প্রয়োগ করা উচিত । কোনও অবজেক্টের জন্য ডিফল্ট সিরিয়ালাইজেশন প্রক্রিয়া অবজেক্টের শ্রেণি, শ্রেণি স্বাক্ষর এবং সমস্ত অস্থায়ী এবং অ স্থিতিশীল ক্ষেত্রের মান লিখে।

class ObjectOutputStream extends java.io.OutputStream implements ObjectOutput,

ObjectOutputইন্টারফেসটি ইন্টারফেসটি প্রসারিত করে DataOutputএবং ফাইলগুলিতে সিরিয়ালাইজ করার জন্য এবং বাইটগুলি লেখার জন্য পদ্ধতি যুক্ত করে। ObjectOutputStreamপ্রসারিত java.io.OutputStreamএবং কার্যকরী ObjectOutput ইন্টারফেস। এটি স্ট্রিমে অবজেক্টস, অ্যারে এবং অন্যান্য মানকে সিরিয়ালাইজ করে। সুতরাং এর কনস্ট্রাক্টর ObjectOutputStreamলিখেছেন:

ObjectOutput ObjOut = new ObjectOutputStream(new FileOutputStream(f));

উপরের কোডটি নির্মাণকারীর ObjectOutputসাথে শ্রেণীর উদাহরণ তৈরি করতে ব্যবহৃত হয়েছে ObjectOutputStream( )যা এর উদাহরণটি গ্রহণ করেFileOuputStream প্যারামিটার হিসাবে ।

ObjectOutputইন্টারফেস বাস্তবায়ন দ্বারা ব্যবহৃত হয় ObjectOutputStreamবর্গ। দ্যObjectOutputStreamবস্তুর ধারাবাহিকভাবে করতে নির্মাণ করা হয়।

জাভাতে কোনও অবজেক্টকে ডিসায়রিজ করা

সিরিয়ালাইজেশনের বিপরীত ক্রিয়াকলাপকে ডেসরিয়ালাইজেশন বলা হয় অর্থাৎ বাইটের একটি সিরিজ থেকে ডেটা বের করার জন্য এটি ডিসরিয়ালাইজেশন হিসাবে পরিচিত যা এটিকে ফুলে বা unmarshalling বলা হয়।

ObjectInputStream ইন্টারফেস প্রসারিত java.io.InputStreamএবং প্রয়োগ করে ObjectInput। এটি কোনও ইনপুট স্ট্রিম থেকে অবজেক্টস, অ্যারে এবং অন্যান্য মানকে ডিসরিয়ালাইজ করে। সুতরাং এর কনস্ট্রাক্টর ObjectInputStreamলিখেছেন:

ObjectInputStream obj = new ObjectInputStream(new FileInputStream(f));

প্রোগ্রামের উপরের কোডটি ObjectInputStreamক্লাসের উদাহরণটি তৈরি করে যে ফাইলটি ObjectInputStreamশ্রেণীর দ্বারা সিরিয়ালীকৃত করা হয়েছিল সেটিকে ডিসরিয়ালাইজ করা হয়েছিল । উপরের কোডটি FileInputStreamক্লাসের উদাহরণটি ব্যবহার করে উদাহরণটি তৈরি করে যা নির্দিষ্ট ফাইল অবজেক্টটিকে ধরে রাখে যা ডিসিরিয়ালাইজড হতে হয় কারণ ObjectInputStream()কনস্ট্রাক্টরের ইনপুট স্ট্রিমের প্রয়োজন হয়।


2

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

এই সংক্ষিপ্ত নিবন্ধ থেকে আরও পড়ুন যা প্রক্রিয়াটির অংশীদারিত্বের অংশটি বেশ ভালভাবে ব্যাখ্যা করে এবং তারপরে সিরিয়ালাইজেবল জাভাদোকে চলে যায় । আপনি এই সম্পর্কিত প্রশ্নটি পড়তে আগ্রহী হতে পারেন ।


2

একটি অবজেক্ট হিসাবে ফাইলটি ফেরত দিন: http://www.tutorialspPoint.com/java/java_serialization.htm

        import java.io.*;

        public class SerializeDemo
        {
           public static void main(String [] args)
           {
              Employee e = new Employee();
              e.name = "Reyan Ali";
              e.address = "Phokka Kuan, Ambehta Peer";
              e.SSN = 11122333;
              e.number = 101;

              try
              {
                 FileOutputStream fileOut =
                 new FileOutputStream("/tmp/employee.ser");
                 ObjectOutputStream out = new ObjectOutputStream(fileOut);
                 out.writeObject(e);
                 out.close();
                 fileOut.close();
                 System.out.printf("Serialized data is saved in /tmp/employee.ser");
              }catch(IOException i)
              {
                  i.printStackTrace();
              }
           }
        }

    import java.io.*;
    public class DeserializeDemo
    {
       public static void main(String [] args)
       {
          Employee e = null;
          try
          {
             FileInputStream fileIn = new FileInputStream("/tmp/employee.ser");
             ObjectInputStream in = new ObjectInputStream(fileIn);
             e = (Employee) in.readObject();
             in.close();
             fileIn.close();
          }catch(IOException i)
          {
             i.printStackTrace();
             return;
          }catch(ClassNotFoundException c)
          {
             System.out.println("Employee class not found");
             c.printStackTrace();
             return;
          }
          System.out.println("Deserialized Employee...");
          System.out.println("Name: " + e.name);
          System.out.println("Address: " + e.address);
          System.out.println("SSN: " + e.SSN);
          System.out.println("Number: " + e.number);
        }
    }

এটি 'কী' বা 'দয়া করে ব্যাখ্যা করুন' প্রশ্নের প্রশ্নের উত্তর দেয় না।
লার্নের মার্কুইস

1

| * | শ্রেণি সিরিয়ালিং করা: কোনও বস্তুকে বাইট এবং বাইটগুলিকে বস্তুতে পরিণত করা (ডেসারিয়েশন)।

class NamCls implements Serializable
{
    int NumVar;
    String NamVar;
}

| => অবজেক্ট-সিরিয়ালাইজেশন হ'ল কোনও বস্তুর অবস্থা বাইটের বাষ্পে রূপান্তর করার প্রক্রিয়া।

  • | -> আপনি যখন জেভিএম এর জীবদ্দশায় অজানা অস্তিত্বটি চান তা প্রয়োগ করুন।
  • | -> সিরিয়ালযুক্ত অবজেক্টটি ডাটাবেসে সংরক্ষণ করা যেতে পারে।
  • | -> সিরিয়ালাইজযোগ্য-বস্তুগুলি মানুষের দ্বারা পড়া বা বোঝা যায় না যাতে আমরা সুরক্ষা পেতে পারি।

| => অবজেক্ট-ডিসরিয়ালাইজেশন হ'ল একটি অবজেক্টের অবস্থা পাওয়ার এবং এটি কোনও বস্তুতে সংরক্ষণ করার প্রক্রিয়া (java.lang.Object)।

  • | -> স্টেটটি সংরক্ষণের আগে এটি সিরিয়াল ভার্সনিউডিউড ফর্ম ইনপুট-ফাইল / নেটওয়ার্ক এবং .ক্লাস ফাইল সিরিয়াল ভার্সনিউডিউড একই কিনা তা পরীক্ষা করে।
    & nbsp & nbsp যদি java.io.In अवैधClassException নিক্ষেপ না করেন।

| => জাভা অবজেক্টটি কেবল সিরিয়ালাইজযোগ্য, যদি এটির শ্রেণি বা এর কোনও সুপারক্লাস থাকে

  • java.io.Sriizable ইন্টারফেস বা
  • এর subinterface, java.io.Externizable।

| => ক্লাসে স্থির ক্ষেত্রগুলি ক্রমিকায়িত করা যায় না।

class NamCls implements Serializable
{
    int NumVar;
    static String NamVar = "I won't be serializable";;
}

| => আপনি যদি শ্রেণীর ব্যবহারের ক্ষণস্থায়ী কীওয়ার্ডের একটি পরিবর্তনশীল সিরিয়াল করতে না চান

class NamCls implements Serializable
{
    int NumVar;
    transient String NamVar;
}

| => যদি কোনও শ্রেণি সিরিয়ালেজেবল প্রয়োগ করে তবে এর সমস্ত সাব ক্লাসগুলিও সিরিয়ালযোগ্য হবে।

| => কোনও শ্রেণীর যদি অন্য শ্রেণীর রেফারেন্স থাকে তবে সমস্ত উল্লেখ অবশ্যই সিরিয়ালাইজেবল হতে হবে অন্যথায় সিরিয়ালাইজেশন প্রক্রিয়া সম্পাদিত হবে না। এই জাতীয় ক্ষেত্রে,
নোটসিরাইজিয়েবল এক্সসেপশন রানটাইমের সময় নিক্ষেপ করা হয়।


0

আমি অবজেক্ট সিরিয়ালাইজেশন / deserialization এর ধারণামূলক উদ্দেশ্য / কার্যকরীতা সংহত করতে সম্ভাব্যভাবে সহায়তা করার জন্য একটি উপমা প্রস্তাব করব

আমি স্ট্রিম ড্রেনের মাধ্যমে কোনও বস্তুকে সরিয়ে নেওয়ার চেষ্টা করার প্রসঙ্গে অবজেক্ট সিরিয়ালাইজেশন / ডিসরিয়ালাইজেশন কল্পনা করি । বস্তু মূলত "পচে" হয় বা ধারাবাহিকভাবে নিজেই আরো মডুলার সংস্করণ মধ্যে - এই ক্ষেত্রে, একটি বাইট সিরিজের - কার্যকরভাবে করার জন্য একটি মাঝারি মধ্য দিয়ে গমন মঞ্জুর করা। একটি গণনামূলক অর্থে, আমরা স্ট্রিম ড্রেন দিয়ে বাইট দ্বারা ভ্রমণ পথটি কোনও নেটওয়ার্কের মধ্য দিয়ে ভ্রমণ করা বাইটের অনুরূপ দেখতে পেতাম। পরিবহণের আরও পছন্দসই মোড বা বিন্যাসের সাথে খাপ খাইয়ে নিতে আমরা আমাদের অবজেক্টটি ট্রান্সমুট করছি। সিরিয়ালযুক্ত বস্তুটি সাধারণত একটি বাইনারি ফাইলে সংরক্ষণ করা হবে যা পরে পাঠানো, লিখিত এবং উভয় হতে পারে।

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.