پروتکل بافرز

پروتکل بافرز، یک روش سریالیزه کردن اطلاعات است که توسط گوگل برای استفاده داخلی توسعه یافته بود که بعداً برای استفاده عموم منتشر شد. از این روش برای برقرار کردن ارتباطات بین برنامه‌ها توسط سیم یا ذخیره کردن اطلاعات استفاده می‌شود. این روش شامل یک زبان توصیف میانی و یک کامپایلر که کدهای مختلف برای زبان‌های برنامه‌نویسی مختلف از این زبان توصیف میانی تولید می‌کند، است.

در ابتدای ارائه توسط گوگل، کامپایلر آن فقط برای زبان‌های C++، جاوا و پایتون، کد تولید می‌کرد ولی توسط اشخاص ثالث، برای بسیاری زبان دیگر مانند گو، جاوا‌اسکریپت، سی‌شارپ، روبی، پی اچ پی و.. توسعه یافت.

مثال 
در زبان توصیف میانی، پیام‌هایی که تبادل خواهند شد تعریف می‌شود. تعریف پیام‌ها شبیه تعریف کلاس‌های فقط حاوی اطلاعات در زبان‌های برنامه‌نویسی است. هر فیلد با یک عدد منحصر به فرد هم شماره‌گذاری می‌شود که در تبادل اطلاعات فقط همین شماره منتقل می‌شود تا از ارسال حجم بالای اطلاعات جلوگیری شود.
message Point {
  required int32 x = 1;
  required int32 y = 2;
  optional string label = 3;
}

message Line {
  required Point start = 1;
  required Point end = 2;
  optional string label = 3;
}

message Polyline {
  repeated Point point = 1;
  optional string label = 2;
}
پیام Point، دو فیلد اجباری x و y تعریف می‌کند. فیلد label اختیاری است. پیام‌های Line و Polyline هم استفاده از تجمیع را در پروتکل بافرز نشان می‌دهند (هر دو از Pointاستفاده می‌کنند). Polyline یک فیلد repeated هم دارد که شبیه آرایه در زبان‌های برنامه‌نویسی است.

این کد توسط proto (کامپایلر پروتکل بافرز) کامپایل شده و به عنوان خروجی، کد C++ می‌دهد که می‌تواند اطلاعات را نوشته و بخواند. یک برنامه C++ که از این کد استفاده می‌کند، شبیه زیر می‌تواند باشد:
#include "polyline.pb.h"  // generated by calling protoc polyline.proto (defined above)

Line* createNewLine(const std::string& name) {
  Line* line = new Line;
  line->mutable_start()->set_x(10);
  line->mutable_start()->set_y(20);
  line->mutable_end()->set_x(30);
  line->mutable_end()->set_y(40);
  line->set_label(name);
  return line;
}

Polyline* createNewPolyline() {
  Polyline* polyline = new Polyline;
  Point* point1 = polyline->add_point();
  point1->set_x(10);
  point1->set_y(10);
  Point* point2 = polyline->add_point();
  point2->set_x(10);
  point2->set_y(10);
  return polyline;
}

منابع

پیوند به بیرون 
 سایت رسمی پروژه
 دیگر سایت پروژه در سایت برنامه‌های منبع‌باز گوگل

نرم‌افزارهای گوگل
قالب‌های سریال‌سازی داده‌ها
نرم‌افزارهایی که از پروانه بی‌اس‌دی استفاده می‌کنند