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