जावा - सीरियल

जावा एक तंत्र प्रदान करता है, जिसे ऑब्जेक्ट सीरियलाइजेशन कहा जाता है, जहां एक ऑब्जेक्ट को बाइट्स के अनुक्रम के रूप में दर्शाया जा सकता है जिसमें ऑब्जेक्ट के डेटा के साथ-साथ ऑब्जेक्ट के प्रकार और ऑब्जेक्ट में संग्रहीत डेटा के प्रकार के बारे में जानकारी शामिल होती है।

किसी सीरियल किए गए ऑब्जेक्ट को किसी फ़ाइल में लिखे जाने के बाद, इसे फ़ाइल से पढ़ा जा सकता है और डीसर्विलाइज़ किया जा सकता है, जो कि प्रकार, सूचना और बाइट्स ऑब्जेक्ट का प्रतिनिधित्व करता है और इसके डेटा का उपयोग मेमोरी में ऑब्जेक्ट को फिर से बनाने के लिए किया जा सकता है।

सबसे प्रभावशाली यह है कि पूरी प्रक्रिया JVM स्वतंत्र है, जिसका अर्थ है कि एक वस्तु को एक मंच पर क्रमांकित किया जा सकता है और एक पूरी तरह से दूसरे मंच पर deserialized किया जा सकता है।

कक्षाओं ObjectInputStream तथा ObjectOutputStream उच्च-स्तरीय धाराएँ हैं जो किसी वस्तु को क्रमबद्ध और निष्क्रिय करने की विधियाँ शामिल करती हैं।

ObjectOutputStream वर्ग में विभिन्न डेटा प्रकार लिखने के लिए कई लिखने के तरीके शामिल हैं, लेकिन विशेष रूप से एक विधि बाहर खड़ी है -

public final void writeObject(Object x) throws IOException

उपरोक्त विधि किसी ऑब्जेक्ट को क्रमबद्ध करती है और इसे आउटपुट स्ट्रीम में भेजती है। इसी प्रकार, ObjectInputStream वर्ग में ऑब्जेक्ट को डीसर्विलाइज़ करने के लिए निम्न विधि है -

public final Object readObject() throws IOException, ClassNotFoundException

यह विधि अगली वस्तु को धारा से बाहर निकालती है और इसे निष्क्रिय कर देती है। रिटर्न वैल्यू ऑब्जेक्ट है, इसलिए आपको इसे इसके उपयुक्त डेटा प्रकार में डालना होगा।

यह दिखाने के लिए कि जावा में क्रमांकन कैसे काम करता है, मैं उस कर्मचारी वर्ग का उपयोग करने जा रहा हूं, जिसकी हमने पुस्तक में शुरुआती चर्चा की थी। मान लीजिए कि हमारे पास निम्न कर्मचारी वर्ग है, जो सीरियल के इंटरफ़ेस को लागू करता है -

उदाहरण

public class Employee implements java.io.Serializable {
   public String name;
   public String address;
   public transient int SSN;
   public int number;
   
   public void mailCheck() {
      System.out.println("Mailing a check to " + name + " " + address);
   }
}

ध्यान दें कि किसी वर्ग के लिए सफलतापूर्वक अनुक्रमित होने के लिए, दो शर्तों को पूरा करना होगा -

  • वर्ग को java.io.Serializable इंटरफ़ेस लागू करना होगा।

  • कक्षा के सभी क्षेत्र क्रमबद्ध होने चाहिए। यदि कोई क्षेत्र क्रमिक नहीं है, तो उसे चिह्नित किया जाना चाहिएtransient

यदि आप यह जानने के लिए उत्सुक हैं कि क्या एक जावा स्टैंडर्ड क्लास सीरियल करने योग्य है या नहीं, तो क्लास के लिए दस्तावेज़ीकरण देखें। परीक्षण सरल है: यदि वर्ग java.io.Serializable लागू करता है, तो यह धारावाहिक है; अन्यथा, यह नहीं है।

किसी वस्तु को क्रमबद्ध करना

ObjectOutputStream वर्ग का उपयोग किसी ऑब्जेक्ट को क्रमबद्ध करने के लिए किया जाता है। निम्न SerializeDemo प्रोग्राम एक कर्मचारी ऑब्जेक्ट को तुरंत देता है और इसे एक फ़ाइल में क्रमांकित करता है।

जब प्रोग्राम निष्पादित किया जाता है, तो कर्मचारी नामक एक फ़ाइल बनाई जाती है। प्रोग्राम कोई आउटपुट उत्पन्न नहीं करता है, लेकिन कोड का अध्ययन करें और यह निर्धारित करने का प्रयास करें कि प्रोग्राम क्या कर रहा है।

Note - जब किसी ऑब्जेक्ट को किसी फाइल में क्रमबद्ध किया जाता है, तो जावा में मानक कन्वेंशन फाइल को देने के लिए होता है .ser विस्तार।

उदाहरण

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

किसी वस्तु का वर्णन करना

निम्न DeserializeDemo प्रोग्राम SerializeDemo प्रोग्राम में बनाए गए कर्मचारी ऑब्जेक्ट को deserializes। कार्यक्रम का अध्ययन करें और इसके उत्पादन को निर्धारित करने का प्रयास करें -

उदाहरण

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

यह निम्नलिखित परिणाम का उत्पादन करेगा -

उत्पादन

Deserialized Employee...
Name: Reyan Ali
Address:Phokka Kuan, Ambehta Peer
SSN: 0
Number:101

यहाँ महत्वपूर्ण बिंदुओं का उल्लेख किया जा रहा है -

  • प्रयास / कैच ब्लॉक एक ClassNotFoundException को पकड़ने की कोशिश करता है, जिसे readObject () विधि द्वारा घोषित किया जाता है। जेवीएम के लिए किसी वस्तु को डिसेर्बलाइज करने में सक्षम होना, यह कक्षा के लिए बायटेकोड को खोजने में सक्षम होना चाहिए। यदि JVM किसी ऑब्जेक्ट के डीरिएरलाइज़ेशन के दौरान एक क्लास नहीं ढूँढ सकता है, तो वह ClassNotFoundException को फेंकता है।

  • ध्यान दें कि readObject () का रिटर्न मान कर्मचारी के संदर्भ में दिया गया है।

  • SSN फ़ील्ड का मान 11122333 था जब ऑब्जेक्ट सीरियल किया गया था, लेकिन क्योंकि फ़ील्ड क्षणिक है, यह मान आउटपुट स्ट्रीम में नहीं भेजा गया था। Deserialized कर्मचारी ऑब्जेक्ट का SSN फ़ील्ड 0 है।