Cyber-protobuf

 

复制代码
// 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_proto_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
复制代码

 

posted @   WTSRUVF  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示