本文描述处理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的更多相关文章

  1. Proto3:C++ API概览

    包名 说明 google::protobuf Protocol Buffer运行时库核心组件. google::protobuf::io I/O操作辅助类. google::protobuf::uti ...

  2. Proto3:C++代码生成指南

    本章节实际上是介绍Protocol Buffer编译器从给定的protocol定义中生成的C++代码.所有proto2和proto3生成的代码不同之处都会高亮标出 --- 需要注意的是这些不同之处只是 ...

  3. Proto3:编码

    本文介绍protocol buffer消息二进制传输格式.在应用程序中使用protocol buffer时,你并不需要了解这些,但它对你了解protocol buffer格式如何影响你的编码消息的大小 ...

  4. Proto3:风格

    本文介绍.proto文件的编码风格.遵循下面的惯例,可以使你的protocol buffer消息定义和它们对应的类连贯且已读. 注意,protocol buffer风格随时间变化一直在进步,所以可能你 ...

  5. Proto3:C++基本使用

    本教程提供protocol buffer在C++程序中的基础用法.通过创建一个简单的示例程序,向你展示如何: 在.proto中定义消息格式 使用protocol buffer编译器 使用C++ pro ...

  6. Proto3:Arena分配指南

    Arena分配是仅C++有的功能,在使用Protocol Buffer时,它可以帮助你优化你的内存使用,提高性能.在.proto文件中启用Arena分配会在生成的C++代码中添加处理Arena分配的额 ...

  7. Direct3D11学习:(八)Effects介绍

    转载请注明出处:http://www.cnblogs.com/Ray1024 一.概述 Effects框架是一组用于管理着色器程序和渲染状态的工具代码.例如,你可能会使用不同的effect绘制水.云. ...

  8. Language Guide (proto3) | proto3 语言指南(开篇)

    前言 近日在学习gRPC框架的相关知识时接触到Protobuf(protocol-buffers,协议缓冲区),proto3等知识.网上很多文章/帖子经常把gRPC与proto3放在一起,为避免初学者 ...

  9. Google Protobuf结合Netty实践

    1.Win版Protobuf代码生成工具下载: https://github.com/protocolbuffers/protobuf/releases 注意下载protoc-3.6.1-win32. ...

随机推荐

  1. Deep-Learning-with-Python] 文本序列中的深度学习

    https://blog.csdn.net/LSG_Down/article/details/81327072 将文本数据处理成有用的数据表示 循环神经网络 使用1D卷积处理序列数据 深度学习模型可以 ...

  2. Python模块——json

    简介 json全名是JavaScript Object Notation(即:Javascript对象标记).它是JavaScript的子集,JSON是轻量级的文本数据交换格式.前端和后端进行数据交互 ...

  3. nginx配置文件说明(包含IP黑名单、代理反射、负载均衡的配置)

    先看下nginx配置文件整体结构 图片来源51cto 配置文件及注解: #运行用户 主模块指令,指定Nginx Worker进程运行用户以及用户组,默认由nobody账号运行 user nobody; ...

  4. i春秋web作业2.26

    Web安全工程师(入门班) [全国线上入门班53期]课后作业   2020-2-26 DorinXL   1)为什么说js校验是一种不安全的校验方式? js校验不安全,是因为用户很容易通过控制台删除或 ...

  5. C#Web网站的创建

    一.CS与BS的区别 CS软件:需要在客户端安装软件. BS软件:只需要浏览器就能运行,Web网站就是BS软件. 创建过程: 1.文件新建---新建网站----空白网站 2.右击网站项目---添加网页 ...

  6. Table布局的优缺点

    总结 Table布局的缺点是比其它html标记占更多的字节,会阻挡浏览器渲染引擎的渲染顺序,会影响其内部的某些布局属性的生效,优点就是用table做表格是完全正确的 Tables的缺点 1.Table ...

  7. iOS补位动画、沙漏效果、移动UITableViewCell、模拟贪吃蛇、拖拽进度等源码

    iOS精选源码 JHAlertView - 一款黑白配色的HUD之沙漏效果 继承UIButton的自定义按钮SPButton 用递归算法实现iOS补位动画 iOS 长按移动UITableViewCel ...

  8. 十四、linux-MySQL的数据库集群读写分离及高可用性、备份等

    一.数据库集群及高可用性 二.mysql实现读写分离 mysql实现读写分离有多种方式: 1)代码语言(php\python\java等)层面实现读写分离,找开发进行实现. 2)通过软件工具实现读写分 ...

  9. RELAX NG

    RELAX NG (读作"relaxing"), 是一种基于语法的XML模式语言,可用于描述.定义和限制XML词汇表. 最初的XML模式语言是DTD,但是因为DTD语法丑陋, 表达 ...

  10. [LC] 125. Valid Palindrome

    Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignori ...