27
GOOGLE PROTOCOL BUFFERS Плюсы и минусы использования в реальных проектах

CiklumCPPSat24032012:SergeyBratus-GoogleProtocolBuffers

  • Upload
    ciklum

  • View
    630

  • Download
    1

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: CiklumCPPSat24032012:SergeyBratus-GoogleProtocolBuffers

GOOGLE PROTOCOL BUFFERSПлюсы и минусы использования в реальных проектах

Page 2: CiklumCPPSat24032012:SergeyBratus-GoogleProtocolBuffers

Как все это работает• Создайте .proto файл в котором будет информация о

том что вы будете сериализовать

• Сгенерируйте файлы с учетом нужного языка программирования используя утилиту protoc.exe

• Добавьте код для вызова функций сериализации

Page 3: CiklumCPPSat24032012:SergeyBratus-GoogleProtocolBuffers

Поддерживаемые языки

• С++

• Java

• Python

Page 4: CiklumCPPSat24032012:SergeyBratus-GoogleProtocolBuffers

Other Languages• Action Script• C• C#• Haskell• Javascript• Objective C• Perl• PHP• Ruby• Scala• Visual Basic

Page 5: CiklumCPPSat24032012:SergeyBratus-GoogleProtocolBuffers

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;

}

Page 6: CiklumCPPSat24032012:SergeyBratus-GoogleProtocolBuffers

С чего начинается .proto

Message

message SearchRequest

{

optional int32 page_number = 1;

}

Page 7: CiklumCPPSat24032012:SergeyBratus-GoogleProtocolBuffers

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

Page 8: CiklumCPPSat24032012:SergeyBratus-GoogleProtocolBuffers

Field Rules

В сообщении могут быть поля следующих типов

• required: 1

• optional: 0 или 1

• repeated: > 0

Page 9: CiklumCPPSat24032012:SergeyBratus-GoogleProtocolBuffers

Required Field

required int32 foo = 1;

• bool has_foo() const• int32 foo() const• void set_foo(int32 value) • void clear_foo()

Page 10: CiklumCPPSat24032012:SergeyBratus-GoogleProtocolBuffers

Optional Field

optional Int32 foo = 1;

• bool has_foo() const• int32 foo() const• void set_foo(int32 value) • void clear_foo()

IsInitialized = true;

foo вернет дефолтное значение

Page 11: CiklumCPPSat24032012:SergeyBratus-GoogleProtocolBuffers

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()

Page 12: CiklumCPPSat24032012:SergeyBratus-GoogleProtocolBuffers

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()

Page 13: CiklumCPPSat24032012:SergeyBratus-GoogleProtocolBuffers

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()

Page 14: CiklumCPPSat24032012:SergeyBratus-GoogleProtocolBuffers

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()

Page 15: CiklumCPPSat24032012:SergeyBratus-GoogleProtocolBuffers

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()

Page 16: CiklumCPPSat24032012:SergeyBratus-GoogleProtocolBuffers

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()

Page 17: CiklumCPPSat24032012:SergeyBratus-GoogleProtocolBuffers

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()

Page 18: CiklumCPPSat24032012:SergeyBratus-GoogleProtocolBuffers

Enumerations

enum Foo {

VALUE_A = 1;

VALUE_B = 5;

}

• const const EnumDescriptor* Foo_descriptor()• bool Foo_IsValid(int value)

Page 19: CiklumCPPSat24032012:SergeyBratus-GoogleProtocolBuffers

Arrays

• String

• Bytes

Page 20: CiklumCPPSat24032012:SergeyBratus-GoogleProtocolBuffers

String

String => std::string

Bytes => std::string

Page 21: CiklumCPPSat24032012:SergeyBratus-GoogleProtocolBuffers

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));

}

Page 22: CiklumCPPSat24032012:SergeyBratus-GoogleProtocolBuffers

Generate File

protoc --cpp_out=.\ test.proto

Page 23: CiklumCPPSat24032012:SergeyBratus-GoogleProtocolBuffers

Serializing

SearchRequest pack;

pack.set_opt("test");

pack.set_req("test");

std::vector<char> vec(pack.ByteSize());

pack.SerializeToArray(&vec.at(0), vec.size());

Page 24: CiklumCPPSat24032012:SergeyBratus-GoogleProtocolBuffers

Deserializing

SearchRequest unpack;

unpack.ParseFromArray(&vec.at(0), vec.size());

Page 25: CiklumCPPSat24032012:SergeyBratus-GoogleProtocolBuffers

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

Page 26: CiklumCPPSat24032012:SergeyBratus-GoogleProtocolBuffers

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;

Page 27: CiklumCPPSat24032012:SergeyBratus-GoogleProtocolBuffers

Questions?