当前位置: 首页 > news >正文

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


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

相关文章:

  • pycharm 关闭项目卡死
  • 软件测试/测试开发丨学习笔记之Allure2测试报告
  • 探索Ollama——入门:如何在本地环境中搭建和自定义大型语言模型
  • 【跟着例子学MySQL】多表关联 -- 一对一关系
  • 深入解析Java中的Calendar类
  • ❤ vue2 使用 Element和 vue3 使用 ElementPlus报错
  • 鸿蒙应用开发系列 篇六:鸿蒙系统应用生态与发布、推广
  • GD32F407入坑指南 第三章
  • nssctf(Web刷题)
  • ffmpeg-webrtc(metartc)给ffmpeg添加webrtc协议
  • 如何申请免费域名级SSL证书,实现HTTPS访问
  • AI大模型探索之路-实战篇4:DB-GPT数据应用开发框架调研实践
  • 谷歌快速收录怎么做?
  • 如何选择序列化协议:关键因素与场景分析
  • echarts取消纵坐标,自定义提示内容,完整 echarts 布局代码
  • @jsonView过滤属性
  • HTTP--网络协议分层,http历史(二)
  • javascript面向对象之创建对象
  • Linux gpio口使用方法
  • Mithril.js 入门介绍
  • mysql 数据库四种事务隔离级别
  • Python学习笔记 字符串拼接
  • scrapy学习之路4(itemloder的使用)
  • SpringCloud集成分布式事务LCN (一)
  • Web标准制定过程
  • 利用jquery编写加法运算验证码
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 前嗅ForeSpider中数据浏览界面介绍
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 我感觉这是史上最牛的防sql注入方法类
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • ![CDATA[ ]] 是什么东东
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (¥1011)-(一千零一拾一元整)输出
  • (12)Linux 常见的三种进程状态
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (Python第六天)文件处理
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (四) 虚拟摄像头vivi体验
  • (转)nsfocus-绿盟科技笔试题目
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .Net core 6.0 升8.0
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • .net core 依赖注入的基本用发
  • .NET Micro Framework初体验(二)
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .NET建议使用的大小写命名原则
  • ::
  • @JsonSerialize注解的使用
  • @SpringBootApplication 注解
  • [ 物联网 ]拟合模型解决传感器数据获取中数据与实际值的误差的补偿方法
  • [240727] Qt Creator 14 发布 | AMD 推迟 Ryzen 9000芯片发布
  • [Android]使用Retrofit进行网络请求