是否可以创建protobuf标量类型的别名?
例如,我想使用Sequence
代替string
,即使它们是二进制等效的。
我的直接目标是使文档(使用protoc-gen-doc生成)更容易理解。
理想情况下,此类型将以支持类型检查的语言表示,但这不是必需的。
答案 0 :(得分:4)
这将是一个有点沉闷的答案但是:
不,我不知道有这样的功能存在或已经有计划。
您可以通过制作仅包含单个字段的子消息来模拟它,但这会改变二进制表示。
你不是第一个问这个的人:
答案 1 :(得分:1)
[更新:2017年8月。适应完整的Go重写protoc-gen-bug,目前1.0.0-rc
]
我没有类型别名的答案,但确实有一个答案:
我的直接目标是使文档(使用
protoc-gen-doc
生成)更容易理解。
我还要指出protoc-gen-doc
已完全在Go中重写,现在使用Docker代替apt-get
生成。
我在您的评论中创建了一些使用内联丰富格式的html
和markdown
演示,例如添加链接,代码段,表格,粗体,斜体等。
还介绍了如何使用TravisCI
自动生成并发布到Github页面(gh-pages
分支)
有一些小错误仍需要解决(2017年8月)才能生产就绪。
在以下位置查看演示' s +说明:
例如,降价内联评论:
/**
* The **SLEEP** format is designed by the [Dat Project](https://datproject.org)
* to allow for sparse replication, meaning you can efficiently download
* only the metadata and data required to resolve a single byte region
* of a single file, which makes Dat suitable for a wide variety of streaming,
* _real-time_ and large dataset use cases.
*
* To take advantage of this, Dat includes a _network protocol_. It is message
* based and stateless, making it possible to implement on a variety of network
* transport protocols including UDP and TCP.
*
* Both metadata and content registers in **SLEEP** share the exact same
* replication protocol.
*
* Individual messages are encoded using Protocol Buffers and there are ten
* message types in total.
*
* ### Wire Protocol
*
* Over the wire messages are packed in the following lightweight
* container format:
*
* ```
* <varint - length of rest of message>
* <varint - header>
* <message>
* ```
*
* The `header` value is a single `varint` that has two pieces of information,
* the integer type that declares a 4-bit message type (used below), and a
* channel identifier, 0 for metadata and 1 for content.
*
* To generate this varint, you bitshift the 4-bit type integer onto the end of
* the channel identifier, e.g. channel << 4 | <4-bit-type>.
*
* ### Using in NodeJS
*
* The `protocol-bufers` package offers an intuitive javascript API, so you need
* not worry about low-level protocol concepts.
*
* This example demonstrates how you create a feed and start streaming:
*
* ```javascript
* var protocol = require('hypercore-protocol')
* var stream = protocol()
*
* // open a feed specified by a 32 byte key
* var feed = stream.feed(Buffer('deadbeefdeadbeefdeadbeefdeadbeef'))
*
* feed.request({block: 42})
* feed.on('data', function (message) {
* console.log(message) // contains message.index and message.value
* })
*
* stream.pipe(anotherStream).pipe(stream)
* ```
*/
将导致输出类似于此:
HypercoreSpecV1_md.proto
SLEEP 格式由Dat Project设计,允许稀疏复制, 这意味着您可以有效地仅下载元数据和数据 需要解析单个文件的单字节区域,这使得 Dat适用于各种流媒体, 实时和大型数据集用例。
为了利用这一点,Dat包含网络协议。它是 基于消息和无状态,使得可以实现 各种网络传输协议,包括UDP和TCP。
SLEEP 中的元数据和内容寄存器共享完全相同 复制协议。
使用协议缓冲区对单个消息进行编码 共有十种消息类型。
有线协议
有线消息打包在以下轻量级中 容器格式:
<varint - length of rest of message> <varint - header> <message>
header
值是单个varint
,有两个 information,声明4位消息类型的整数类型(使用 下面的)和一个频道标识符,0表示元数据,1表示内容。要生成此varint,您需要将4位类型的整数移位到 信道标识符的结尾,例如, channel&lt;&lt; 4 | &LT; 4位型&GT;
在NodeJS中使用
protocol-bufers
包提供了一个直观的JavaScript API,所以 您无需担心低级协议概念。此示例演示了如何创建Feed并开始流式传输:
var protocol = require('hypercore-protocol') var stream = protocol() // open a feed specified by a 32 byte key var feed = stream.feed(Buffer('deadbeefdeadbeefdeadbeefdeadbeef')) feed.request({block: 42}) feed.on('data', function (message) { console.log(message) // contains message.index and message.value }) stream.pipe(anotherStream).pipe(stream)
(注意: hypercore协议是用于创建分散式点对点应用程序设计的Dat Project模块生态系统的核心规范之一。我使用他们的.proto
文件来演示概念)