菜鸟笔记
提升您的技术认知

protobuf 嵌套协议使用方法-ag真人游戏

protobuf 文件产生:

主要是使用windows .bat脚本。
对于c 来说:
“……\tools\protoc.exe” –proto_path =.\protocol –cpp_out=.\protocol\protocol_common.proto

其中 protoc.exe 是产生c proto类文件的可执行程序, –proto_path 表示 产生的c 文件的存放路径。
–cpp_out 是指proto文件的地址

对于c#来说:
“……\tools\protogenerator\protogen.exe” –proto_path=.\protocol .\protocol\protocol_common.proto
如果想在vs中自动执行这样的脚本,则还需要:增加 (solutiondir)表示路径。如“ (solutiondir)..\..\tools\protogenerator\protogen.exe" --proto_path= (solutiondir)protocol (solutiondir)protocol\protocol_common.proto

case1: proto协议中嵌套使用

对于protobuf产生的协议,网络上已经有很多文章介绍。但是,对于proto协议中有嵌套的proto协议的使用,较少。
因此,记录下来。

proto协议如下:
message msgcommomaction
{
required int32 action_id = 1;
required string action_name = 2;
required bytes action_context = 3;
}

message msgcommondouble
{
required double value = 1;
}

其中,action_context 中的嵌套 msgcommondouble生成的string.
代码使用方法如下:

    msgcommondouble  msgcommondouble;
    msgcommondouble.set_value(dvalue);
    int isize = msgcommondouble.bytesize();
    svalue.resize(isize);
    if ( ! msgcommondouble.serializetoarray(const_cast(svalue.data()), isize) )
    {
        return false;
    }
 ```
 这样,就可以将double 类型的dvalue 赋值给 msgcommondouble类
##case2: proto协议将将图像数据序列化 
proto的协议如下
// protocol of jpg image 
message appmsgresult
{
    required appmsgresultimage      app_msg_result_image = 1;          
}
message appmsgresultimage
{   
    // one image and its cell id
    message msgoneimage
    {
        required int32   image_cell_id = 1;
        required bytes   image_content = 2; 
    }
    required int32         image_number = 1 [default=0]; 
    repeated msgoneimage   image_result_array = 2;        // jpg image data array   
}
将图像的数据代码序列化
```c  
        // imgresult 为数据与数据长度的结构体
        appmsgresult            appresult;
        appmsgresultimage       appimage;
        appimage.set_image_number(imgresultarray.size());
        for(int iindex = 0; iindex < imgresultarray.size(); iindex    )
        {
            imgresult temp = imgresultarray[iindex];
            appmsgresultimage_msgoneimage   jpgimage;
            jpgimage.set_image_cell_id(temp._cellid);
            jpgimage.set_image_content(temp._data, temp._len);
            appmsgresultimage_msgoneimage* pjpgimage
                = appimage.add_image_result_array();
            * pjpgimage = jpgimage;
        }
        // std::string resultstring = appimage.serializeasstring();

将图像数据从proto协议中反序列化

    std::string soutputfilepath = "d:\\"; 
    appmsgresultimage   appimagede;
    appimagede.parsefromstring(resultstring);
    int inumber = appimagede.image_number();
    int iindex = 0;
    std::string simagetype(".jpg");
    for(iindex = 0; iindex < inumber; iindex   )
    {
        appmsgresultimage_msgoneimage oneimagedata = appimagede.image_result_array(iindex);
        std::string spath = soutputfilepath;
        int icellid = oneimagedata.image_cell_id();
        printf( "cellid %d", icellid );
        std::string simagecontent = oneimagedata.image_content();
        std::stringstream ss;
        ss << icellid << simagetype;
        spath.append(ss.str());
        writejpegsimple(spath, simagecontent);  // 此方法是将数据保存为jpeg 文件
    }

以上基本上就是对于嵌套使用 proto 协议的总结

网站地图