pb 資料解析

2021-10-14 12:43:43 字數 2370 閱讀 5436

1. pb檔案 

syntax = "proto3";  // syntax 版本2/3是不一樣,預設是proto2

package im.login; // package 生成對應的c++命名空間 im::login::

import "im.basedefine.proto"; // import 引用其他proto檔案

option optimize_for = lite_runtime;

// message關鍵字 代表乙個物件

message phone

message book

message person

//使用t開頭測試

message tint32

message tstring

2.對資料進行解析

/*如果proto結構體的變數是基礎變數,比如int、string等等,那麼set的時候直接呼叫set_***即可。

如果變數是自定義型別(也就是message巢狀),那麼c++的生成**中,就沒有set_***函式名,取而代之的是三個函式名:

set_allocated_***()

release_***()

mutable_***()

使用set_allocated_***()來設定變數的時候,變數不能是普通棧記憶體資料,

必須是手動new出來的指標,至於何時delete,就不需要呼叫者關心了,

protobuf內部會自動delete掉通過set_allocated_設定的記憶體;

release_***()是用來取消之前由set_allocated_***設定的資料,

呼叫release_***以後,protobuf內部就不會自動去delete這個資料;

mutable_***()返回分配記憶體後的物件,如果已經分配過則直接返回,如果沒有分配則在內部分配,建議使用mutable_***

*/#if 1

message person

#endif

bool protobufencode(std::string &strpb)

phone->set_number("18570368134");

phone->set_phone_type(im::basedefine::phone_home);

// 書籍

// add_則是針對repeated的巢狀物件,每次呼叫都返回乙個新的物件,注意和mutable_的區別。

// 比如person裡面的repeated book books = 5;

im::login::book *book = person.add_books();

book->set_name("linux kernel development");

book->set_price(7.7);

book = person.add_books();

book->set_name("linux server development");

book->set_price(8.0);

// vip

person.set_vip(true);

// 位址

person.set_address("yageguoji");

uint32_t pbsize = person.bytesize(); // 序列化後的大小

strpb.clear();

strpb.resize(pbsize);

uint8_t *szdata = (uint8_t *)strpb.c_str();

if (!person.serializetoarray(szdata, pbsize)) // 拷貝序列化後的資料

return true;

}​

3.解析資料

static void printperson(im::login::person &person)

languages += person.languages(i);

}std::cout << "languages:\t" << languages << std::endl;

if (person.has_phone()) // 自定義message的巢狀並且不是設定為repeated則有has_

else

for (int i = 0; i < person.books_size(); i++)

std::cout << "vip:\t" << person.vip() << std::endl;

std::cout << "address:\t" << person.address() << std::endl;

}

PB資料視窗

資料視窗小結 資料視窗進行刪除資料時 int zgxx id integer sle 3.text prepare sqlsa from delete from zgxx where id execute sqlsa using zg id2 messagebox 提示 刪除完畢 應用場景 主要注意...

PB 資料儲存失敗

row changed between retrieve and update.no changes made to database.這個問題產生原因之一,由於pb資料窗字段與資料庫字段格式不匹配 q 如 sfz id 字元型15位,現在改為18位 而pb資料窗如果沒有重新對sql進行編輯是不會更...

PB資料視窗分頁

第一步 增加乙個計算列,此計算列必須放在detail段,expression中輸入 ceiling getrow 500 這裡500還可以用全域性函式取代,這樣可以允許使用者任意設定每頁多少行。第二步 定義分組,選擇選單rows create group.按計算列欄位分組,並一定將check box...