C++ RPC ORM 高速解析

devtools/2024/9/23 11:18:10/

支持所有常用编程语


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.ppmy.cn/devtools/42531.html

相关文章

推荐一个可以作为web APP hub的网站

推荐一个可以作为web APP hub的网站 Web APP的一个优点是轻量&#xff0c;往往是一个网络地址对应一个APP&#xff0c;主打一个简便快捷&#xff0c;但是缺点是仅能完成相对简单的任务&#xff0c;完成复杂的任务可能需要多个APP联合作用&#xff0c;或者期望把经常使用的APP归…

升级openssl与python问题

1、下载与安装 wget --no-check-certificate https://www.openssl.org/source/openssl-1.1.1t.tar.gz tar -zxvf openssl-1.1.1t.tar.gz cd openssl-1.1.1t/ ./config --prefix/usr/local/ssl make sudo make install 2、完成后添加软链接 mv /usr/bin/openssl /usr/bin/oldope…

Flutter 中的 WidgetInspector 小部件:全面指南

Flutter 中的 WidgetInspector 小部件&#xff1a;全面指南 Flutter 的 WidgetInspector 是一个强大的工具&#xff0c;它允许开发者在运行时检查和操作他们的 widget 树。这在调试复杂的布局和 widget 结构时尤其有用。本文将为您提供一个全面的指南&#xff0c;帮助您了解如…

ECMAScript 详解

ECMAScript 是一种脚本语言规范&#xff0c;由欧洲计算机制造商协会&#xff08;ECMA&#xff09;通过 ECMA-262 标准化&#xff0c;广泛用于客户端脚本编程。它最著名的实现是 JavaScript&#xff0c;主要用于 Web 开发。以下是 ECMAScript 的详细解析&#xff1a; ### 1. 历…

【C++】智能指针 裸指针 悬挂指针

1、智能指针 智能指针是 C 标准库提供的模板类&#xff0c;用于自动管理动态分配的内存&#xff0c;以避免内存泄露和其他与裸指针相关的问题。智能指针通过在对象生命周期结束时自动释放其指向的内存来实现资源管理。C 标准库中最常用的智能指针包括 std::unique_ptr、std::s…

安卓手机APP开发__Wi-Fi扫描概述

安卓手机APP开发__Wi-Fi扫描概述 目录 概述 Wi-Fi的扫描过程 限制 权限 Android 8.0 and Android 8.1: Android 9: Android 10 (API 级别 29) 和 更高版本: 扫描频率的限制 Android 8.0 and Android 8.1: Android 9: Android 10 and higher: 概述 你能使用Wi-Fi的…

CVPR2022医疗图像-GBCNet网络:胆囊癌(GBC)超声(USG)图像检测模型

Surpassing the Human Accuracy:Detecting Gallbladder Cancer from USG Images with Curriculum Learning&#xff1a;超越人类的准确性:基于课程学习的USG图像检测胆囊癌 目录 一、背景与意义 二、介绍 三、网络框架 3.1 区域选择网络 3.2 MS-SoP分类器 3.3 多尺度块 …

教师专属的成绩发布小程序

还在为成绩发布而烦恼&#xff1f;还在担心家长无法及时获得孩子的学习反馈&#xff1f;是否想要一个既安全又高效的工具来简化你的教学工作&#xff1f;那么&#xff0c;易查分小程序可能是你一直在寻找的答案。 现在的老师们有了超多的工具来帮助我们减轻负担&#xff0c;提高…