Google Protobuf扩展字段使用

背景说明

Google Protobuf中不支持数据结构的派生关系,因此,如果在存在派生体系的对象中定义数据结构时,通过组合方式对数据结构进行组合,则需要对基类对象提供的通用接口进行重载或在外部进行动态转型才能达到获取或设置数据的目的。

因此考虑使用Google Protobuf提供的extension扩展机制解决数据结构之间的不能派生的问题,以此来达到减少重复工作量和便于维护代码的目的。

使用说明

  1. 定义公共数据类型

    描述:

    此数据类型为对象派生体系同基类提供的公共数据类型

    示例:

    1 // 公共数据类型
    2 message BaseDataType
    3 {
    4     extensions 100 to max;   //标识此字段可扩展,此处可指定扩展字段的ID有效范围,to max表示字段范围至最大值
    5     optional string BaseField1 = 1;
    6     optional string BaseField2= 2;
    7     ...
    8 } 

  2. 定义扩展数据类型

    描述:

    此数据类型为对象派生体系中派生类使用的数据类型

    示例:

     1 message ChildDataType
     2 {
     3     extend BaseDataType
     4     {
     5         optional ChildDataType ChildData = 100;     // 将子数据类型整体扩展至公共数据中
     6         optional int32  ExtendValue = 101;          // 扩展具体数据类型
     7     }
     8     optional string ChildField1 = 1;
     9     optional string ChildField2= 2;
    10     ...
    11 } 

  3. 初始化数据类型

    描述:

    公共数据类型与普通数据类型使用相同,此处仅说明扩展数据类型使用方法

    示例:

     1 // 对象基类
     2 class BaseClass
     3 {
     4     public BaseClass()
     5     {
     6          m_pData = new BaseDataType();
     7     }
     8 public:
     9     Message* m_pData;
    10 };
    11
    12 // 对象派生类
    13 class ChildClass : public BaseClass
    14 {
    15     public ChildClass ()
    16     {
    17         BaseDataType * pBaseData = new BaseDataType();
    18         // 创建爱你扩展数据类型
    19         ChildDataType* pChildData = pBaseData->MutableExtension(ChildDataType::ChildData);
    20         //初始化数据
    21         pChildData-> set_childfield1("123");
    22         pBaseData->SetExtension(ChildDataType::ExtendValue, 123);
    23     }
    24 }; 

  4. 使用数据类型

    描述:

    通过HasExtension、GetExtension、MutableExtension来访问数据;

    示例:

    1 // 构造对象访问扩展数据类型数据
    2 BaseClass* pBaseObj = new ChildClass();
    3 BaseDataType* pBaseData = dynamic_cast<BaseDataType*>(pBaseObj->m_pData);
    4 assert(pBaseData->HasExtension(ChildDataType::ChildData));
    5 // 获取扩展数据
    6 const ChildDataType& childdata = pBaseData->GetExtension(ChildDataType::ChildData);
    7 int value = pBaseData->GetExtension(ChildDataType::ExtendValue); 

  5. 数据复制及传输

    描述:

    C++代码中数据复制及传输解析与普通数据类型相同,此处仅说明C#代码中需要注意事项。

    C#中通过ParseFrom进行字节数据转换时,需要传入对扩展数据结构的说明信息ExtensionRegistry,否则扩展数据字段将作为未知数据处理。

    示例:

     1 // 构造扩展数据类型
     2 ChildDataType.Builder childdata = new ChildDataType.Builder();
     3 childdata.ChildField1 = "123";
     4 // 构造公共数据类型
     5 BaseDataType.Builder basedata = new BaseDataType.Builder();
     6 basedata.SetExtension(ChildDataType.ChildData,
     7 childdata.Build());
     8
     9 // 转换至字节数据数据
    10 byte[] buf = basedata.Build().ToByteArray();
    11
    12 // 创建扩展字段信息
    13 ExtensionRegistry registry = ExtensionRegistry.CreateInstance();
    14 registry.Add(ChildDataType.ChildData);
    15 registry.Add(ChildDataType.ExtendValue);
    16
    17 // 从字节数据转换
    18 BaseDataType basedataCopy = BaseDataType.ParseFrom(buf, registry);
    19 System.Diagnostics.Debug.Assert(basedataCopy.HasExtension(ChildDataType.ChildData)); 

时间: 2024-11-10 11:18:30

Google Protobuf扩展字段使用的相关文章

GOOGLE PROTOBUF开发者指南

ProtoBuf开发者指南 译者: gashero 目录 1   概览 1.1   什么是protocol buffer 1.2   他们如何工作 1.3   为什么不用XML? 1.4   听起来像是为我的解决方案,如何开始? 1.5   一点历史 2   语言指导 2.1   定义一个消息类型 2.2   值类型 2.3   可选字段与缺省值 2.4   枚举 2.5   使用其他消息类型 2.6   嵌套类型 2.7   更新一个数据类型 2.8   扩展 2.9   包 2.10   定

google protobuf初体验

最近在读别人代码的时候发现一个的东西,名字叫protobuf, 感觉挺好用的,写在这里,留个记录.那么什么是protobuf 呢?假如您在网上搜索,应该会得到类似这样的文字介绍: Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,目前已经正在使用的有超过 48,162 种报文格式定义和超过 12,183 个 .proto 文件.他们用于 RPC 系统和持续数据存储系统. Protocol Buffers 是一种轻便高效的结构化

使用CSharp编写Google Protobuf插件

什么是 Google Protocol Buffer? Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,目前已经正在使用的有超过 48,162 种报文格式定义和超过 12,183 个 .proto 文件.他们用于 RPC 系统和持续数据存储系统. Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化.它很适合做数据存储或 RPC 数据交换格式.可用于通讯协议.数据存储等

在Android Studio配置google protobuf

1.在project的build.gradle中配置 buildscript { repositories { jcenter() mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:2.2.3' classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.0' } } 注意 Gradle版本至少是 2.12 并且Java 7,本例子使用的是2.

Google protobuf proto文件编写规则

转载自: http://blog.csdn.net/yi_ya/article/details/40404231 1. 简单介绍 protobuf文件:就是定义你要的消息(类似java中的类)和消息中的各个字段及其数据类型(类似java类中的成员变量和他的数据类型) 2. Protobuf消息定义 消息由至少一个字段组合而成,类似于C语言中的结构.每个字段都有一定的格式. 字段格式:限定修饰符① | 数据类型② | 字段名称③ | = | 字段编码值④ | [字段默认值⑤] 1)限定修饰符包含

Google Protobuf 使用 Java 版

一 . Protobuf 的入门 Protobuf 是一个灵活,高效,结构化的数据序列化框架, 相比于 XML 等传统的序列化工具,它更小,更快,更灵活,更简单. Protobuf 支持数据结构化一次可以到处使用.甚至跨语言使用.同通过代码生成工具可以自动生成不同语言版本的源代码,甚至可以在使用不同版本的数据结构中进行数据传递,实现数据结构的向前兼容. Google 的 protobuf 在业界非常流行,很多商业项目选择 protobuf 作为编码解码框架,这里我们一起回顾一下 Protobuf

google protobuf学习笔记一:使用和原理

一.什么是protobuf protobuf全称Google Protocol Buffers,是google开发的的一套用于数据存储,网络通信时用于协议编解码的工具库.它和XML或者JSON差不多,也就是把某种数据结构的信息,以某种格式(XML,JSON)保存起来,protobuf与XML和JSON不同在于,protobuf是基于二进制的.主要用于数据存储.传输协议格式等场合.那既然有了XML等工具,为什么还要开发protobuf呢?主要是因为性能,包括时间开销和空间开销: 1.时间开销:XM

比较跨语言通讯框架:Apache Thrift和Google Protobuf

前两天想在微博上发表一个观点:在现在的技术体系中,能用于描述通讯协议的方式很多,xml,json,protobuf,thrift,如果在有如此众多选择的基础上,在设计系统时,还自造协议,自己设计协议类型和解析方式,那么我只能说,您真的落后了,不是技术上,而是思想上.对于xml,和json我们不做过多描述了,参考相关文档就可以了.特别是json,如今在 web系统,页游系统的前后台通讯中,应用非常广泛.本文将重点介绍两种目前在大型系统中,应用比较普遍的两种通讯框架,thrift和Protobuf,

google protobuf ios开发使用

简介: protobuf 即 google protocol buffer 是一种数据封装格式协议: 比如其他经常用的xml,json等格式:protobuf的优势是效率高,同样的一份数据使用protobuf存储的时候更小,更加方便: 官网: https://developers.google.com/protocol-buffers/ https://github.com/google/protobuf 在iOS上的使用 目前最新的版本需要xcode7.0+,以及不支持ARC 1. 从gith