先引入需要知道的proto3语法:
1.proto3
1.hexdump
作用:
hexdump:是Linux下的⼀个⼆进制⽂件查看⼯具,它可以将⼆进制⽂件转换为ASCII、⼋进制、
⼗进制、⼗六进制格式进⾏查看。
-C: 表⽰每个字节显⽰为16进制和相应的ASCII字符

2.decode
作用:
读二进制的信息并以文本形式打印到 标准输出

格式: protoc --decode=消息类型.package命名 消息所在文件 < contacts.bin(本来是从标准输入中读,现在加上< 就到contacts.bin中读)

3.enum
注意格式和c/c++不同,定义时后面是 ";"

注意:同级的枚举类型,常量名不能相同!!! 否则会报错
与 import 其他的.proto文件中的enum枚举类型中的常量值相同也会报错,除非import 的.proto文件有package包住
3.通讯录2.1
contacts.proto
syntax = "proto3";
  package contacts;
  message People
  {
    string name = 1;
    int32 age = 2;
    //里面是电话的字段和类型
    message Phone
    {
        string num = 1;
        enum PhoneType 
        {
          MP = 0; // 移动电话
          TEL = 1; // 固定电话
        }
        PhoneType type = 2;
    }
    //repeated 表示重复  相当于定义一个数组 里面全是Phone
    repeated Phone phone = 3; 
  }
  message Contacts
  {
    repeated People person = 1;
  }write.cc(只展示新增部分)
for(int i = 0;;i++)
    {
        std::cout << "请输入联系人的电话: " << i+1 << "(只输入回车完成电话新增): ";
        std::string number;
        getline(std::cin,number);
        if(number.empty())
            break;
        //接收add_phone返回的phone对象
        contacts::People_Phone* phone = person->add_phone();
        phone->set_num(number);
        std::cout << "请输入联系人的电话类型:(0.移动电话, 1.固定电话): ";
        int type;
        std::cin >> type;
        std::cin.ignore(256,'\n');
        switch(type)
        {
            case 0:
                phone->set_type(contacts::People_Phone_PhoneType::People_Phone_PhoneType_MP);
                break;
            case 1:
                phone->set_type(contacts::People_Phone_PhoneType::People_Phone_PhoneType_TEL);
                break;
            default:
                std::cout << "输入有误, 请重新根据提示输入" << std::endl;
                break;
        }
    }
    std::cout << "--------------添加联系人成功--------------" << std::endl;
}read.cc(只展示新增部分)
for(int j = 0;j<person.phone_size();j++)
        {
            const contacts::People_Phone phone = person.phone(j);
            std::cout << "联系人电话" << j+1  << ": "<< phone.num() << "   ";
            std::cout << "电话类型"  << ": ("<< People_Phone_PhoneType_Name(phone.type()) << ")" << std::endl; 
        }
















