Protocol Buffers (Protobuf) ساختہ شدہ ڈیٹا کے لیے ایک بائنری سیریلائیزیشن فارمیٹ ہے، جو Google نے خدمات کے درمیان موثر معلومات کے تبادلے کے لیے تیار کیا ہے۔ اس فارمیٹ میں .proto فائلوں میں پھلے سے اسکیما کی تعریف درکار ہے، جس سے مختلف زبانوں کے لیے کوڈ تیار کیا جاتا ہے۔ Google کی سرکاری دستاویز کے مطابق، Protobuf JSON سے 3-10 گنا چھوٹا پیغام کا حجم فراہم کرتا ہے۔ Protobuf gRPC، Google Maps اور ہزاروں اندرونی خدمات میں استعمال ہوتا ہے۔
اہم نکات
Protocol Buffers Google کا تیار کردہ ساختہ شدہ ڈیٹا سیریلائیزیشن میکانزم ہے، جو JSON اور XML کے مشابہ ہے، لیکن ایک بنیادی فرق کے ساتھ: ڈیٹا بائنری فارمیٹ میں انکوڈ ہوتا ہے۔ اس کا مطلب ہے کہ Protobuf پیغام نگھی آنکھ سے نہیں پڑھا جا سکتا، لیکن یہ متن کے متبادلوں کے مقابلے میں کافی کم جگہ گھیرتا ہے اور تیزی سے پروسیس ہوتا ہے۔
Protobuf کو Google کے اندر خدمات کے درمیان ڈیٹا کے تبادلے میں کارکردگی کے مسائل حل کرنے کے لیے بنایا گیا تھا۔ 2008 میں، یہ ٹیکنالجی ایک آپن سورس منصوبہ بن گئی جیس میں کئی زبانوں کی حمایت ہے: C++، Java، Python، Go، JavaScript، Kotlin، Swift، Dart اور دیگر۔ 2016 میں جاری کردہ proto3 وریشن نے سینٹیکس کو آسان بنایا اور مزید زبانوں کے لیے حمایت کا اضافہ کیا۔
Protobuf اور JSON کے درمیان بنیادی فرق ڈیٹا کے تبادلے شروع کرنے سے پھلے اسکیما کی وضاحت کرنے کی ضرورت ہے۔ اسکیما فائل (.proto) پیغام کی ساخت کو بیان کرتی ہے: فیلڈز، اقسام اور منفرد فیلڈ نمبرز۔ اس اسکیما سے، protoc کامپائلر سیریلائیزیشن اور ڈی سیریلائیزیشن کے لیے ہدف زبان میں کلاسز تیار کرتا ہے۔
Protobuf کا آرکیٹیکچر میں تین اہم اجزاء شامل ہیں: اسکیما تعریف زبان (.proto)، protoc کامپائلر اور مختص زبانوں کے لیے ران ٹائم لائبریز۔ ڈیولپر .proto فائل میں ڈیٹا کی ساخت کو بیان کرتا ہے، ترتیب چلاتا ہے، اور اس ڈیٹا کے ساتھ کام کرنے کے لیے تیار کلاسز حاصل کرتا ہے۔
Protobuf پیغام میں ہر فیلڈ کا ایک منفرد نمبر (فیلڈ نمبر) ہوتا ہے — یہ ایک سیکوینشیل نمبر نہیں ہے، بلکہ ایک ٹیگ ہے جو بائنری فارمیٹ میں فیلڈ کی شناخت کے لیے استعمال ہوتا ہے۔ 1 سے 15 تک کے نمبر ایک بائٹ میں، 16 سے 2047 تک دو بائٹ میں انکوڈ ہوتے ہیں۔ لہذا، زیادہ استعمال کے اہم فیلڈز کو حجم کی بہترینی کے لیے 1 سے 15 تک نمبر دیا جانا چاہیے۔
Protobuf اقسام کی ایک وسیع رینج کو سپورٹ کرتا ہے: اسکیلر (int32, int64, float, double, bool, string, bytes)، اینوم (enum)، کامپوزیٹ (message)، اور خاص اقسام (oneof, map)۔ هر قسم کی ایک مخصوص بائنری نمائندگی ہوتی ہے جو متبقہ استعمال کے لیے بہترین کی گئی ہے۔
| .proto قسم | C++ قسم | Java/Kotlin | تفصیل |
|---|---|---|---|
| double | double | double | 64 بٹ کا فلوٹنگ پوائنٹ نمبر |
| float | float | float | 32 بٹ کا فلوٹنگ پوائنٹ نمبر |
| int32 | int32 | int | 32 بٹ، متغیر لمبائی انکوڈنگ |
| int64 | int64 | long | 64 بٹ، متغیر لمبائی انکوڈنگ |
| string | string | String | UTF-8 سٹرنگ |
| bytes | string | ByteString | صوری بائٹس |
| bool | bool | boolean | true / false |
Protobuf متن کے فارمیٹوں کے مقابلے میں تین اہم فوائد فراہم کرتا ہے: پیغام کا حجم، سیریلائیزیشن کی رفتار، اور مضبوط ٹائٺنگ۔ زیادہ بار کے نظام اور محدود ٹریفک والی موبائل ایپلیکیشنز میں، یہ فوائد اہم ہو جاتے ہیں۔
Protobuf کی بائنری نمائندگی نمبروں کے لیے متغیر لمبائی انکوڈنگ (Varint) استعمال کرتی ہے: چھوٹے نمبر 1 بائٹ، بڑے نمبر 10 بائٹ تک لیتے ہیں۔ یہ شناختی نشاندہندگان، جھنڈروں اور کاؤنٹروں کی موثر انکوڈنگ کی اجازت دیتا ہے جو JSON یا XML میں متن سٹرنگز کے طور پر دستوں بائٹس لیتے۔ مثال کے طور پر، 150 کا نمبر Protobuf میں 2 بائٹ، JSON میں 3 بائٹ (“150” کے طور پر)، XML میں 3 بائٹ + ٹیگز لیتا ہے۔
ایک اضافی فائدہ پشت کی مناسبت ہے۔ اسکیما میں ایک نیا فیلڈ شامل کرنے سے پرانے کلائنٹس نہیں ٹوٹتے: وہ صرف نامعلوم فیلڈز کو نظرانداز کرتے ہیں۔ ایک فیلڈ کو حذف کرنے کے لیے مستقبل میں ٹکراو سے بچنے کے لیے صرف اس کا نمبر محفوظ کرنے کی ضرورت ہے۔
.proto اسکیما ایک خاص زبان میں ڈیٹا کی ساخت کو بیان کرتا ہے۔ فائل سینٹیکس (proto3)، پیکیج اور ایمپورٹ انحصارات کی وضاحت سے شروع ہوتی ہے۔ ہر پیغام کو کلیمہ message کے ساتھ فیلڈز کے ساتھ تعریف کیا جاتا ہے، جہاں ہر فیلڈ کی ایک قسم، نام اور منفرد نمبر ہوتا ہے۔
اچھے اسکیمہ کے طریقے: اکسر استعمال کیے جانے والے فیلڈز کے لیے 1 سے 15 فیلڈ نمبرز، با معنی نام، متعلقہ فیلڈز کو علاحدہ message میں گروپ کرنا، ان فیلڈز کے لیے oneof کا استعمال کرنا جو کئی اختیارات میں سے صرف ایک ہو سکتے ہیں۔
syntax = "proto3";
package mobileapp;
message User {
string user_id = 1;
string name = 2;
string email = 3;
int32 age = 4;
UserRole role = 5;
repeated string tags = 6;
map<string, string> metadata = 7;
}
enum UserRole {
USER_ROLE_UNSPECIFIED = 0;
USER_ROLE_USER = 1;
USER_ROLE_ADMIN = 2;
USER_ROLE_MODERATOR = 3;
}
پیغام نیسٹڈ ہو سکتے ہیں: Profile قسم کا ایک profile فیلڈ اندر صارف کا ڈیٹا رکھے گا۔ نیسٹنگ کی حمایت تعریفات کو دوھرانے کے بغیر مختلف درجے دار ساختوں کو بیان کرنے کی اجازت دیتی ہے۔
syntax = "proto3";
package mobileapp;
message Order {
string order_id = 1;
repeated OrderItem items = 2;
double total_price = 3;
PaymentInfo payment = 4;
}
message OrderItem {
string product_id = 1;
string title = 2;
int32 quantity = 3;
double price = 4;
}
message PaymentInfo {
string method = 1;
string transaction_id = 2;
double amount = 3;
}
protoc کامپائلر .proto فائلوں کو ہدف زبان میں سورس کوڈ میں تبدیل کرتا ہے۔ Kotlin/Java کے لیے --java_out پارامیٹر، Swift کے لیے --swift_out (Apple Swift Protobuf پلاگائن کے ذریعے)، Dart کے لیے --dart_out استعمال ہوتا ہے۔ تیار کرده کلاسز میں پیغام تعمیر کے لیے builder طریقے اور سیریلائیزیشن/ڈی سیریلائیزیشن کے طریقے شامل ہیں۔
Android پر، Protobuf کے ساتھ کام کرنے کے لیے Gradle میں com.google.protobuf پلاگائن وریشن 0.9+ استعمال ہوتا ہے۔ پلاگائن شامل کرنے اور .proto فائلوں کی وضاحت کے بعد، بیلڈ خودکار طور پر ایپلیکیشن میں استعمال کے لیے تیار Kotlin کلاسز تیار کرتا ہے۔
import com.google.protobuf.kotlin.toByteString
import com.example.mobileapp.UserOuterClass.User
fun createUser(): User {
return User.newBuilder()
.setUserId("usr_001")
.setName("IT Sectr")
.setEmail("team@itsectr.com")
.setAge(5)
.setRole(UserOuterClass.UserRole.USER_ROLE_ADMIN)
.addTags("mobile")
.addTags("backend")
.build()
}
fun serializeAndDeserialize(user: User): User {
// بائنری فارمیٹ میں سیریلائیزیشن
val bytes = user.toByteArray()
// بائنری فارمیٹ سے ڈی سیریلائیزیشن
return User.parseFrom(bytes)
}
Protobuf مائیکرو سروس آرکیٹیکچر اور موبائل ایپلیکیشنز میں خاص طور پر موثر ہے۔ ایک عام منظرنامہ پر غور کریں: ایک موبائل ایپلیکیشن gRPC کے ذریعے سرور سے مصالح کی فہرست وصول کرتى ہے۔ Protobuf پیغام میں شناختی نشاندهندہ، نام، قیمت اور زمرہ سمیت مصدور کی معلومات شامل ہے۔ بائنری فارمیٹ JSON کے مقابلے میں جواب کے حجم کو 5-8 گنا کم کرتا ہے۔
سرور کی جانب Protobuf کے ساتھ ایک gRPC سروس کی مثال۔ سروس GetProducts RPC طریقے کا اعلان کرتی ہے، جو صفحات کے پارامیٹرز کے ساتھ ایک درخواست قبول کرتا ہے اور مصالح کی فہرست واپس کرتا ہے۔ Kotlin نفاذ درخواستوں اور جوابوں کے ساتھ کام کرنے کے لیے تیار کردہ کلاسز کا استعمال کرتا ہے۔
import com.example.mobileapp.ProductServiceGrpcKt
import com.example.mobileapp.ProductOuterClass.Product
import com.example.mobileapp.ProductOuterClass.GetProductsRequest
import com.example.mobileapp.ProductOuterClass.GetProductsResponse
class ProductService : ProductServiceGrpcKt.ProductServiceCoroutineImplBase() {
override suspend fun getProducts(
request: GetProductsRequest
): GetProductsResponse {
val products = fetchProductsFromDb(
page = request.page,
limit = request.limit
)
return GetProductsResponse.newBuilder()
.addAllProducts(products)
.setTotalCount(products.size)
.build()
}
}
Android پروجیکٹ میں Protobuf کا سیٹ اپ com.google.protobuf Gradle پلاگائن کے ذریعے کیا جاتا ہے۔ پلاگائن بیلڈ کے دوران خودکار طور پر protoc کامپائلر چلاتا ہے اور .proto فائلوں سے Kotlin کلاسز تیار کرتا ہے۔ کام کرنے کے لیے، آپ کو پروجیکٹ کے build.gradle میں پلاگائن شامل کرنا ہوگا اور اسے ایپلیکیشن ماڈیول میں نفاذ کرنا ہوگا۔
Gradle کو ترتیب دینے کے بعد، .proto فائلیں src/main/proto ڈائریکٹری میں رکھی جاتی ہیں۔ protoc کامپائلر ہر بیلڈ پر ان پر کارروائی کرتا ہے، Kotlin کلاسز تیار کرتا ہے جو ایپلیکیشن کوڈ میں استعمال کیا جا سکتا ہے۔ پروجیکٹ کی دیگر لائبریز کے ساتھ انحصاری ٹکراو سے بچنے کے لیے protobuf اور protoc کے وریشنز کو صحیح طور پر متعین کرنا اہم ہے۔
iOS پروجیکٹوں کے لیے، Protobuf کو CocoaPods یا Swift Package Manager کے ذریعے منسلک کیا جاتا ہے۔ Swift Protobuf پلاگائن Codable پروٹوکل کے مطابق Swift ساختوں کو خودکار طور پر تیار کرتا ہے۔ Flutter کے لیے Dart پروجیکٹوں میں، protobuf پیکیج استعمال ہوتا ہے اور ترتیب dart run protoc_plugin کے ذریعے کی جاتی ہے۔
اکثر پوچے جانے والے سوالات
Protobuf لازمی اسکیما کے ساتھ ایک بائنری فارمیٹ ہے، JSON سے 3-10 گنا زیادہ کمپیکٹ ہے۔ JSON متن کے بنیاد پر ہے، انسان پڑھ سکتا ہے اور اسکیما کی ضرورت نہیں ہے۔ Protobuf تیزی سے سیریلائیز اور ڈی سیریلائیز کرتا ہے لیکن .proto فائلوں کی ترتیب درکار ہے۔ JSON کو ڈیباگ کرنا آسان ہے اور پھلے سے سیٹ اپ کی ضرورت نہیں ہے۔
اپنے پلیٹ فارم کے لیے protobuf GitHub ریلیز سے protoc ڈاؤن لوڈ کریں۔ macOS کے لیے، brew install protobuf کے ذریعے انسٹول کریں۔ Windows کے لیے، زپ آرکائیو ڈاؤن لوڈ کریں اور protoc.exe کو PATH میں شامل کریں۔ Android/Kotlin کے لیے، com.google.protobuf Gradle پلاگائن استعمال کریں، جو بیلڈ کے دوران خودکار طور پر ترتیب چلاتا ہے۔
gRPC Google کا ایک اعلی کارکردگی RPC فریم ورک ہے جو Protobuf کو اپنی انٹرفیس تعریف زبان (IDL) اور سیریلائیزیشن فارمیٹ کے طور پر استعمال کرتا ہے۔ gRPC .proto فائلوں میں سروسز اور RPC طریقے کی وضاحت کرتا ہے، کلائنٹ اور سرور کا کوڈ تیار کرتا ہے، اور سٹریمنگ اور بائنری پروٹوکلز کی حمایت کرتا ہے۔
Google کی سرکاری طور پر حمایت یافتہ: C++، Java، Kotlin، Python، Go، Ruby، C#، PHP، JavaScript، Objective-C، Swift اور Dart۔ کمیونٹی نے Rust، TypeScript، Scala، Lua اور دیگر زبانوں کے لیے حمایت تیار کی ہے۔ موبائل ڈیولپمنٹ کے لیے، Kotlin/Java (Android) اور Swift/Objective-C (iOS) دستیاب ہیں۔
Protobuf ان قوانین کے ذریعے پشت کی مناسبت کی حمایت کرتا ہے: فیلڈ نمبرز نہ بدلیں، فیلڈز نہ ہٹائیں (reserved استعمال کریں)، نئے نمبروں کے ساتھ نئے فیلڈز شامل کریں۔ پرانے کلائنٹس نامعلوم فیلڈز کو نظرانداز کرتے ہیں، نئے کلائنٹس غائب پرانے فیلڈز کے لیے ڈی فولٹ ویلیوز حاصل کرتے ہیں۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں