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