有没有办法在protobuf(proto2)中创建类型别名?

时间:2016-10-27 22:30:03

标签: documentation protocols protocol-buffers documentation-generation

是否可以创建protobuf标量类型的别名?

例如,我想使用Sequence代替string,即使它们是二进制等效的。

我的直接目标是使文档(使用protoc-gen-doc生成)更容易理解。

理想情况下,此类型将以支持类型检查的语言表示,但这不是必需的。

2 个答案:

答案 0 :(得分:4)

这将是一个有点沉闷的答案但是:

不,我不知道有这样的功能存在或已经有计划。

您可以通过制作仅包含单个字段的子消息来模拟它,但这会改变二进制表示。

你不是第一个问这个的人:

答案 1 :(得分:1)

[更新:2017年8月。适应完整的Go重写protoc-gen-bug,目前1.0.0-rc]

我没有类型别名的答案,但确实有一个答案:

  

我的直接目标是使文档(使用protoc-gen-doc生成)更容易理解。

我还要指出protoc-gen-doc已完全在Go中重写,现在使用Docker代替apt-get生成。

我在您的评论中创建了一些使用内联丰富格式的htmlmarkdown演示,例如添加链接,代码段,表格,粗体,斜体等。

还介绍了如何使用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文件来演示概念