對於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檔案貼上到旁邊...