// protobuf // 跨语言、跨平台的序列化数据结构的方式,用于序列化数据的协议 // 类似于xml、json ///////////////////示例////////////////////////////////////////////// /* 在apollo/cyber目录下新建文件夹demo_base_proto,文件夹下新建student.proto,并输入 如下内容 */ // proto版本 syntax = "proto2"; // 包 package apollo.cyber.demo_base_proto; //.到当前目录 // 消息 message是关键字, Student是消息名称 message Student{ // 字段 // 字段格式:字段规则 数据类型 字段名称 字段编号 required string name = 1; optional uint64 age = 2; optional uint64 height = 3; repeated string books = 4; } //////////////////////////////////////////////////////////////// /* proto 中的字段语法主要有四部分组成: 字段规则、数据类型、字段名称、字段编号 1.字段规则 required--调用时,必须提供该字段的值,否则该消息将被视为“未初始化”,不建议使用,当需要把字段修改为其他规则时,会存在兼容性问题。 optional- 调用时该字段的值可以设置也可以不设置,不设置时,会根据数据类型生成默认值 repeated-该规则字段可以以动态数组的方式存储多个数据 2.数据类型 double float int32 int64 uint32 uint64 string bool 3.字段名称 就是变量名 4.字段编号 每个字段有唯一的编号,用于在消息的二进制格式中标识字段 */ //////////////////////文件编译/////////////////////////// // 1.编辑BUILD文件 package(default_visibility = ["//visibility:public"]) // 创建proto的library proto_library( name = "student_proto", srcs = "student.proto" ) // 创建cc的library cc_library( name = "student_cc", deps = ":student_proto" ) // 2.编译 bazel build cyber/demo_base_proto/... // 编译后,将会在cyber/demo_base_proto生成可以被c++调用的文件 ///////////////////////////////////////////////////////////// ///////////////////////proto文件操作///////////////////////// // 1.在demo_base_proto目录下新建test_student.cc文件,输入内容如下: #include "cyber/demo_base_proto/student.pb.h" int main(int argc, char* argv[]) { // 创建对象 apollo::cyber::demo_base_proto::Student stu; // 数据写 stu.set_name("zhangsan"); // requried 和 optinoal都是set_ stu.set_age(18); stu.set_height(1.75); stu.add_books("yuwen"); // repeated是add_ stu.add_books("c++"); stu.add_books("Python"); // 数据读 std::string name = stu.name(); uint64_t age = stu.age(); uint64_t height = stu.height(); std::cout << name << " == " << age << " == " << height << " == "; for(int i = 0 ; i < stu.books_size(); i++) { std::cout << stu.books(i) " - "; } std::cout << std::endl; return 0; } // 2.配置BUILD文件 cc_binary( name = "test_student_cc", srcs = ["test_student.cc"], deps = [":student_cc"] ) // 3.编译 bazel build cyber/demo_base_proto/... // 4.执行 ./bazel-bin/cyber/demo_base_proto/test_student
标签:protobuf,proto,demo,stu,base,student,name From: https://www.cnblogs.com/WTSRUVF/p/17539538.html