Proto3:Techniques
本文描述处理Protocol Buffer常用到的一些设计模式。你也可以给Protocol Buffers discussion group发送设计或使用问题。
流式多条消息
如果你想将多个消息写入到单个文件或流中,你需要记录一条消息的结束及另一个的开始。Protocol Buffer wire格式并不会自定义界限,所以protocol buffer解析器无法自行确定消息的结束位置。解决此问题最简单的方法就是在你写入消息之前写入每个消息的大小。当你重新读取消息时,你先读取到大小,然后将之后的字节读入到单个缓冲区,之后再从该缓冲区解析。(如果你希望避免拷贝字节到单个缓冲区,请查看CodeInputStream类(在C++和Java中),它保存着读取一定数量字节的限制。)
大数据集
Protocol Buffer并不是设计用来处理大数据。根据一般的使用经验,如果你要处理的消息大于1M,那么可能需要考虑换种方式。
也就是说,Protocol Buffer大数据集中的单个消息。通常,大数据集也只是一个小碎片的集合,每个小碎片可能是一段结构化的数据片段。尽管Protocol Buffer不能一次性地处理完整个数据集,但使用Protocol Buffer来编码每个碎片也极大地简化了你的问题:现在你要处理的是一组字节字符串,而不是一组结构。
Protocol Buffer并不包含对大数据集的任何内置支持,因为不同的场景需要不同的解决方案。有时候一个简单的记录列表就足够了,但其它时间你可能更想要一个类似数据库的东西。每个解决方案都应该作为一个独立的库来开发,这样只有需要它的人才需要为其支付代价。
自描述消息
Protocol Buffer并不包含其自身类型的说明。因此,如果只提供原始消息,而没有相应的.proto文件定义其类型,则很难提取任何有用的数据。
但是,请注意,.proto文件的内容本身可以用Protocol Buffer表示。源码包中的文件src/google/protobuf/descriptor.proto定义了相关的消息类型。使用--descriptor_set_out选项,protoc可以输出一个FileDescriptorSet来表示一组.proto文件。这样,你可以像下面那样定义你自己的自描述protocol消息:
syntax = "proto3";
import "google/protobuf/any.proto";
import "google/protobuf/descriptor.proto";
message SelfDescribingMessage {
// Set of FileDescriptorProtos which describe the type and its dependencies.
google.protobuf.FileDescriptorSet descriptor_set = 1;
// The message and its type, encoded as an Any message.
google.protobuf.Any message = 2;
}
通过使用类似DynamicMessage(C++和Java中可用),稍后你可以实现操作SelfDescribingMessage的工具。
总而言之,这个功能没有包含在Protocol Buffer库中的原因是Google从未使用过它。
该技术需要使用描述符支持动态消息。所以,在使用自描述消息前,请检查你的平台是否支持此功能。
更多信息,参见这里。
Proto3:Techniques的更多相关文章
- Proto3:C++ API概览
包名 说明 google::protobuf Protocol Buffer运行时库核心组件. google::protobuf::io I/O操作辅助类. google::protobuf::uti ...
- Proto3:C++代码生成指南
本章节实际上是介绍Protocol Buffer编译器从给定的protocol定义中生成的C++代码.所有proto2和proto3生成的代码不同之处都会高亮标出 --- 需要注意的是这些不同之处只是 ...
- Proto3:编码
本文介绍protocol buffer消息二进制传输格式.在应用程序中使用protocol buffer时,你并不需要了解这些,但它对你了解protocol buffer格式如何影响你的编码消息的大小 ...
- Proto3:风格
本文介绍.proto文件的编码风格.遵循下面的惯例,可以使你的protocol buffer消息定义和它们对应的类连贯且已读. 注意,protocol buffer风格随时间变化一直在进步,所以可能你 ...
- Proto3:C++基本使用
本教程提供protocol buffer在C++程序中的基础用法.通过创建一个简单的示例程序,向你展示如何: 在.proto中定义消息格式 使用protocol buffer编译器 使用C++ pro ...
- Proto3:Arena分配指南
Arena分配是仅C++有的功能,在使用Protocol Buffer时,它可以帮助你优化你的内存使用,提高性能.在.proto文件中启用Arena分配会在生成的C++代码中添加处理Arena分配的额 ...
- Direct3D11学习:(八)Effects介绍
转载请注明出处:http://www.cnblogs.com/Ray1024 一.概述 Effects框架是一组用于管理着色器程序和渲染状态的工具代码.例如,你可能会使用不同的effect绘制水.云. ...
- Language Guide (proto3) | proto3 语言指南(开篇)
前言 近日在学习gRPC框架的相关知识时接触到Protobuf(protocol-buffers,协议缓冲区),proto3等知识.网上很多文章/帖子经常把gRPC与proto3放在一起,为避免初学者 ...
- Google Protobuf结合Netty实践
1.Win版Protobuf代码生成工具下载: https://github.com/protocolbuffers/protobuf/releases 注意下载protoc-3.6.1-win32. ...
随机推荐
- SQL查询出一个表数据插入到另一个表里
下面两中方式都是将 srcTbl 的数据插入到 destTbl,但两句又有区别的: 方式一 (select into from)要求目标表(destTbl)不存在,因为在插入时会自动创建. selec ...
- APUE 书中 toll 函数
今天看unix环境高级编程时,随着书上的源码打了一遍,编译时提示 toll函数未定义, 找了半天(恕我对上下文不了解).看了英文版和源代码文件才知道, 中文版打印错了: toll => atol ...
- [单调队列]XKC's basketball team
XKC's basketball team 题意:给定一个序列,从每一个数后面比它大至少 \(m\) 的数中求出与它之间最大的距离.如果没有则为 \(-1\). 题解:从后向前维护一个递增的队列,从后 ...
- python处理nii格式文件
网上已经有很多代码了,但是注释的都不全,看起来很费解,我自己加了一些注释,重新发出来,尽可能的通俗易懂 读取前需要先安装库 pip install nibabel pip install matplo ...
- javacv获取视频第一帧
第一种是用ffmpeg工具,不过还得安装客户端软件,于是放弃了,还有一种是javacv开源工具,所以选择第二种: 第一种:ffmpeg工具 需要安装ffmpeg软件,支持windows和linux,视 ...
- SQLServer 安装提示需要重启计算机的解决方案
处理方法:在开始-程序-运行中(或者直接windows+R件同时),输入regedit回车,在注册表中找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Con ...
- RAM-Based Shift Register (ALTSHIFT_TAPS) IP Core-实现3X3像素阵列存储
最近想要实现CNN的FPGA加速处理,首先明确在CNN计算的过程中,因为卷积运算是最耗时间的,因此只要将卷积运算在FPGA上并行实现,即可完成部分运算的加速 那么对于卷积的FPGA实现首先要考虑的是卷 ...
- 吴裕雄--天生自然python学习笔记:python 用 Open CV通过人脸识别进行登录
人脸识别登录功能的基本原理是通过对比两张图片的差异度来判断两张图片是 否是同 一人的面部 . 对比图片 差异度 的算法有很多种,本例中使用“颜色直方图” 算法来实现对人脸图像的识别. 下面为比较 im ...
- PostgreSQL中实现更新默认值(二)
今天我们用表继承+触发器的方案,来实现表中的更新默认值.这也许是PostgreSQL里最佳的解决方案. 一. 创建一张表,作为父表 create table basic_update( t_updat ...
- 67)PHP,cookie的基本使用和基本原理
(1)允许 服务器端脚本 , 在浏览器端 存数数据的一种技术. 其实cookie是浏览器的一种技术. (2)特点:允许服务器向浏览器发送指令,用来管理存储在浏览器端的cookie数据. ...