`
tcspecial
  • 浏览: 912569 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

protobuf 反射

阅读更多

 

protobuf 提供了反射API,可以很方便操作pb字段。

// 遍历pb字段
bool ParsePb(google::protobuf::Message *oReq, std::map<std::string, std::string> &vParams)
{
    // Descriptor: message类型定义描述
    const google::protobuf::Descriptor *descriptor = oReq->GetDescriptor();
    // Reflection: 动态读写pb字段
    const google::protobuf::Reflection *reflection = oReq->GetReflection();

    google::protobuf::FieldDescriptor *field = NULL;
    int count = descriptor->field_count();

    string sKey;
    string sVal;
    for (int i=0; i<count; i++)
    {
    	// 字段
        field = descriptor->field(i);
        sKey = field->name();

        switch (field->cpp_type())
        {
        case FieldDescriptor::CPPTYPE_BOOL:
            sVal = to_string( reflection->GetBool(*oReq, field) );
            break;
        case FieldDescriptor::CPPTYPE_INT32:
            sVal = to_string( reflection->GetInt32(*oReq, field) );
            break;
        case FieldDescriptor::CPPTYPE_UINT32:
            sVal = to_string( reflection->GetUInt32(*oReq, field) );
            break;
        case FieldDescriptor::CPPTYPE_INT64:
            sVal = to_string( reflection->GetInt64(*oReq, field) );
            break;
        case FieldDescriptor::CPPTYPE_UINT64:
            sVal = to_string( reflection->GetUInt64(*oReq, field) );
            break;
        case FieldDescriptor::CPPTYPE_FLOAT:
            sVal = to_string( reflection->GetFloat(*oReq, field) );
            break;
        case FieldDescriptor::CPPTYPE_DOUBLE:
            sVal = to_string( reflection->GetDouble(*oReq, field) );
            break;
        case FieldDescriptor::CPPTYPE_STRING:
            sVal = reflection->GetString(*oReq, field);
            break;
        default:
        	sVal = "";
            break;
        }

        vParams.insert({sKey, sVal});
    }

    return true;
}

 

开源库pb2json(实现pb与json互转)也是基于反射实现。

 

 

 

 

 

 

分享到:
评论

相关推荐

    基于protobuf反射特性的pb、json相互转换的实例程序(C++)

    本资源提供了一个基于protobuf反射特性的pb结构与json相互转换的实例,该实例程序主要有两个核心函数myMessage2Json、myJson2Message。前者的作用是将pb结构转换成对应的json,后者是将json转换成对应的pb结构体。...

    protobuf反射的使用说明,附完整示例代码

    **protobuf反射机制详解及实战应用** protobuf(Protocol Buffers)是Google开发的一种数据序列化协议,它能够将结构化的数据序列化,可用于网络通信、数据存储等场景。protobuf的优势在于其高效、小巧且跨平台,...

    golang 微服务之gRPC与Protobuf的使用

    gRPC与Protobuf是现代微服务架构中常用的技术栈,尤其在Golang开发中占据着重要地位。本文将深入探讨这两个概念以及它们在实际应用中的优势。 首先,RPC(Remote Procedure Call)是一种让程序可以在分布式环境中像...

    protobuf:用于 Go 的基于反射的协议缓冲区

    **protobuf: 用于Go的基于反射的协议缓冲区** 协议缓冲区(Protocol Buffers)是Google推出的一种数据序列化协议,它可以将结构化的数据序列化为二进制流,便于网络传输和存储。在Go语言中,protobuf提供了一种高效...

    Go 支持 Google 的协议缓冲区.zip

    它已被模块取代 google.golang.org/protobuf ,该模块包含更新和简化的 API、对 protobuf 反射的支持以及许多其他改进。我们建议新代码使用该google.golang.org/protobuf模块。的 v1.4 版及更高版本github....

    protobuf:支持Google的协议缓冲区

    模块已取代它,该模块包含更新和简化的API,对protobuf反射的支持以及许多其他改进。 我们建议新代码使用google.golang.org/protobuf模块。 版本V1.4及更高版本的github.com/golang/protobuf在方面实现google....

    实现protobuf与json的互转

    通过反射机制,可以基于Descriptor在运行时处理protobuf消息,实现protobuf与JSON的动态转换。 7. **protobuf的兼容性**:protobuf支持版本兼容性,这意味着新版本的protobuf编译器可以解析旧版本的.proto文件,这...

    Lua内置模块实现了类似CMake的模块化功能 通过在模块内直接调用Protobuf的反射特性,实现在Lua层面上的自动反射

    它通过在模块内直接调用 Protobuf 的反射特性,实现了在 Lua 层面上的自动反射。该模块支持 Protobuf 2 和 Protobuf 3,并能实现 Protobuf、Lua table 与其他数据结构(如 XML、JSON、YAML)之间的转换。该模块已经...

    Lua内置模块实现类似于CMake的模块化功能 通过在模块内直接调用Protobuf的反射特性,实现了在Lua层面上的自动反射

    它通过在模块内直接调用 Protobuf 的反射特性,实现了在 Lua 层面上的自动反射。该模块支持 Protobuf 2 和 Protobuf 3,并能实现 Protobuf、Lua table 与其他数据结构(如 XML、JSON、YAML)之间的转换。该模块已经...

    protobuf常用序列化和反序列化API

    protobuf还支持动态消息和反射API,允许在运行时处理未知的protobuf消息类型。这对于实现通用的序列化/反序列化服务或解析未知消息非常有用: ```cpp google::protobuf::DynamicMessageFactory factory; std::...

    protobuf-java-2.5.0.jar

    5. **反射API**:protobuf提供反射API,允许在运行时动态地处理protobuf消息,增强了灵活性。 6. **轻量级**:protobuf库相对较小,不会增加应用程序的负担,同时对性能的影响也很小。 7. **广泛应用于RPC框架**:...

    protobuf-net r668.zip

    通过预编译,可以在程序运行前生成所需的序列化代码,减少运行时的反射开销。 标签".dll"暗示了protobuf-net的核心功能是通过一个DLL库提供的,这使得开发者能够轻松地将其集成到自己的.NET项目中。 在"protobuf-...

    protobuf-lite-3.0.0.jar

    - 考虑到protobuf-lite不支持反射,如果应用需要动态解析protobuf消息,可能需要使用完整的protobuf库。 综上所述,protobuf-lite-3.0.0.jar是Protocol Buffers的一个轻量级实现,用于Android平台的数据序列化。...

    支持Google的协议缓冲区-Golang开发

    它已被google.golang.org/protobuf模块所取代,该模块包含更新和简化的API,对protobuf反射的支持以及许多其他改进。 我们建议新代码使用google.golang.org/protobuf模块。 github.com/golang/protobuf的v1.4及更高...

    protobuf-net-master.zip

    这可能包括生成元数据,用于支持运行时的反射式序列化,或者提供更细粒度的控制来优化性能。 在实际应用中,protobuf-net常用于服务器和客户端之间的数据交换,例如在分布式系统、游戏开发、API通信等领域。通过...

    Java项目开发用的公用基础模块,包括:Spring容器初始化、配置文件读取工具类、分页对象、Protobuf工具类、反射工具类

    Java项目开发用的公用基础模块,包括:Spring容器初始化、配置文件读取工具类、分页对象、Protobuf工具类、反射工具类等

    5.自动识别Protocolbuf消息类型1

    总的来说,利用Google Protobuf的反射功能,可以自动识别并处理网络传输中的protobuf消息,避免了手动维护类型映射或注册过程,简化了多类型消息的网络通信实现。这种基于类型名称的反射机制是Protobuf设计的一个...

    Go-grpcall是一个客户端库利用反射模式轻松请求GRPC服务器

    Go-grpcall是一个针对Go语言开发的客户端库,它的核心功能是通过反射模式简化了向GRPC服务器发起请求的过程。GRPC是一种基于HTTP/2协议的高性能、开源、通用的RPC框架,它由Google开发,支持多种编程语言,包括Go。...

    protobuf-dynamic:协议缓冲区动态架构 - 以编程方式创建 protobuf 架构

    在 Maven 中心可用: 简化使用协议缓冲区反射机制的库,不需要 protoc 编译器。 支持主要的 protobuf 特性:原始类型、复杂和嵌套类型、标签、默认值等动态模式创建 - 在运行时从模式创建动态消息模式合并模式序列...

    基于Java平台的通用基础模块设计源码

    该项目提供了一套基于Java平台的通用基础模块设计源码,包含30个文件,涵盖22个...这些模块支持Spring容器初始化、配置文件读取、分页处理、Protobuf序列化、反射操作等功能,适用于构建高效、可扩展的Java应用程序。

Global site tag (gtag.js) - Google Analytics