מבוא למאגר הפרוטוקולים של גוגל

1. סקירה כללית

במאמר זה נבחן את מאגר הפרוטוקולים של גוגל (protobuf) - פורמט נתונים בינארי ידוע-אגנוסטי. אנו יכולים להגדיר קובץ עם פרוטוקול ובאמצעות פרוטוקול זה נוכל ליצור קוד בשפות כמו Java, C ++, C #, Go או Python.

זהו מאמר מבוא לפורמט עצמו; אם ברצונך לראות כיצד להשתמש בפורמט עם יישום אינטרנט באביב, עיין במאמר זה.

2. הגדרת תלות Maven

כדי להשתמש במאגרי פרוטוקולים זה Java, עלינו להוסיף תלות ב- Maven ל- protobuf-java:

 com.google.protobuf protobuf-java $ {protobuf.version} 3.2.0 

3. הגדרת פרוטוקול

נתחיל בדוגמא. אנו יכולים להגדיר פרוטוקול פשוט מאוד בפורמט protobuf:

הודעה אדם {שם מחרוזת חובה = 1; }

זהו פרוטוקול של מסר פשוט של אדם סוג שיש בו רק שדה חובה אחד - שם שיש לו חוּט סוּג.

בואו נסתכל על הדוגמה המורכבת יותר להגדרת פרוטוקול. בואו נגיד שאנחנו צריכים לאחסן פרטי אדם בפורמט protobuf:

חבילה protobuf;

חבילה protobuf; אפשרות java_package = "com.baeldung.protobuf"; אפשרות java_outer_classname = "AddressBookProtos"; הודעה אדם {שם מחרוזת חובה = 1; חובה int32 id = 2; דוא"ל מחרוזת אופציונלי = 3; מספר מחרוזות חוזר = 4; } הודעת פנקס כתובות {אנשים חוזרים ונשנים = 1; }

הפרוטוקול שלנו מורכב משני סוגים של נתונים: א אדם ו פנקס הכתובות. לאחר יצירת הקוד (עוד על כך בסעיף המאוחר), המחלקות הללו יהיו המחלקות הפנימיות בתוך ה- AddressBookProtos מעמד.

כאשר אנו רוצים להגדיר שדה נדרש - כלומר יצירת אובייקט ללא שדה כזה תגרום ל- יוצא מן הכלל, עלינו להשתמש ב- נדרש מילת מפתח.

יצירת שדה עם אופציונאלי מילת מפתח פירושה שלא צריך להגדיר שדה זה. ה חוזר על עצמו מילת המפתח היא סוג מערך בגודל משתנה.

כל השדות באינדקס - השדה שמצוין במספר 1 יישמר כשדה ראשון בקובץ בינארי. שדה המסומן ב -2 יישמר בהמשך וכן הלאה. זה נותן לנו שליטה טובה יותר על האופן שבו שדות מונחים בזיכרון.

4. יצירת קוד Java מקובץ Protobuf

ברגע שאנחנו מגדירים קובץ, אנחנו יכולים ליצור ממנו קוד.

ראשית, עלינו להתקין פרוטובוף על המחשב שלנו. ברגע שנעשה זאת, נוכל ליצור קוד על ידי ביצוע a פרוטוק פקודה:

protoc -I =. --java_out =. כתובת ספר.פרוטו

ה פרוטוק הפקודה תיצור קובץ פלט Java מה- כתובת ספר.פרוטו קוֹבֶץ. ה -אני אפשרות מציינת ספריה שבה פרוטו הקובץ שוכן. ה ג'אווה-אאוט מציין ספרייה בה ייווצר המחלקה שנוצרה.

בכיתה שנוצרה יהיו מגדירים, בונים, בונים ובונים למסרים המוגדרים שלנו. כמו כן, יהיו בו כמה שיטות שימוש לשמירת קבצי פרוטובופ וניתוק עריכתם מהפורמט הבינארי למחלקת Java.

5. יצירת מופע של הודעות שהוגדרו על ידי Protobuf

אנו יכולים להשתמש בקוד שנוצר בקלות כדי ליצור מופע Java של אדם מעמד:

דוא"ל מחרוזת = "[דוא"ל מוגן]"; int id = חדש אקראי (). nextInt (); שם מחרוזת = "תוכנית מייקל"; מספר מחרוזת = "01234567890"; AddressBookProtos.Person person = AddressBookProtos.Person.newBuilder () .setId (id) .setName (name) .setEmail (email) .addNumbers (number) .build (); assertEquals (person.getEmail (), דוא"ל); assertEquals (person.getId (), id); assertEquals (person.getName (), שם); assertEquals (person.getNumbers (0), מספר);

אנו יכולים ליצור בונה שוטף באמצעות a newBuilder () שיטה על סוג ההודעה הרצוי. לאחר הגדרת כל השדות הנדרשים, אנו יכולים לקרוא ל לִבנוֹת() שיטה ליצירת מופע של אדם מעמד.

6. סידור פרוטובוף ועריקתו

ברגע שניצור מופע שלנו אדם בכיתה, אנו רוצים לשמור את זה בדיסק בפורמט בינארי התואם לפרוטוקול שנוצר. בואו נגיד שאנחנו רוצים ליצור מופע של ה- פנקס הכתובות בכיתה והוסף אדם אחד לאובייקט זה.

לאחר מכן, אנו רוצים לשמור את הקובץ בדיסק - יש לכתוב ל() שיטת util בקוד שנוצר אוטומטי שנוכל להשתמש בו:

AddressBookProtos.AddressBook addressBook = AddressBookProtos.AddressBook.newBuilder (). AddPeople (person) .build (); FileOutputStream fos = FileOutputStream חדש (filePath); addressBook.writeTo (fos);

לאחר ביצוע שיטה זו, האובייקט שלנו יועבר בסידרה לפורמט בינארי וישמר על גבי דיסק. כדי לטעון את הנתונים מהדיסק ולנתק אותם מחדש אל ה- פנקס הכתובות אובייקט שנוכל להשתמש בו mergeFrom () שיטה:

AddressBookProtos.AddressBook deserialized = AddressBookProtos.AddressBook.newBuilder () .mergeFrom (FileInputStream חדש (filePath)). Build (); assertEquals (deserialized.getPeople (0) .getEmail (), דוא"ל); assertEquals (deserialized.getPeople (0) .getId (), id); assertEquals (deserialized.getPeople (0) .getName (), שם); assertEquals (deserialized.getPeople (0) .getNumbers (0), number);

7. מסקנה

במאמר מהיר זה הצגנו תקן לתיאור ואחסון נתונים בפורמט בינארי - Google Protocol Buffer.

יצרנו פרוטוקול פשוט, יצרנו מופע Java העומד בפרוטוקול מוגדר. לאחר מכן ראינו כיצד לבצע סדרת סדרים של אובייקטים באמצעות סדר פרוטוקול וניתוח עריכה מחדש.

ניתן למצוא את היישום של כל הדוגמאות וקטעי הקוד בפרויקט GitHub - זהו פרויקט Maven, כך שיהיה קל לייבא ולהפעיל אותו כפי שהוא.


$config[zx-auto] not found$config[zx-overlay] not found