جاوا میں serialVersionUID اور اس کی اہمیت کو سمجھنا

جاوا میں serialVersionUID اور اس کی اہمیت کو سمجھنا
Java

جاوا میں serialVersionUID کیوں استعمال کریں؟

جاوا میں، سیریلائزیشن کسی چیز کی حالت کو بائٹ سٹریم میں تبدیل کرنے کا ایک طریقہ کار ہے۔ یہ عمل اشیاء کو آسانی سے فائلوں میں محفوظ کرنے یا نیٹ ورکس پر منتقل کرنے کی اجازت دیتا ہے۔ تاہم، کلاس کے مختلف ورژنز میں سیریلائزڈ اشیاء کے درمیان مطابقت کو یقینی بنانا مشکل ہو سکتا ہے۔ یہ وہ جگہ ہے جہاں serialVersionUID کام میں آتا ہے۔

serialVersionUID ہر کلاس کے لیے ایک منفرد شناخت کنندہ ہے جو سیریلائز ایبل انٹرفیس کو لاگو کرتا ہے۔ یہ تصدیق کرنے میں مدد کرتا ہے کہ سیریلائزڈ آبجیکٹ کے بھیجنے والے اور وصول کنندہ کے پاس ایسی کلاسز ہیں جو سیریلائزیشن کے ساتھ مطابقت رکھتی ہیں۔ ایکلیپس اکثر انتباہات جاری کرتا ہے جب سیریل ورژن یو آئی ڈی غائب ہوتا ہے، مسلسل سیریلائزیشن کو برقرار رکھنے میں اس کی اہمیت پر زور دیتا ہے۔

کمانڈ تفصیل
serialVersionUID ہر سیریلائز ایبل کلاس کے لیے ایک منفرد شناخت کنندہ، جو سیریلائزڈ آبجیکٹ کے بھیجنے والے اور وصول کنندہ کی توثیق کرنے کے لیے استعمال کیا جاتا ہے، اس میں مطابقت پذیر کلاسز ہیں۔
ObjectOutputStream ایک کلاس جو آؤٹ پٹ اسٹریم پر آبجیکٹ لکھنے کے لیے استعمال ہوتی ہے، جس سے فائل میں آبجیکٹ کو سیریلائز کرنا ممکن ہوتا ہے۔
ObjectInputStream ایک کلاس ان پٹ سٹریم سے اشیاء کو پڑھنے کے لیے استعمال ہوتی ہے، جس سے فائل سے اشیاء کی ڈی سیریلائزیشن کو فعال کیا جاتا ہے۔
writeObject آبجیکٹ آؤٹ پٹ اسٹریم کا ایک طریقہ کسی چیز کو سیریلائز کرنے اور اسے آؤٹ پٹ اسٹریم میں لکھنے کے لئے استعمال ہوتا ہے۔
readObject آبجیکٹ ان پٹ اسٹریم کا ایک طریقہ ان پٹ اسٹریم سے کسی چیز کو ڈی سیریلائز کرنے کے لیے استعمال ہوتا ہے۔
IOException ایک استثناء جو اس وقت ہوتا ہے جب I/O آپریشن ناکام ہوجاتا ہے یا اس میں خلل پڑتا ہے۔
ClassNotFoundException ایک استثناء جو اس وقت ہوتا ہے جب کوئی ایپلیکیشن اپنے سٹرنگ نام کے ذریعے کلاس لوڈ کرنے کی کوشش کرتی ہے لیکن کلاس کے لیے کوئی تعریف نہیں ملتی ہے۔

serialVersionUID اور سیریلائزیشن کیسے کام کرتی ہے۔

فراہم کردہ اسکرپٹس کی اہمیت کو ظاہر کرتے ہیں۔ serialVersionUID جاوا سیریلائزیشن میں۔ پہلی مثال میں، کلاس Foo لاگو کرتا ہے Serializable انٹرفیس اور شامل ہے a serialVersionUID میدان یہ فیلڈ بہت اہم ہے کیونکہ یہ یقینی بناتا ہے کہ ڈی سیریلائزیشن کے دوران، کلاس سیریلائزڈ آبجیکٹ کے ورژن سے میل کھاتی ہے۔ کلاس میں کنسٹرکٹر اور ایک اوور رائیڈڈ بھی ہوتا ہے۔ toString اس کے شعبوں کو ظاہر کرنے کا طریقہ۔ دی SerializationExample کلاس یہ ظاہر کرتی ہے کہ کس طرح کی مثال کو سیریلائز اور ڈی سیریلائز کرنا ہے۔ Foo استعمال کرتے ہوئے ObjectOutputStream اور ObjectInputStream. اس عمل میں آبجیکٹ کو فائل میں لکھنا اور اسے واپس پڑھنا شامل ہے، اس بات کو یقینی بنانا کہ آبجیکٹ اپنی حالت کو برقرار رکھے۔

دوسری اسکرپٹ سے پتہ چلتا ہے کہ جب کلاس کا ڈھانچہ تبدیل ہوتا ہے لیکن کیا ہوتا ہے۔ serialVersionUID ویسا ہی رہتا ہے۔ میں ایک نیا فیلڈ شامل کرکے Foo کلاس، سیریلائزڈ شکل بدل جاتی ہے۔ تاہم، کیونکہ serialVersionUID وہی ہے، ڈی سیریلائزیشن اب بھی غلطیوں کے بغیر کامیاب ہو سکتی ہے، اگرچہ ممکنہ ڈیٹا کے نقصان یا غلط تشریح کے ساتھ۔ یہ اس بات پر روشنی ڈالتا ہے کہ مستقل مزاجی کیوں برقرار رکھی جائے۔ serialVersionUID مطابقت کے لیے ضروری ہے۔ حتمی اسکرپٹ بغیر سیریلائزیشن کی تقلید کرتا ہے۔ serialVersionUID، جس کی قیادت کر سکتے ہیں InvalidClassException اگر طبقاتی فرق ہے۔ یہ چھوڑنے کے ممکنہ خطرات کو ظاہر کرتا ہے۔ serialVersionUID سیریلائز کلاس میں۔

جاوا سیریلائزیشن میں serialVersionUID کو سمجھنا

چاند گرہن کے ساتھ جاوا سیریلائزیشن

import java.io.Serializable;

public class Foo implements Serializable {
    private static final long serialVersionUID = 1L;
    private String name;
    private int age;

    public Foo(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Foo{name='" + name + "', age=" + age + "}";
    }
}

گمشدہ سیریل ورژن یو آئی ڈی اور اس کے نتائج کی مثال

جاوا ڈی سیریلائزیشن کی خرابی۔

import java.io.*;

