用反射機制合併兩個Protobuf

2021-10-08 15:32:15 字數 1647 閱讀 5096

對於protobuf的合併操作,官方api提供了mergefrom函式。如:

pd1.mergefrom(pb2),

該方法對於非repeated型別,優先使用pb2,對於repeated型別,就是將兩個欄位的值取並集,並且無法去重。有時無法滿足我們的專案需求。

我們可以使用protobuf的google::protobuf::descriptor和google::protobuf::reflection實現將兩個相同型別的pb合併。**如下:

addressbook.proto檔案:

package zhb;

message person

message model

合併函式:

#include

#include

#include

"addressbook.pb.h"

#define case_field_type(cpptype, method, valuetype) \

case google::protobuf::fielddescriptor::cpptype_##cpptype:

#define case_repeated_field_type(cpptype, method, valuetype) \

case google::protobuf::fielddescriptor::cpptype_##cpptype:

using

namespace std;

template

<

typename t>

void

mergeproto

(const t& src, t* dst)

case google::protobuf::fielddescriptor::cpptype_message:}}

}else

case google::protobuf::fielddescriptor::cpptype_message:}}

}}}}

void

mergemessages()

intmain

(int argc,

char

**ar**)

執行結果:

model1:

age:

1name:

"zhb2"

gender:

1gender:

10gender:

2gender:

10person

model2:

age:

1name:

"zhb2"

gender:

2gender:

10person

從執行結果來看:

model1.mergefrom(model2);函式的作用:

非repeated型別優先使用model2,repeated型別合併操作,無法去重

mergeproto(model1, &model2);函式的作用:

非repeated型別優先使用model2,repeated型別優先使用model2,如果model2有,就忽略model1

參考api:

protobuf反射官方api

合併兩個byte

byte sshead system.text.encoding.unicode.getbytes this is head byte sscontent system.text.encoding.unicode.getbytes this is content.sshead sscontent b...

合併兩個DataTable

方法1 sqlconnection myconnection new sqlconnection server localhost uid sa pwd database wjoa string sql1 select from resoursemanage t sqldataadapter ada...

用WINHEX合併兩個或多個BIN檔案

後來,我發現,用winhex軟體可以把這些bin檔案都合併到乙個檔案,只需要傳輸一次就可以了,大大的提高了效率。這一招,對於做產品特別的有幫助。用winhex合併兩個或多個bin檔案非常簡單,只需要複製貼上就可以了。下面講解把a.bin檔案和b.bin檔案合併的步驟。1.複製a.bin檔案貼上到旁邊...