• ProtoBuf lite版中使用Any


    版本3.13.0
    因为google/protobuf/any.proto,不带option optimize_for = LITE_RUNTIME;且没有编译到lite版中,所以我们自己实现一个any

    syntax = "proto3";
    
    option optimize_for = LITE_RUNTIME;
    
    
    message VdiAny {
      
      string type_url = 1;
    
      bytes value = 2;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    原样拷贝过来加上option optimize_for = LITE_RUNTIME;

    生成对应的message类,在生成的类中加上packFrom和unPackTo

      template <typename T, class = typename std::enable_if<std::is_convertible<T, const ::PROTOBUF_NAMESPACE_ID::MessageLite&>::value>::type>
      void PackFrom(const T& message) {
        _any_metadata_.PackFrom<T>(message);
      }
    
      template <typename T, class = typename std::enable_if<std::is_convertible<T, const ::PROTOBUF_NAMESPACE_ID::MessageLite&>::value>::type>
      void PackFrom(const T& message,
        const std::string& type_url_prefix) {
        _any_metadata_.PackFrom<T>(message, type_url_prefix);
      }
    
      template <typename T, class = typename std::enable_if<std::is_convertible<T, const ::PROTOBUF_NAMESPACE_ID::MessageLite&>::value>::type>
      bool UnpackTo(T* message) const {
        return _any_metadata_.UnpackTo<T>(message);
      }
    
    //添加一个成员变量
    ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata _any_metadata_;
    
    //构造函数中添加成员变量的初始化
    VdiAny::VdiAny(::PROTOBUF_NAMESPACE_ID::Arena* arena)
      : ::PROTOBUF_NAMESPACE_ID::MessageLite(arena) ,
      _any_metadata_(&type_url_, &value_) {    //调用成员变量的构造函数
      SharedCtor();
      RegisterArenaDtor(arena);
      // @@protoc_insertion_point(arena_constructor:VdiAny)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    demo

    syntax = "proto3";
    
    //import "google/protobuf/any.proto";
    
    import "vdiAny.proto";
    
    option optimize_for = LITE_RUNTIME;
     
     
    message Apply_data
    {
        uint32 apply_data_id = 1;
        uint64 apply_time = 2;
    }
     
    message Apply_list
    {
        uint32 apply_list_id = 1;
    }
     
    message Test
    {
        int32                   id = 1;
        VdiAny     				data = 2;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
      Test test;
    
      Apply_data data;
      data.set_apply_data_id(111);
      Apply_list list;
      list.set_apply_list_id(222);
    
      //设置any数据
      ZTSLOG(INFO, "set apply_data data:");
      test.mutable_data()->PackFrom(data);
    
    
    if (test.data().Is<Apply_data>()) {
        //解析
        if (test.data().UnpackTo(&data1)) {
    	  ZTSLOG(INFO, data1.apply_data_id());
    	  ZTSLOG(INFO, "unpackTo data success");
        }
        else {
    	  ZTSLOG(INFO, "unpackTo data error");
        }
      }
      else {
    	ZTSLOG(INFO, "is not apply_data");
      }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
  • 相关阅读:
    HBase非关系型数据库
    大端与小端
    【微服务治理之监控APM】系统监控架构概述
    RabbitMq死信队列
    JavaScript 基础 - 第1天笔记
    可视化大屏设计模板 | 主题皮肤(报表UI设计)
    (续)SSM整合之springmvc笔记(RESTful之HiddenHttpMethodFilter源码解析)(P147)了解
    NextJS工程部署到阿里云linux Ecs
    2022最新版JDK1.8的安装教程、包含jdk1.8的提取码(亲测可用)
    ElasticSearch(三)【索引、映射、文档】
  • 原文地址:https://blog.csdn.net/ly1390811049/article/details/125635532