4 个版本

0.3.0-alpha.22020年8月22日
0.3.0-alpha.12020年8月21日
0.3.0-alpha.02020年8月13日
0.1.0 2020年4月4日

测试 中排名第 501

MIT 许可证

30KB
722

trans-gen

Continuous integration

trans-gen 是一个为 trans 的代码生成器,trans 是一个简单的二进制序列化协议,用于在不同编程语言之间转换数据。

Trans

Trans 是一个简单的二进制序列化协议。

数据类型

Trans 支持以下数据类型

  • Bool — 一个布尔值(true/false)。序列化为一个字节:0 表示 false1 表示 true,其他字节值是无效表示。
  • Int32 — 32位整数。以小端字节序序列化。
  • Int64 — 64位整数。以小端字节序序列化。
  • Float32 — 32位浮点数。以小端字节序序列化。
  • Float64 — 64位浮点数。以小端字节序序列化。
  • StringUTF-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 会在“客户端”和“服务器”之间做出区分。服务器是包含模型定义的代码,并在接收到数据时需要处理错误数据。客户端是需要读取数据的代码,并依赖于其有效性,因此可以实施一些优化(如预分配集合类型)。

版本控制

仅在“服务器”端存在的一个功能是版本控制。基本上,服务器应支持所有可能的版本客户端,而客户端只知道其特定版本。

版本控制仅适用于自定义数据类型:StructEnumOneOf

对于 Struct,不同版本可能包含不同的字段集。所有字段都始终存在于服务器上,但客户端只知道其版本中存在的那些。如果我们从不含特定字段的版本接收数据,则在服务器上构建结构体时必须提供一个默认值。

对于 Enum,较晚的版本可能添加额外的变体。尚未支持删除变体。

OneOf 类似于 EnumStruct 的组合,因此它们可以添加额外的变体和/或更改每个变体的字段集。

代码生成器

代码生成器接收服务器提供的模式,并为指定版本生成客户端代码。

支持的语言(点击链接获取语言实现细节)

生成的代码示例及基准测试

testing 示例包含测试。您可以在testing 分支中看到为此生成的代码。

您还可以在那里看到针对所有语言、平台、测试和模型的基准测试。或者,请参阅本地基准测试(可能已过时)。

模型

  • example — 简单示例模型
  • codecraft — 2020 年 AI Cup “CodeCraft” 的模型

测试

  • FileReadWrite — 从文件读取数据并将其写入另一个文件。
  • TcpReadWrite — 从服务器端的 TCP 连接读取数据流并将其写回。

依赖项

~2.5MB
~47K SLoC