Upload
ciklum
View
630
Download
1
Embed Size (px)
DESCRIPTION
Citation preview
GOOGLE PROTOCOL BUFFERSПлюсы и минусы использования в реальных проектах
Как все это работает• Создайте .proto файл в котором будет информация о
том что вы будете сериализовать
• Сгенерируйте файлы с учетом нужного языка программирования используя утилиту protoc.exe
• Добавьте код для вызова функций сериализации
Поддерживаемые языки
• С++
• Java
• Python
Other Languages• Action Script• C• C#• Haskell• Javascript• Objective C• Perl• PHP• Ruby• Scala• Visual Basic
Proto файлmessage Person {
required string name = 1;
required int32 id = 2;
optional string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
}
repeated PhoneNumber phone = 4;
}
С чего начинается .proto
Message
message SearchRequest
{
optional int32 page_number = 1;
}
Message Field Types• double, float, int32, int64, uint32, uint64, sint32, sint64,
fixed32, fixed64, sfixed32, sfixed64, bool, string, bytes
• enum Smth
{
UNIVERSAL = 0;
WEB = 1;
IMAGES = 2;
}
• Other Messages
Field Rules
В сообщении могут быть поля следующих типов
• required: 1
• optional: 0 или 1
• repeated: > 0
Required Field
required int32 foo = 1;
• bool has_foo() const• int32 foo() const• void set_foo(int32 value) • void clear_foo()
Optional Field
optional Int32 foo = 1;
• bool has_foo() const• int32 foo() const• void set_foo(int32 value) • void clear_foo()
IsInitialized = true;
foo вернет дефолтное значение
String Field
optional string foo = 1;
required string foo = 1;
• bool has_foo() const• const string& foo() const• void set_foo(const string& value)• void set_foo(const char* value) • void set_foo(const char* value, int size)• string* mutable_foo()• void clear_foo()• string* release_foo()
Enum Fields
enum Bar { BAR_VALUE = 1; }
optional Bar foo = 1;
required Bar foo = 1;
• bool has_foo() const• Bar foo() const• void set_foo(Bar value) • void clear_foo()
Message Fields
message Bar {}
optional Bar foo = 1;
required Bar foo = 1;
• bool has_foo() const• const Bar& foo() const• Bar* mutable_foo() • void clear_foo() • Bar* release_foo()
Repeated Numeric Fields
repeated int32 foo = 1;
• int foo_size() const• int32 foo(int index) const• void set_foo(int index, int32 value) • void add_foo(int32 value) • void clear_foo()• const RepeatedField<int32>& foo() const• RepeatedField<int32>* mutable_foo()
Repeated String Fieldsrepeated string foo = 1;
repeated bytes foo = 1;
• int foo_size() const• const string& foo(int index) const• void set_foo(int index, const string& value)• void set_foo(int index, const char* value) • void set_foo(int index, const char* value, int size)• string* mutable_foo(int index) • void add_foo(const string& value) • void add_foo(const char* value) • void add_foo(const char* value, int size) • string* add_foo()• void clear_foo() • const RepeatedPtrField<string>& foo() const• RepeatedPtrField<string>* mutable_foo()
Repeated Enum Fields
enum Bar { BAR_VALUE = 1; }
repeated Bar foo = 1;
• int foo_size() const• Bar foo(int index) const• void set_foo(int index, Bar value)• void add_foo(Bar value) • void clear_foo()• const RepeatedField<int>& foo() const• RepeatedField<int>* mutable_foo()
Repeated Embedded Message Fields
message Bar {}
repeated Bar foo = 1;
• int int foo_size() const• const Bar& foo(int index) const• Bar* mutable_foo(int index)• Bar* add_foo()• void clear_foo()• const RepeatedPtrField<Bar>& foo() const• RepeatedPtrField<Bar>* mutable_foo()
Enumerations
enum Foo {
VALUE_A = 1;
VALUE_B = 5;
}
• const const EnumDescriptor* Foo_descriptor()• bool Foo_IsValid(int value)
Arrays
• String
• Bytes
String
String => std::string
Bytes => std::string
Convert
std::wstring ConvertToWstring(const std::string& source)
{
if (source.empty())
return std::wstring();
return std::wstring((const wchar_t *)source.c_str(),
source.size() / sizeof(wchar_t));
}
Generate File
protoc --cpp_out=.\ test.proto
Serializing
SearchRequest pack;
pack.set_opt("test");
pack.set_req("test");
std::vector<char> vec(pack.ByteSize());
pack.SerializeToArray(&vec.at(0), vec.size());
Deserializing
SearchRequest unpack;
unpack.ParseFromArray(&vec.at(0), vec.size());
Pack Functions
Bool SerializeToCodedStream(io::CodedOutputStream * output) const
Bool SerializeToZeroCopyStream(io::ZeroCopyOutputStream * output) const
Bool SerializeToString(string * output) const
Bool SerializeToArray(void * data, int size) const
String SerializeAsString() const
Bool AppendToString(string * output) const
Cookies• Поддержка extensions
message Foo { // ... extensions 100 to 199; }
extend Foo { optional int32 bar = 126; }• Packages
package foo.bar;
message Open { ... }• Options
option optimize_for = CODE_SIZE;
option optimize_for = SPEED;
Questions?