JavaRush /جاوا بلاگ /Random-UR /انٹرفیس - مارکر
dupliaka
سطح
Санкт-Петербург

انٹرفیس - مارکر

گروپ میں شائع ہوا۔
مارکر انٹرفیس رن ٹائم ٹائپ چیکنگ کے ساتھ ایک ڈیزائن پیٹرن ہیں جو آپ کو انٹرفیس اور کلاس کو منسلک کرنے کی اجازت دیتا ہے۔ یہ سمجھنے کے لیے کہ یہ کیوں ضروری ہو سکتا ہے، سیریلائزیبل کلاس کو مارکر سے نشان زد کرنے کی ایک مثال پر غور کریں۔ آئیے فرض کریں کہ ہمیں کسی چیز کی حالت کو میموری میں محفوظ کرنے کی ضرورت ہے، اور پھر جو کچھ ہم نے محفوظ کیا ہے اسے ڈکرپٹ کرنے کے قابل بھی ہوں۔ پھر، آپ کہتے ہیں، ہم اپنے آبجیکٹ کو بٹس کے سیٹ میں تبدیل کر سکتے ہیں۔ ٹھیک ہے۔ ہم FileInputStream کا استعمال کرتے ہوئے فائل پر لکھنے کا ایک آسان طریقہ استعمال کر سکتے ہیں، لیکن یہ صرف اس صورت میں آسان ہے جب کچھ چیزیں ہوں، لیکن اگر ان میں سے بہت سی چیزیں ہوں تو کیا ہوگا؟ اس کے لیے ایک شاندار سیریلائزیشن ٹول ہے۔ جب آپ اسے استعمال کرتے ہیں تو بنیادی اصول یہ ہے کہ جس آبجیکٹ کو سیریلائز کیا جا رہا ہے اس میں تمام ڈیٹا ہونا چاہیے اور دیگر اشیاء کا حوالہ نہیں دینا چاہیے۔ اپنی کلاس کو دیکھیں "آہا، فیلڈز کا حوالہ نہیں دیا گیا ہے اور سیریلائز ایبل مارکر لگانا اچھا ہے۔" اور جب آپ اسے ڈالیں گے تو اس کا مطلب یہ ہوگا کہ جن اشیاء کو آپ نے نشان زد کیا ہے انہیں ObjectOutputStream پر لکھا جاسکتا ہے۔ ObjectOutputStream کلاس میں ایک writeObject0() طریقہ ہے، اور اس میں چیکس کی مثال موجود ہے جو چیک کرتی ہے کہ آیا آبجیکٹ کو لکھا جا سکتا ہے اور اگر چیک کی پوری سیریز ناکام ہو جاتی ہے، تو NotSerializableException رعایت پھینک دی جاتی ہے، اور اگر نہیں، تو سب کچھ صاف ستھرا میموری پر لکھا جاتا ہے۔ آئیے ایک BigObject کلاس بناتے ہیں، جس کی مثالیں ہم سیریلائز کریں گے۔ package post1; import java.io.Serializable; public class BigObject implements Serializable { private int id; public void setId(final int id){ this.id = id; } public int getId() { return id; } } BigObject کلاس پہلے ہی سیریلائز کے طور پر نشان زد ہے۔ اس میں ایک آئی ڈی فیلڈ اور اس کے ساتھ حاصل/سیٹ کے طریقے ہیں۔ package post1; import post1.BigObject; import java.io.*; public class InterfaceMarker { public static void main(String[] args) throws IOException, ClassNotFoundException { int originalId = 12; BigObject objectOriginal = new BigObject(); objectOriginal.setId(originalId); ByteArrayOutputStream writeBuffer = new ByteArrayOutputStream(); ObjectOutputStream outputStream = new ObjectOutputStream(writeBuffer); outputStream.writeObject(objectOriginal); outputStream.close(); byte[] buffer = writeBuffer.toByteArray(); ByteArrayInputStream readBuffer = new ByteArrayInputStream(buffer); ObjectInputStream inputStream = new ObjectInputStream(readBuffer); BigObject objectCopy = (BigObject)inputStream.readObject(); if (objectCopy.getId() == originalId) System.out.println( "originalId equals copiedId"); } }

کسی چیز کو ریکارڈ کرنا

سب سے پہلے، ہم سیریلائزیبل کلاس BigObject کا ایک آبجیکٹ بناتے ہیں، پھر ہم اس کے لیے ڈیٹا بفر تیار کرتے ہیں - وہ جگہ جہاں ہم تمام دخشیں ByteArrayOutputStream ڈالیں گے۔ پھر ہم پہلے سے ذکر کردہ ObjectOutputStream کو تیار کرتے ہیں اور اس میں بفر پاس کرتے ہیں۔ ہم اپنے آبجیکٹ کو سٹریم پر لکھتے ہیں اور اسے بند کر دیتے ہیں۔

کسی چیز کو پڑھنا

آئیے رائٹ بفر ریڈ بفر تیار کریں، ان پٹ اسٹریم پاس کریں، readObject() پڑھیں۔ اعتراض اب بحال کر دیا گیا ہے. اس حقیقت کی بدولت کہ `id` فیلڈ ایک لنک نہیں تھا، ہم سیریلائز ایبل کلاس کو نشان زد کرنے کے قابل تھے، جس میں مکمل طور پر اس کا ڈیٹا موجود ہے۔ ہماری کلاس کے اندر توثیق کے افعال کو شامل کرنے کے بجائے، ٹوکن ہمیں کلاس کی توثیق کے عمل کو آسان بنانے کی اجازت دیتے ہیں۔
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION