جاوا میں serialVersionUID کیوں استعمال کریں؟
جاوا میں، سیریلائزیشن کسی چیز کی حالت کو بائٹ سٹریم میں تبدیل کرنے کا ایک طریقہ کار ہے۔ یہ عمل اشیاء کو آسانی سے فائلوں میں محفوظ کرنے یا نیٹ ورکس پر منتقل کرنے کی اجازت دیتا ہے۔ تاہم، کلاس کے مختلف ورژنز میں سیریلائزڈ اشیاء کے درمیان مطابقت کو یقینی بنانا مشکل ہو سکتا ہے۔ یہ وہ جگہ ہے جہاں serialVersionUID کام میں آتا ہے۔
serialVersionUID ہر کلاس کے لیے ایک منفرد شناخت کنندہ ہے جو سیریلائز ایبل انٹرفیس کو لاگو کرتا ہے۔ یہ تصدیق کرنے میں مدد کرتا ہے کہ سیریلائزڈ آبجیکٹ کے بھیجنے والے اور وصول کنندہ کے پاس ایسی کلاسز ہیں جو سیریلائزیشن کے ساتھ مطابقت رکھتی ہیں۔ ایکلیپس اکثر انتباہات جاری کرتا ہے جب سیریل ورژن یو آئی ڈی غائب ہوتا ہے، مسلسل سیریلائزیشن کو برقرار رکھنے میں اس کی اہمیت پر زور دیتا ہے۔
کمانڈ | تفصیل |
---|---|
serialVersionUID | ہر سیریلائز ایبل کلاس کے لیے ایک منفرد شناخت کنندہ، جو سیریلائزڈ آبجیکٹ کے بھیجنے والے اور وصول کنندہ کی توثیق کرنے کے لیے استعمال کیا جاتا ہے، اس میں مطابقت پذیر کلاسز ہیں۔ |
ObjectOutputStream | ایک کلاس جو آؤٹ پٹ اسٹریم پر آبجیکٹ لکھنے کے لیے استعمال ہوتی ہے، جس سے فائل میں آبجیکٹ کو سیریلائز کرنا ممکن ہوتا ہے۔ |
ObjectInputStream | ایک کلاس ان پٹ سٹریم سے اشیاء کو پڑھنے کے لیے استعمال ہوتی ہے، جس سے فائل سے اشیاء کی ڈی سیریلائزیشن کو فعال کیا جاتا ہے۔ |
writeObject | آبجیکٹ آؤٹ پٹ اسٹریم کا ایک طریقہ کسی چیز کو سیریلائز کرنے اور اسے آؤٹ پٹ اسٹریم میں لکھنے کے لئے استعمال ہوتا ہے۔ |
readObject | آبجیکٹ ان پٹ اسٹریم کا ایک طریقہ ان پٹ اسٹریم سے کسی چیز کو ڈی سیریلائز کرنے کے لیے استعمال ہوتا ہے۔ |
IOException | ایک استثناء جو اس وقت ہوتا ہے جب I/O آپریشن ناکام ہوجاتا ہے یا اس میں خلل پڑتا ہے۔ |
ClassNotFoundException | ایک استثناء جو اس وقت ہوتا ہے جب کوئی ایپلیکیشن اپنے سٹرنگ نام کے ذریعے کلاس لوڈ کرنے کی کوشش کرتی ہے لیکن کلاس کے لیے کوئی تعریف نہیں ملتی ہے۔ |
serialVersionUID اور سیریلائزیشن کیسے کام کرتی ہے۔
فراہم کردہ اسکرپٹس کی اہمیت کو ظاہر کرتے ہیں۔ جاوا سیریلائزیشن میں۔ پہلی مثال میں، کلاس لاگو کرتا ہے انٹرفیس اور شامل ہے a serialVersionUID میدان یہ فیلڈ بہت اہم ہے کیونکہ یہ یقینی بناتا ہے کہ ڈی سیریلائزیشن کے دوران، کلاس سیریلائزڈ آبجیکٹ کے ورژن سے میل کھاتی ہے۔ کلاس میں کنسٹرکٹر اور ایک اوور رائیڈڈ بھی ہوتا ہے۔ اس کے شعبوں کو ظاہر کرنے کا طریقہ۔ دی کلاس یہ ظاہر کرتی ہے کہ کس طرح کی مثال کو سیریلائز اور ڈی سیریلائز کرنا ہے۔ استعمال کرتے ہوئے ObjectOutputStream اور . اس عمل میں آبجیکٹ کو فائل میں لکھنا اور اسے واپس پڑھنا شامل ہے، اس بات کو یقینی بنانا کہ آبجیکٹ اپنی حالت کو برقرار رکھے۔
دوسری اسکرپٹ سے پتہ چلتا ہے کہ جب کلاس کا ڈھانچہ تبدیل ہوتا ہے لیکن کیا ہوتا ہے۔ ویسا ہی رہتا ہے۔ میں ایک نیا فیلڈ شامل کرکے کلاس، سیریلائزڈ شکل بدل جاتی ہے۔ تاہم، کیونکہ وہی ہے، ڈی سیریلائزیشن اب بھی غلطیوں کے بغیر کامیاب ہو سکتی ہے، اگرچہ ممکنہ ڈیٹا کے نقصان یا غلط تشریح کے ساتھ۔ یہ اس بات پر روشنی ڈالتا ہے کہ مستقل مزاجی کیوں برقرار رکھی جائے۔ 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 پسماندہ مطابقت کو برقرار رکھنے میں مدد کرتا ہے اور اس بات کو یقینی بناتا ہے کہ سیریلائزیشن میکانزم سمجھتا ہے کہ کلاس کے مختلف ورژن کے درمیان کیسے تبدیل کیا جائے۔
مستقل مزاجی کے بغیر ڈی سیریلائزیشن ایک کے ساتھ ناکام ہو سکتی ہے۔ بھیجنے والے اور وصول کنندہ کی کلاسوں کے درمیان مماثلت کی نشاندہی کرتا ہے۔ یہ تقسیم شدہ نظاموں میں خاص طور پر پریشانی کا باعث ہے جہاں مختلف نظاموں میں سیریلائزڈ اشیاء کا تبادلہ ہوتا ہے یا طویل عرصے تک برقرار رہتا ہے۔ واضح طور پر تعریف کرتے ہوئے ۔ ، ڈیولپرز ورژن کے درمیان مطابقت کو کنٹرول کر سکتے ہیں، جس سے ڈی سیریلائزیشن کے عمل کو توڑے بغیر کلاس ڈھانچے میں تبدیلی کی اجازت دی جا سکتی ہے۔ یہ مشق ایسے حالات میں ضروری ہے جہاں مختلف ورژنز میں ریاست اور ڈیٹا کی سالمیت کو برقرار رکھنا بہت ضروری ہے، جیسے کہ انٹرپرائز ایپلی کیشنز اور ڈیٹا پرسسٹینس لیئرز میں۔
serialVersionUID کے بارے میں اکثر پوچھے گئے سوالات
- کیا ?
- یہ ہر ایک کے لیے ایک منفرد شناخت کنندہ ہے۔ کلاس، اس بات کو یقینی بنانے کے لیے استعمال کیا جاتا ہے کہ سیریلائزڈ آبجیکٹ کے بھیجنے والے اور وصول کنندہ کے پاس مطابقت پذیر کلاسز ہوں۔
- کیوں ہے اہم؟
- یہ کلاس کے مختلف ورژن کے درمیان مطابقت کو برقرار رکھنے میں مدد کرتا ہے اس بات کو یقینی بنا کر کہ سیریلائزڈ آبجیکٹ کو صحیح طریقے سے ڈی سیریلائز کیا جا سکے۔
- کیا ہوتا ہے اگر اعلان نہیں کیا جاتا؟
- جاوا رن ٹائم پر ایک پیدا کرتا ہے، جس کی وجہ سے ہوسکتا ہے۔ اگر طبقاتی ڈھانچہ بدل جاتا ہے۔
- کر سکتے ہیں۔ روکنا ?
- جی ہاں، ایک مسلسل ڈی سیریلائزیشن کے دوران طبقاتی مطابقت کو یقینی بنا کر اس استثنا کو روکتا ہے۔
- میں کیسے اعلان کروں؟ ایک کلاس میں؟
- آپ اسے ایک کے طور پر اعلان کرتے ہیں کلاس کے اندر میدان.
- ہے لازمی؟
- اگرچہ لازمی نہیں ہے، یہ انتہائی قابل اعتماد سیریلائزیشن اور ڈی سیریلائزیشن کو یقینی بنانے کی سفارش کی جاتی ہے۔
- کیا میں بدل سکتا ہوں؟ ?
- ہاں، لیکن اسے تبدیل کرنے سے پہلے کی سیریلائزڈ اشیاء کے ساتھ مطابقت ٹوٹ جائے گی، جس کی وجہ سے .
- کی ڈیفالٹ ویلیو کیا ہے۔ اگر اعلان نہیں کیا؟
- جاوا اس کا حساب کلاس کے شعبوں اور طریقوں کی بنیاد پر کرتا ہے، لیکن یہ قدر مختلف ورژن یا ماحول میں یکساں نہیں ہے۔
کے کردار کو سمجھنا جاوا سیریلائزیشن کے ساتھ کام کرنے والے ڈویلپرز کے لیے بہت اہم ہے۔ یہ منفرد شناخت کنندہ اس بات کو یقینی بنانے میں مدد کرتا ہے کہ سیریلائزڈ اشیاء کو قابل اعتماد طریقے سے ڈی سیریلائز کیا جا سکتا ہے، یہاں تک کہ کلاس تیار ہوتی ہے۔ ایک مستقل کے بغیر ، کلاس ڈھانچے میں تبدیلیاں ڈی سیریلائزیشن کی غلطیوں اور ڈیٹا کی سالمیت کے مسائل کا باعث بن سکتی ہیں۔ اس شناخت کنندہ کو واضح طور پر بیان کرنے سے، ڈویلپرز کلاس کے مختلف ورژنز میں مطابقت برقرار رکھ سکتے ہیں اور ہموار سیریلائزیشن کے عمل کو یقینی بنانا۔