16 בנוב׳ 2008

Protocol buffers and library data-structors

חבר התקשר אלי ושאל איך עושים serialization למבנה נתונים ב ג'אווה ע"י Protocol Buffers.
לא שאני כתבתי את PB ואני לא המומחה לתחום, אבל את התשובה לזה במקרה ידעתי. לא עושים. כלומר, אם יש לך מבנה נתונים כלשהו בג'אווה (או כל שפה אחרת לצורך העניין) למשל ה Person הקלאסי:





class Person {
private String name;
private int id;
private String email;

public void setName(String n) {
name = n;
}

public String getName() {
return name;
}
}



את Person אתה לא יכול לכתוב סתם כך בתוך PB.
מה שעושים הוא הפוך: במקום להגדיר את מבני הנתונים ב ג'אווה ואז לחשוב איך מכניסים אותם ל PB, מגדירים את מבנה הנתונים ב PB ואז משתמשים בו בג'אווה.




message Person {
required int32 id = 1;
required string name = 2;
optional string email = 3;
}


אז איפה ההגיון פה?
צריך לזכור ש PB עובד בהרבה שפות, לא רק ג'אווה. PB עובד גם ב C++ ,Python ועוד. לֹכן מבנה נתונים שאתה כותב בג'אווה אין לו את אותה סמנטיקה או אפילו אין לו תרגום חד ערכי לשפה אחרת. למשל למחלקות ה Set בג'אווה יש מימוש וסמנטיקה שונים ממחלקות ה Set ב ++C.
לכן החליטו (ניחוש שלי, אני לא הייתי שם כשזה קרה) של PB יהיו טיפוסים בסיסיים כגון string ו int32 ואפשר יהיה להגדיר collections ע"י שימוש ב repeated אבל לא תהיה תמיכה במבני נתונים של שפה מסויימת.

אחרי שדיברנו בטלפון רציתי להיות בטוח בתשובה שלי אז שאלתי עמיתים במשרד. צדקתי, אבל...
מה קורה אם כבר יש לך הר של קוד כתוב בג'אווה ואתה רוצה להשתמש ב PB וממש אין לך חשק לכתוב את כל מבני הנתונים מחדש?
פתרון אחד שהוצע הוא לעשות Serialization למבנה הנתונים שלך בג'אווה ולכתוב אותו לשדה string בתוך PB. מה שזה נותן זה שלא צריך לכתוב את כל מבני הנתונים מחדש. ואם תרצה תוכל לכתוב חלק ממבני הנתונים, ולא את כולם. החסרון הוא בגודל של ההודעות. Serialization של ג'אווה הוא לא הכי יעיל ובמיוחד לא כשעושים לו encoding ל string.

תגובה 1:

Eran אמר/ה...

This was the original question:
http://groups.google.com/group/protobuf/browse_thread/thread/09b4b4ac8adfeab1