muspi_merol / blog / raxutl1tr8k2dy8x

最后更新于:2023年3月7日

typeflow


最近由gRPC看到了protobuf,了解了一些IDL,我不太喜欢他们这种code-gen风格

我想发明一种序列化协议

  • 可以在文件头定义类型或者另外定义类型
  • 定义类型为:id+type
  • type支持级联的方式
  • 数据是连续的id+len+data,如果是基本数据类型则不用len

type定义部分(用json描述,但也可以很容易地改变为"类型+(长度)+值"的结构

  • id
    • 列表
    • object / structure
    • 基本数据类型……
    • 剩下的才需要定义
  • size(0则为不固定,需要填)
  • data: list
    • type: id
    • name: str

data数据部分,每个单元为:

  • 由id得倒type,后一个不是size就是data

  • 递归地parse

  • 一个int代表type定义部分的长度

  • 一个最后得出的 int id

  • 一个代表类型的

    • 0 structure
    • 1 bool
    • 2 int
    • 3 float
    • 1 string

对于structure

  • 一个int代表type定义部分的长度

  1. Data类,用类型标注。装饰器识别类型标注,生成树结构 —— 这个很容易
  2. 可以dumps()一个Data类,输出为json/binary
    1. 自身id
    2. 属性名,属性id,属性size
  3. 可以dumps()一个Data实例
    1. 如果是基本类型,输出[类型id]+[可能有size]+[bytes(self.data)]
    2. 如果不是基本类型(是对象类型)
      1. 第三部分变成[b"".join(i.encode() for i in …)]
      2. 第二部分如果需要,就变成len(…)
    3. dumps()一个Data实例就是调用它的encode()方法
  4. 可以decode一个二进制串
    1. 读其id,如果是基本类型,输出它本身
    2. 如果是对象类型,逐个将它的data链接为自己的属性