সিরিয়ালাইজেবল বলতে কী বোঝায়?


136

কোন শ্রেণীর Serializableজাভাতে থাকার অর্থ কী ? বা সাধারণভাবে, এই বিষয়ে ...


10
@ স্কাফম্যান এখানে ক্লাসের জন্য যা বলেছে তা এখানে 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.
বোস

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

উত্তর:


131

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

আপনার প্রশ্নের প্রসঙ্গে এটি একটি ইন্টারফেস যা কোনও শ্রেণিতে প্রয়োগ করা হলে এই শ্রেণিটি স্বয়ংক্রিয়ভাবে সিরিয়ালযুক্ত এবং বিভিন্ন সিরিয়ালেরাইজার দ্বারা deserialized করা যেতে পারে।


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

1
সুতরাং যখন আমরা "অবজেক্টস" সম্পর্কে কথা বলছি তখন আমরা কী বোঝাতে চাইছি কোনও শ্রেণি দ্বারা পদার্থ ইনস্ট্যান্টিয়েটেড, বা কেবল কোনও "সফ্টওয়্যার অবজেক্টস" যেমন সমাবেশ, ফাইল ইত্যাদি? এবং যদি এটি পরে থাকে তবে এটি কি প্রোগ্রাম এবং পরিবেশের মধ্যে ডেটা প্রেরণের একটি প্রমিত উপায়?
সানবার্স্ট 275

1
@ সানবার্স্ট ২75৫ - এই ক্ষেত্রে, এটি মেমরির একটি শ্রেণির মেমরির উপস্থাপনা - অর্থাত্ একটি শ্রেণীর উদাহরণ (অ্যাসেমব্লির সিরিয়ালাইজেশন সম্পর্কে কথা বলার আসল বিন্দু নেই, কারণ তারা সাধারণত ডিস্কে ফাইল হিসাবে থাকে যা পারে কেবল যেমন হয় তেমন পাঠানো হবে)।
ওদেডে

43

যদিও বেশিরভাগ ব্যবহারকারী ইতিমধ্যে উত্তরটি দিয়ে গেছেন, তবে আমি যারা ধারণা প্রয়োজন তাদের জন্য একটি উদাহরণ যুক্ত করতে চাই ধারণাটি ব্যাখ্যা করার জন্য:

ধরা যাক আপনার নিম্নলিখিত শ্রেণীর মতো শ্রেণির একজন ব্যক্তি আছেন:

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();
    }

ধন্যবাদ. আমি এখন এটি পেয়েছিলাম বলে মনে করি।
সানবার্স্ট 275

39

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


14

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

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

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

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

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

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

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

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 বস্তুর থেকে নাল যেমন না লেখা হয়েছিল।


2
এই বিস্তারিত ব্যাখ্যার জন্য আপনাকে ধন্যবাদ।
প্রতিশ্রুতি প্রেস্টন

এটি একটি সুন্দর ব্যাখ্যা! ধন্যবাদ! তবে সত্যি কথা বলতে কী, এই এন্ট্রিটি আপনার ব্লগের চেয়ে বেশ পরিষ্কার দেখাচ্ছে। যাইহোক, এটি অনেক সাহায্য করেছে!
সানবার্স্ট 275

11

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


1
এই সংজ্ঞাটি আরও সুনির্দিষ্ট মনে হয়। ধন্যবাদ.
প্রতিশ্রুতি প্রেস্টন

6

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

আপনার অ্যাপ্লিকেশনটি কোনও বিকল্প হিসাবে রঙ পরিবর্তন করতে পারে তা কল্পনা করুন, বাহ্যিক সেটিংটি না রেখেই প্রতিবার যখন আপনি এটি চালান তখন আপনাকে রঙ পরিবর্তন করতে হবে।


5
এটি কোনও 'সংকলকের পতাকা' নয়। এটি রানটাইমতে সিরিয়ালাইজেশন সাবসিস্টেমের পতাকা।
লার্নের মারকুইস

1
@ এজেপি - ধন্যবাদ, এটি জানেন না
AphexMunky

শ্রদ্ধার সাথে, কেন আপনি যখন এটি সত্য হতে জানেন না তখন এটি লিখবেন? আপনি 'ক্ষণস্থায়ী'ও রেখে গেছেন। সব মিলিয়ে খারাপ উত্তর, দুঃখিত।
লার্নের মারকুইস

19
আমি যদি এটি না লিখে থাকি তবে আমি সংশোধন করতাম না এবং আরও খারাপ হয়ে যেতাম। অন্যান্য সমস্ত উত্তর খুব ক্ষণস্থায়ী ছেড়ে গেছে। আপনি একটি উত্তরও লিখেন নি, আপনি কেবল অন্য লোককে ট্রল করছেন।
অ্যাফেক্সমুনকি

4

সিরিয়ালাইজেশন হ'ল ফাইলগুলিতে অবজেক্ট এবং ডেটা সংরক্ষণ করার বা লেখার একটি কৌশল। ব্যবহার ObjectOutputStreamএবং FileOutputStreamক্লাস দ্বারা। এই শ্রেণিগুলিতে অবিরত থাকার জন্য তাদের নির্দিষ্ট পদ্ধতি রয়েছে। মতwriteObject();

পরিসংখ্যান সহ স্পষ্ট ব্যাখ্যা জন্য। আরও তথ্যের জন্য এখানে দেখুন


2

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

উচ্চ প্রস্তাবিত: আরও শিখতে জোশুয়া ব্লচের কার্যকর জাভা থেকে আইটেম 37 পড়া ।


2

ক্রমিকায়ন: ফাইল / নেটওয়ার্ক বা অন্য কোথাও অবজেক্টের রাজ্য রচনা ing (ফাইল সমর্থিত ফর্ম বা নেটওয়ার্ক সমর্থিত ফর্মের কাছে জাভা অবজেক্ট সমর্থিত ফর্ম)

বিশৃঙ্খলা: ফাইল / নেটওয়ার্ক বা অন্য কোথাও থেকে অবজেক্টের অবস্থা পড়া Read (জাভা অবজেক্ট সমর্থিত ফর্মের কাছে ফাইল / নেটওয়ার্ক সমর্থিত ফর্ম)


0

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

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