public class SerializationExample {
    public static void main(String[] args) {
        Foo foo = new Foo("John Doe", 30);
        String filename = "foo.ser";

        try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(filename))) {
            out.writeObject(foo);
        } catch (IOException e) {
            e.printStackTrace();
        }

        try (ObjectInputStream in = new ObjectInputStream(new FileInputStream(filename))) {
            Foo deserializedFoo = (Foo) in.readObject();
            System.out.println("Deserialized Foo: " + deserializedFoo);
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

طبقاتی ڈھانچے کو تبدیل کرنے کے مسئلے کی نقالی

جاوا کلاس ارتقاء کا مسئلہ

import java.io.*;

public class Foo implements Serializable {
    private static final long serialVersionUID = 1L;
    private String name;
    private int age;
    private String address;  // New field added

    public Foo(String name, int age, String address) {
        this.name = name;
        this.age = age;
        this.address = address;
    }

    @Override
    public String toString() {
        return "Foo{name='" + name + "', age=" + age + ", address='" + address + "'}";
    }
}

serialVersionUID کے بغیر ڈی سیریلائزیشن کا مسئلہ

جاوا غیر مطابقت پذیر ڈیسیریلائزیشن

import java.io.*;

public class DeserializationIssueExample {
    public static void main(String[] args) {
        String filename = "foo.ser";

        try (ObjectInputStream in = new ObjectInputStream(new FileInputStream(filename))) {
            Foo deserializedFoo = (Foo) in.readObject();
            System.out.println("Deserialized Foo: " + deserializedFoo);
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

کلاس ارتقاء میں serialVersionUID کا کردار

استعمال کرنے کا ایک اہم پہلو serialVersionUID طبقاتی ارتقا میں اس کا کردار ہے۔ جب کلاس لاگو کرتی ہے۔ Serializable، اس کا مطلب یہ ہے کہ کلاس کی مثالوں کو بائٹ اسٹریم میں سیریلائز کیا جاسکتا ہے اور مثال کی ایک کاپی میں واپس سیریلائز کیا جاسکتا ہے۔ وقت گزرنے کے ساتھ، کلاسیں تیار ہوتی ہیں؛ فیلڈز کو شامل کیا جا سکتا ہے، ہٹایا جا سکتا ہے، یا تبدیل کیا جا سکتا ہے۔ اگر serialVersionUID اعلان نہیں کیا گیا ہے، جاوا رن ٹائم پر ایک پیدا کرنے کے لیے ایک پیچیدہ الگورتھم کا استعمال کرتا ہے، جو کلاس کی ساخت میں تبدیلی کے وقت غیر متوقع نتائج کا باعث بن سکتا ہے۔ لہذا، ایک واضح کی وضاحت serialVersionUID پسماندہ مطابقت کو برقرار رکھنے میں مدد کرتا ہے اور اس بات کو یقینی بناتا ہے کہ سیریلائزیشن میکانزم سمجھتا ہے کہ کلاس کے مختلف ورژن کے درمیان کیسے تبدیل کیا جائے۔

مستقل مزاجی کے بغیر serialVersionUIDڈی سیریلائزیشن ایک کے ساتھ ناکام ہو سکتی ہے۔ InvalidClassExceptionبھیجنے والے اور وصول کنندہ کی کلاسوں کے درمیان مماثلت کی نشاندہی کرتا ہے۔ یہ تقسیم شدہ نظاموں میں خاص طور پر پریشانی کا باعث ہے جہاں مختلف نظاموں میں سیریلائزڈ اشیاء کا تبادلہ ہوتا ہے یا طویل عرصے تک برقرار رہتا ہے۔ واضح طور پر تعریف کرتے ہوئے ۔ serialVersionUID، ڈیولپرز ورژن کے درمیان مطابقت کو کنٹرول کر سکتے ہیں، جس سے ڈی سیریلائزیشن کے عمل کو توڑے بغیر کلاس ڈھانچے میں تبدیلی کی اجازت دی جا سکتی ہے۔ یہ مشق ایسے حالات میں ضروری ہے جہاں مختلف ورژنز میں ریاست اور ڈیٹا کی سالمیت کو برقرار رکھنا بہت ضروری ہے، جیسے کہ انٹرپرائز ایپلی کیشنز اور ڈیٹا پرسسٹینس لیئرز میں۔

serialVersionUID کے بارے میں اکثر پوچھے گئے سوالات

  1. کیا serialVersionUID?
  2. یہ ہر ایک کے لیے ایک منفرد شناخت کنندہ ہے۔ Serializable کلاس، اس بات کو یقینی بنانے کے لیے استعمال کیا جاتا ہے کہ سیریلائزڈ آبجیکٹ کے بھیجنے والے اور وصول کنندہ کے پاس مطابقت پذیر کلاسز ہوں۔
  3. کیوں ہے serialVersionUID اہم؟
  4. یہ کلاس کے مختلف ورژن کے درمیان مطابقت کو برقرار رکھنے میں مدد کرتا ہے اس بات کو یقینی بنا کر کہ سیریلائزڈ آبجیکٹ کو صحیح طریقے سے ڈی سیریلائز کیا جا سکے۔
  5. کیا ہوتا ہے اگر serialVersionUID اعلان نہیں کیا جاتا؟
  6. جاوا رن ٹائم پر ایک پیدا کرتا ہے، جس کی وجہ سے ہوسکتا ہے۔ InvalidClassException اگر طبقاتی ڈھانچہ بدل جاتا ہے۔
  7. کر سکتے ہیں۔ serialVersionUID روکنا InvalidClassException?
  8. جی ہاں، ایک مسلسل serialVersionUID ڈی سیریلائزیشن کے دوران طبقاتی مطابقت کو یقینی بنا کر اس استثنا کو روکتا ہے۔
  9. میں کیسے اعلان کروں؟ serialVersionUID ایک کلاس میں؟
  10. آپ اسے ایک کے طور پر اعلان کرتے ہیں static final long کلاس کے اندر میدان.
  11. ہے serialVersionUID لازمی؟
  12. اگرچہ لازمی نہیں ہے، یہ انتہائی قابل اعتماد سیریلائزیشن اور ڈی سیریلائزیشن کو یقینی بنانے کی سفارش کی جاتی ہے۔
  13. کیا میں بدل سکتا ہوں؟ serialVersionUID?
  14. ہاں، لیکن اسے تبدیل کرنے سے پہلے کی سیریلائزڈ اشیاء کے ساتھ مطابقت ٹوٹ جائے گی، جس کی وجہ سے InvalidClassException.
  15. کی ڈیفالٹ ویلیو کیا ہے۔ serialVersionUID اگر اعلان نہیں کیا؟
  16. جاوا اس کا حساب کلاس کے شعبوں اور طریقوں کی بنیاد پر کرتا ہے، لیکن یہ قدر مختلف ورژن یا ماحول میں یکساں نہیں ہے۔

سیریلائزیشن مطابقت کو یقینی بنانا

کے کردار کو سمجھنا serialVersionUID جاوا سیریلائزیشن کے ساتھ کام کرنے والے ڈویلپرز کے لیے بہت اہم ہے۔ یہ منفرد شناخت کنندہ اس بات کو یقینی بنانے میں مدد کرتا ہے کہ سیریلائزڈ اشیاء کو قابل اعتماد طریقے سے ڈی سیریلائز کیا جا سکتا ہے، یہاں تک کہ کلاس تیار ہوتی ہے۔ ایک مستقل کے بغیر serialVersionUID، کلاس ڈھانچے میں تبدیلیاں ڈی سیریلائزیشن کی غلطیوں اور ڈیٹا کی سالمیت کے مسائل کا باعث بن سکتی ہیں۔ اس شناخت کنندہ کو واضح طور پر بیان کرنے سے، ڈویلپرز کلاس کے مختلف ورژنز میں مطابقت برقرار رکھ سکتے ہیں InvalidClassException اور ہموار سیریلائزیشن کے عمل کو یقینی بنانا۔