# typeflow (March 2, 2023)

最近由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链接为自己的属性