معرفی پروتکل بافر گوگل

در این مقاله ما قصد معرفی پروتکل بافر گوگل(protobuf)-یک فرمت شناخته شده برای داده های باینری- را داریم. ما میتوانیم یک فایل را بر اساس یک پروتکل تعریف کنیم و بعد با استفاده از همان پروتکل، کد ها را در زبانهایی مثل جاوا، C++، C#، Go و یا Python تولید کنیم.

این یک مقاله ابتدایی است که مطابق یک پروتکل نوشته شده است. اگر میخواهید ببینید که چطور از روش Spring با استفاده از یک برنامه تحت وب مقاله را فرمت بندی کرده ایم ادامه مطلب را بخوانید.

تعریف وابستگی  Maven

برای استفاده از پروتکل بافرها در زبان جاوا ابتدا نیاز داریم که وابستگی های Maven رو در فایلی با نام protobuf-java اضافه کنیم.

تعریف یک پروتکل

بگذارید یک مثال ساده بزنیم. ما میتوانیم یک پروتکل ساده را در فایل protobuf به شکل زیر تعریف کنیم.

این یک پروتکل برای یک پیام ساده از نوع Person است که تنها یک فیلد از نوع رشته بعنوان نام نیاز دارد.

اجازه دهید تا مثالهای پیچیده تری برای تعریف پروتکل بزنیم. ما نیاز داریم که جزئیات بیشتری را راجب Person در پروتکل خود ذخیره کنیم.

در اینجا پروتکل ما شامل دو نوع داده هست: یک نوع Person و یک نوع AddressBook . بعد از تولید شدن کد(در بخش بعد بیشتر راجب این موضوع صحبت میکنیم). این کلاس ها، کلاس های داخلی درون کلاس AddressBookProtos  هستند. وقتی که ما یک فیلد را بصورت required تعریف میکنیم به این معنی است که اگر شئ را بدون آن فیلد تعریف کنیم(یعنی به آن فیلد مقدار ندهیم) باعث بروز خطا می شود.

اگر یک فیلد را با کلمه کلیدی optional تعریف کنیم نیازی نیست که به آن فیلد مقدار دهیم و یک فیلد که با نام کلیدی repeated تعریف میشود یک آرایه از سایز های مختلف را شامل میشود.

همه فیلد ها اندیس گذاری میشوند. فیلدی که با شماره یک نمایش داده میشود بعنوان فیلد اول در یک فایل باینری ذخیره خواهد شد. فیلدی که با شماره دو علامت گذاری میشود بعنوان فیلد بعدی در فایل ذخیره خواهد شد و الی آخر. این مسئله باعث میشود تا بفهمیم که فیلدها چطور در حافظه جای گذاری میشوند.

تولید کردن کدهای جاوا از یک فایل Protobuf

یکبار که فایل را تعریف کنیم میتوانیم کدهای جاوا را از روی آن بسازیم.

اول ما باید فایل protobuf را روی ماشین مورد نظر نصب کنیم. یکبار که این کار را انجام دهیم میتوانیم کدها را با اجرا کردن یک دستور protoc بسازیم.

دستور protoc فایل خروجی را از فایل addressbook.proto ی ما تولید خواهد کرد. گزینه -I مسیری که در آن فایل  proto قرار دارد را مشخص میکند.  Java-out مسیری را مشخص میکند که در آن فایل خروجی تولید شده ذخیره خواهد شد. کلاسی که تولید میشود شامل تنظیم کننده ها، دریافت کننده ها، سازنده ها و توابع سازنده برای پیامی که تعریف کرده ایم، میشود. همچنین این فایل بعضی متدها جهت ذخیره فایل protobuf و نیز معکوس سازی از فایل باینری به کلاس جاوا را دارد.

ساخت یک نمونه از پیامهای تعریف شده Protobuf

ما براحتی میتوانیم از یک کد برای ایجاد یک نمونه از کلاس Persson در زبان جاوا استفاده کنیم.

ما میتوانیم یک پیام دلخواه را با استفاده از متد ()newBuilder ایجاد کنیم و بعد از مقداردهی به تمامی فیلدهای مورد نیاز آن، میتوانیم متد ()build را برای ساخت یک نمونه از کلاس Person فراخوانی کنیم.

تبدیل کدها از باینری به جاوا و برعکس در Protobuf

وقتیکه ما یکبار یک نمونه از کلاس Person را میسازیم میخواهیم آن را به زبان باینری روی دیسک ذخیره کنیم تا با پروتکل سازنده سازگار باشد. اجازه بدهید تا بگوییم میخواهیم یک نمونه از کلاس AddressBook بسازیم و سپس یک Person را بعنوان یک شیء به آن اضافه کنیم.

سپس آن فایل را روی دیسک ذخیره کنیم-برای این کار متد ()WriteTo استفاده میشود- برای اینکار از کدهای زیر میتوانیم استفاده کنیم:

بعد از اجرای متد، شیء ما به شکل باینری تبدیل شده و سپس روی دیسک ذخیره میشود. برای خواندن آن از روی دیسک و تبدیل مجدد آن به شیء AddressBook ما می توانیم از متد ()mergeFrom به شکل زیر استفاده کنیم:

نتیجه گیری

این یک مقاله کوتاه و مختصر بود که در آن نحوه تعریف و ذخیره داده ها در قالب باینری را در Google Protocol Buffer توضیح دادیم.

ما یک پروتکل ساده تعریف کردیم سپس یک نمونه کد جاوا را با توجه به همان پروتکل کامپایل کردیم و در آخر دیدیم که چطور با استفاده از protobuf اشیاء از باینری به کد جاوا و برعکس تبدیل میشوند.

پیاده سازی همه این مثال ها و تکه کدها را میتوانید در GitHub project پیدا کنید.

اگر این مطلب رو دوست داشتید، می تونید با دوستاتون به اشتراک بگذارید: