C++ RPC ORM 高速解析

支持所有常用編程語


https://capnproto.org/
GitHub - capnproto/capnproto: Cap'n Proto serialization/RPC system - core tools and C++ library
https://capnproto.org/capnproto-c++-win32-1.0.2.zip

常用命令:
?? ?capnp help
?? ?capnp compile -oc++ myschema.capnp
?? ?capnp decode myschema.capnp MyType < message.bin > message.txt
?? ?capnp encode myschema.capnp MyType < message.txt > message.bin
?? ?capnp eval myschema.capnp myConstant

myschema.capnp:

@0xa8712255ec118b18;
struct Person {
? id @0 :UInt32;
? name @1 :Text;
? email @2 :Text;
? phones @3 :List(PhoneNumber);

? struct PhoneNumber {
? ? number @0 :Text;
? ? type @1 :Type;

? ? enum Type {
? ? ? mobile @0;
? ? ? home @1;
? ? ? work @2;
? ? }
? }

? employment :union {
? ? unemployed @4 :Void;
? ? employer @5 :Text;
? ? school @6 :Text;
? ? selfEmployed @7 :Void;
? ? # We assume that a person is only one of these.
? }
}

struct AddressBook {
? people @0 :List(Person);
}


示例代碼:
?? ?#include "myschema.capnp.h"
?? ?#include <capnp/message.h>
?? ?#include <capnp/serialize-packed.h>
?? ?#include <iostream>

?? ?void writeAddressBook(int fd) {
?? ??? ?::capnp::MallocMessageBuilder message;

?? ??? ?AddressBook::Builder addressBook = message.initRoot<AddressBook>();
?? ??? ?::capnp::List<Person>::Builder people = addressBook.initPeople(2);

?? ??? ?Person::Builder alice = people[0];
?? ??? ?alice.setId(123);
?? ??? ?alice.setName("Alice");
?? ??? ?alice.setEmail("alice@example.com");
?? ??? ?// Type shown for explanation purposes; normally you'd use auto.
?? ??? ?::capnp::List<Person::PhoneNumber>::Builder alicePhones =
?? ??? ??? ?alice.initPhones(1);
?? ??? ?alicePhones[0].setNumber("555-1212");
?? ??? ?alicePhones[0].setType(Person::PhoneNumber::Type::MOBILE);
?? ??? ?alice.getEmployment().setSchool("MIT");

?? ??? ?Person::Builder bob = people[1];
?? ??? ?bob.setId(456);
?? ??? ?bob.setName("Bob");
?? ??? ?bob.setEmail("bob@example.com");
?? ??? ?auto bobPhones = bob.initPhones(2);
?? ??? ?bobPhones[0].setNumber("555-4567");
?? ??? ?bobPhones[0].setType(Person::PhoneNumber::Type::HOME);
?? ??? ?bobPhones[1].setNumber("555-7654");
?? ??? ?bobPhones[1].setType(Person::PhoneNumber::Type::WORK);
?? ??? ?bob.getEmployment().setUnemployed();

?? ??? ?writePackedMessageToFd(fd, message);
?? ?}

?? ?void printAddressBook(int fd) {
?? ??? ?::capnp::PackedFdMessageReader message(fd);

?? ??? ?AddressBook::Reader addressBook = message.getRoot<AddressBook>();

?? ??? ?for (Person::Reader person : addressBook.getPeople()) {
?? ??? ??? ?std::cout << person.getName().cStr() << ": "
?? ??? ??? ??? ?<< person.getEmail().cStr() << std::endl;
?? ??? ??? ?for (Person::PhoneNumber::Reader phone : person.getPhones()) {
?? ??? ??? ??? ?const char* typeName = "UNKNOWN";
?? ??? ??? ??? ?switch (phone.getType()) {
?? ??? ??? ??? ?case Person::PhoneNumber::Type::MOBILE: typeName = "mobile"; break;
?? ??? ??? ??? ?case Person::PhoneNumber::Type::HOME: typeName = "home"; break;
?? ??? ??? ??? ?case Person::PhoneNumber::Type::WORK: typeName = "work"; break;
?? ??? ??? ??? ?}
?? ??? ??? ??? ?std::cout << " ?" << typeName << " phone: "
?? ??? ??? ??? ??? ?<< phone.getNumber().cStr() << std::endl;
?? ??? ??? ?}
?? ??? ??? ?Person::Employment::Reader employment = person.getEmployment();
?? ??? ??? ?switch (employment.which()) {
?? ??? ??? ?case Person::Employment::UNEMPLOYED:
?? ??? ??? ??? ?std::cout << " ?unemployed" << std::endl;
?? ??? ??? ??? ?break;
?? ??? ??? ?case Person::Employment::EMPLOYER:
?? ??? ??? ??? ?std::cout << " ?employer: "
?? ??? ??? ??? ??? ?<< employment.getEmployer().cStr() << std::endl;
?? ??? ??? ??? ?break;
?? ??? ??? ?case Person::Employment::SCHOOL:
?? ??? ??? ??? ?std::cout << " ?student at: "
?? ??? ??? ??? ??? ?<< employment.getSchool().cStr() << std::endl;
?? ??? ??? ??? ?break;
?? ??? ??? ?case Person::Employment::SELF_EMPLOYED:
?? ??? ??? ??? ?std::cout << " ?self-employed" << std::endl;
?? ??? ??? ??? ?break;
?? ??? ??? ?}
?? ??? ?}
?? ?}

?? ?void test() {
?? ??? ?auto file = fopen("example.bin", "wt+");
?? ??? ?if (!file)
?? ??? ??? ?return;
?? ??? ?int fd = fileno(file); //如果是W+ 這里文件被清空的影響
?? ??? ?writeAddressBook(fd);
?? ??? ?fclose(file);
?? ??? ?fflush(file);
?? ??? ?file = fopen("example.bin", "rb+");
?? ??? ?fd = fileno(file);
?? ??? ?printAddressBook(fd);
?? ??? ?fclose(file);
?? ?}

運行輸出:
?? ?Alice: alice@example.com
?? ? ?mobile phone: 555-1212
?? ? ?student at: MIT
?? ?Bob: bob@example.com
?? ? ?home phone: 555-4567
?? ? ?work phone: 555-7654
?? ? ?unemployed
??

其它類似參考:
GitHub - protocolbuffers/protobuf: Protocol Buffers - Google's data interchange format
?? ?evanw (Evan Wallace) · GitHub


創作不易,小小的支持一下吧!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/13864.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/13864.shtml
英文地址,請注明出處:http://en.pswp.cn/web/13864.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java文件上傳時給pdf、word、excel、ppt、圖片添加水印

前言 在開發的過程中&#xff0c;因為文件的特殊性&#xff0c;需要給pdf、word、excel、ppt、圖片添加水印。添加水印可以在文件上傳時添加&#xff0c;也可以在文件下載時添加。因為業務的某些原因&#xff0c;文件需要在瀏覽器預覽&#xff0c;如果用戶將文件另存為則無法添…

算法與數據結構匯總

基本 數組 字符串 排序 矩陣 模擬 枚舉 字符串匹配 桶排序 計數排序 基數排序 回文&#xff1a;中心擴展 馬拉車 樹上啟發式合并 括號 數學表達式 字符串&#xff1a;前后綴分解。 貢獻法 分組&#xff1a; 【狀態機dp 狀態壓縮 分組】1994. 好子集的數目 【動態規劃】【前綴…

Excel中sum的跨表求和

#實際工作中&#xff0c;一個xlsx文件中會包含多個Excel表格&#xff0c;一般會有“總-分”的關系&#xff0c;如何把分表里的數字匯總到總表里呢&#xff1f; 一般有上圖所示的兩種表達方式。 可以使用通配符 *&#xff1a;代表任意個數、任意字符&#xff1b; &#xff1f;&…

51單片機的最小系統詳解

51單片機的最小系統詳解 1. 引言 在嵌入式系統中,51單片機被廣泛應用于各種小型控制器和嵌入式開發板中。相信很多人都接觸過51單片機,但是對于51單片機的最小系統卻了解得不夠深入。本文將從振蕩電路、電源模塊、復位電路、LED指示燈和調試接口五個方面詳細介紹51單片機的…

quartz定時任務

Quartz 數據結構 quartz采用完全二叉樹&#xff1a;除了最后一層每一層節點都是滿的&#xff0c;而且最后一層靠左排列。 二叉樹節點個數規則&#xff1a;每層從左開始&#xff0c;第一層只有一個&#xff0c;就是2的0次冪&#xff0c;第二層兩個就是2的1次冪&#xff0c;第三…

DOS學習-目錄與文件應用操作經典案例-attrib

新書上架~&#x1f447;全國包郵奧~ python實用小工具開發教程http://pythontoolsteach.com/3 歡迎關注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目錄 一.前言 二.使用 三.案例 一.前言 DOS系統中的attrib命令是一個用于顯示或更改文件&#…

設計模式——職責鏈(責任鏈)模式

目錄 職責鏈模式 小俱求實習 結構圖 實例 職責鏈模式優點 職責鏈模式缺點 使用場景 1.springmvc流程 ?2.mybatis的執行流程 3.spring的過濾器和攔截器 職責鏈模式 使多個對象都有機會處理請求&#xff0c;從而避免請求的發送者和接受者之間的耦合關系。將這個對象連成…

github設置項目分類

https://www.php.cn/faq/541957.html https://docs.github.com/zh/repositories/working-with-files/managing-files/creating-new-files

什么是回表,如何解決回表問題

下面表中:主鍵id是聚簇索引&#xff0c;name是輔助索引。 執行這樣一條SQL: select name from A where name"s;name字段是有索引&#xff0c;所以MYSQL在通過name進行査詢的時候&#xff0c;是需要掃描兩顆Btree樹的。 第一遍:先通過二級索引定位主鍵值1。第二遍:根據主鍵…

免費發布web APP的四個途徑(Python和R)

免費發布數據分析類&#x1f310;web APP的幾個途徑&#x1f4f1; 數據分析類web APP目前用來部署生信工具&#xff0c;統計工具和預測模型等&#xff0c;便利快捷&#xff0c;深受大家喜愛。而一個免費的APP部署途徑&#xff0c;對于開發和測試APP都是必要的。根據筆者的經驗…

word-形狀繪制、smartart、visio

一、人員架構圖繪制 小技巧&#xff1a; 1、ctrlshift水平復制 2、點擊圖形&#xff0c;右鍵設置為默認形狀 3、插入-形狀-右鍵-鎖定繪圖模式&#xff0c;按esc退出狀態 4、插入-形狀-新建繪圖畫布&#xff0c;代替組合問題 畫布中存在錨點&#xff0c;便于直線連接 二、s…

網絡安全相關面試題(hw)

網絡安全面試題 報錯注入有哪些函數 updatexml注入 載荷注入 insert注入 updata注入 delete注入 extractvalue&#xff08;&#xff09;注入 注入防御方法 涵數過濾 直接下載相關防范注入文件&#xff0c;通過incloud包含放在網站配置文件里面 PDO預處理,從PHP 5.1開始&…

electron中BrowserWindow的show事件沒有觸發踩坑記錄

class ElectronApi {static mainWindow;//主窗口createWindow() {try {// Create the browser window.this.mainWindow new BrowserWindow({width: 1200,height: 800,minHeight: 800,minWidth: 1200,webPreferences: {preload: preloadPath,// nodeIntegration: true,// conte…

windows怎么復制文件到vmware 中ubantu虛擬機,vmware中的虛擬機怎么聯網,NAT參數和DHCP參數。

目錄 windows怎么復制文件到vmware 中ubantu虛擬機 vmware中的虛擬機怎么聯網 NAT參數和DHCP參數。

Linux環境Docker安裝,使用Docker搭建Mysql服務實戰

1、環境&#xff1a;阿里云Linxu服務器 2、安裝docker # 1、yum 包更新到最新 yum update # 2、安裝需要的軟件包&#xff0c; yum-util 提供yum-config-manager功能&#xff0c;另外兩個是devicemapper驅動依賴的 yum install -y yum-utils device-mapper-persistent-data…

OpenSSL之API編程 - C/C++實現AES、DES、3DES、SM4對稱加密算法

文章介紹 本文章介紹了OpenSSL計算對稱加解密算法(AES、DES、3DES、SM4等)的相關接口&#xff0c;并使用C語言實現了AES和SM4加解密。 對稱加解密算法 對稱加密與非對稱加密算法 OpenSSL介紹 openssl是一個功能豐富且自包含的開源安全工具箱。它提供的主要功能有&#xff…

深度學習之基于YOLOV5的口罩檢測系統

歡迎大家點贊、收藏、關注、評論啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代碼。 文章目錄 一項目簡介 二、功能三、系統四. 總結 一項目簡介 一、項目背景 隨著全球公共衛生事件的頻發&#xff0c;口罩成為了人們日常生活中不可或缺的一部分。在公共場所&am…

10、SpringBoot 源碼分析 - 自動配置深度分析三

SpringBoot 源碼分析 - 自動配置深度分析三 refresh和自動配置大致流程AutoConfigurationImportSelector的getAutoConfigurationEntry獲取自動配置實體(重點)AutoConfigurationImportSelector的getCandidateConfigurations獲取EnableAutoConfiguration類型的名字集合AutoConfig…

Android中JVM內存回收機制

文章目錄 分代收集算法&#xff1a;新生代&#xff08;Young Generation&#xff09;老年代&#xff08;Old Generation&#xff09; 垃圾回收器&#xff1a;JVM常見三大回收算法&#xff1a;Mark-Sweep(標記清除)優點:缺點: 復制算法優點&#xff1a;缺點&#xff1a; Mark-Co…

ubuntu下交叉編譯安卓FFmpeg 和 官方指導鏈接

將之前的編譯方法在此記錄 Linux系統&#xff1a;Ubuntu 18.04.6 LTS 交叉編譯工具鏈&#xff1a;gcc-aarch64-linux-gnu gaarch64-linux-gnu ffmpeg版本&#xff1a;5.1.3 1.下載源碼 ffmpeg官網&#xff1a;https://ffmpeg.org/download.html#releases 下載完成后&#x…