ProtoBuf3 简单案例(使用Any新Type代替protobuf2中的扩展)

一下案例是C++版本
1,编写.proto文件
base.proto

syntax = "proto3";  //指定proto编译器版本为3  默认是2
import "google/protobuf/any.proto";  //使用Any必须要导入Any.proto

enum Type
{
	FACE = 0;
	PLATE = 1;
}

message Base
{
	Type type = 1;
  int32 page_number = 2;
  int32 result_per_page = 3;
  repeated google.protobuf.Any object = 4;

}

message Face
{
	string name = 1;
}

message Plate
{
	string email = 1;
}

2,生成对应的.cc和.h

protoc  --proto_path=./ --cpp_out=./ ./base.proto 

3,在工程中使用
把生成的.cc和.h文件拷贝到工程目录下,并在使用的地方添加头文件代码如下

#include <iostream>

using namespace std;
#include<fstream>

//input .h
#include"base.pb.h"

int main(int argc, char *argv[])
{
    string filename("prototest1.text"); //序列化保存到本地文件
    fstream output(filename,ios::out | ios::trunc| ios::binary);
    Base base;
    base.set_type(Type::FACE);
    base.set_page_number(2);
    base.set_result_per_page(66);
    Face face;
    face.set_name("lvlvlv");
    base.add_object()->PackFrom(face); //为Any对象赋值
    Plate plate;
    plate.set_email("123456@163.com");
    base.add_object()->PackFrom(plate);
    base.SerializeToOstream(&output);//序列化到本地文件
    output.close();
    cout << "Hello World!" << endl;

    string filename2("prototest1.text");
    fstream input(filename2,ios::in |ios::binary);
    Base base2;
    base2.ParseFromIstream(&input); //从本地文件中反序列化过来
    input.close();
    cout<<base2.page_number()<<"  "<<base2.result_per_page()<<endl;

//从Any对象中恢复到具体对象
        for(const ::google::protobuf::Any& object : base2.object()) 
        {
            if(object.Is<Face>()) //判断对象类型
            {
                Face face;
                object.UnpackTo(&face);
                cout<<"name "<<face.name()<<endl;
            }else if(object.Is<Plate>())
            {
                Plate plate;
                object.UnpackTo(&plate);
                cout<<plate.email()<<endl;
            }
        }


    return 0;
}

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Python使用protobuf的Any类型,你需要先定义和编译两个.proto文件,并使用protoc命令生成对应的Python代码。你可以使用以下命令来编译这两个.proto文件: protoc --python_out=. TransportMessage.proto protoc --python_out=. WeChatOnlineNoticeMessage.proto 接下来,你可以在Python代码使用protobuf的Any类型。通过在.proto文件定义Any字段,并使用pack和unpack函数来序列化和反序列化任意类型的数据。 在序列化时,你可以使用pack函数将数据打包成Any类型。例如,假设你有一个message对象msg,你可以使用以下代码将其打包成Any类型的数据: any_message = Any() any_message.Pack(msg) 在反序列化时,你可以使用unpack函数将Any类型的数据解包成原始类型。例如,假设你有一个Any类型的数据any_message,你可以使用以下代码将其解包成原始类型: msg = Message() any_message.Unpack(msg) 注意,解包前需要先创建一个空的Message对象,用于存储解包后的数据。 需要注意的是,使用Any类型需要在.proto文件引入google.protobuf.Any和google.protobuf.AnyOptions。你可以在.proto文件添加以下内容: import "google/protobuf/any.proto"; import "google/protobuf/any_options.proto"; 这样就可以在.proto文件使用Any类型了。 总结起来,要在Python使用protobuf的Any类型,你需要: 1. 定义和编译.proto文件,生成对应的Python代码; 2. 在.proto文件引入google.protobuf.Any和google.protobuf.AnyOptions; 3. 在代码使用pack和unpack函数来序列化和反序列化任意类型的数据。 你可以根据以上步骤来使用protobuf的Any类型。希望对你有所帮助!如果你还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值