4 个版本
| 0.3.0-alpha.2 | 2020年8月22日 |
|---|---|
| 0.3.0-alpha.1 | 2020年8月21日 |
| 0.3.0-alpha.0 | 2020年8月13日 |
| 0.1.0 | 2020年4月4日 |
在 测试 中排名第 501
30KB
722 行
trans-gen
trans-gen 是一个为 trans 的代码生成器,trans 是一个简单的二进制序列化协议,用于在不同编程语言之间转换数据。
Trans
Trans 是一个简单的二进制序列化协议。
数据类型
Trans 支持以下数据类型
Bool— 一个布尔值(true/false)。序列化为一个字节:0表示false,1表示 true,其他字节值是无效表示。Int32— 32位整数。以小端字节序序列化。Int64— 64位整数。以小端字节序序列化。Float32— 32位浮点数。以小端字节序序列化。Float64— 64位浮点数。以小端字节序序列化。String— UTF-8 编码 字符串。以字节长度(作为一个Int32)序列化,后跟字节Option<T>— 类型为T的可选值。如果不存在,序列化为false。否则,序列化为true,后跟值。Vec<T>— 类型为T的向量(数组)。以元素数量(作为一个Int32)序列化,后跟元素。Map<K, V>— 一个键类型为K、值类型为V的映射(字典)。序列化为键值对数量(作为一个Int32),然后是键值对(键在前,值在后)。Struct— 包含多个字段的结构体。每个字段可以有自己的类型。序列化为所有字段依次排列,没有任何额外数据,因此字段顺序很重要。Enum— 枚举,一个值被限制为一系列变体的类型。序列化为变体的索引(作为一个Int32),从0开始。OneOf— 代数(求和)数据类型,一个可以是给定集合中其他类型之一的类型。每个变体类型实际上,就像一个Struct,只是一个字段的集合。序列化为类型变体的索引(作为一个Int32),从0开始,然后是字段。
客户端与服务器
Trans 会在“客户端”和“服务器”之间做出区分。服务器是包含模型定义的代码,并在接收到数据时需要处理错误数据。客户端是需要读取数据的代码,并依赖于其有效性,因此可以实施一些优化(如预分配集合类型)。
版本控制
仅在“服务器”端存在的一个功能是版本控制。基本上,服务器应支持所有可能的版本客户端,而客户端只知道其特定版本。
版本控制仅适用于自定义数据类型:Struct、Enum 和 OneOf。
对于 Struct,不同版本可能包含不同的字段集。所有字段都始终存在于服务器上,但客户端只知道其版本中存在的那些。如果我们从不含特定字段的版本接收数据,则在服务器上构建结构体时必须提供一个默认值。
对于 Enum,较晚的版本可能添加额外的变体。尚未支持删除变体。
OneOf 类似于 Enum 和 Struct 的组合,因此它们可以添加额外的变体和/或更改每个变体的字段集。
代码生成器
代码生成器接收服务器提供的模式,并为指定版本生成客户端代码。
支持的语言(点击链接获取语言实现细节)
- C++
- C#
- D
- F#
- Go
- Haskell
- Java
- JavaScript
- Kotlin
- Pascal
- PHP
- Python
- Ruby
- Rust
- Scala
- Swift
- TypeScript
- Markdown(生成文档)
生成的代码示例及基准测试
testing 示例包含测试。您可以在testing 分支中看到为此生成的代码。
您还可以在那里看到针对所有语言、平台、测试和模型的基准测试。或者,请参阅本地基准测试(可能已过时)。
模型
example— 简单示例模型codecraft— 2020 年 AI Cup “CodeCraft” 的模型
测试
- FileReadWrite — 从文件读取数据并将其写入另一个文件。
- TcpReadWrite — 从服务器端的 TCP 连接读取数据流并将其写回。
依赖项
~2.5MB
~47K SLoC