二进制格式设计思想
在二进制格式设计中,其实和json的格式设计类似,也是有套路的。
设计要存储的内容(内容尽可能少,能用数字表示,不用字符串表示)。这些内容的前后顺序,读写都是按照这个顺序来的。
比如:FileHeader 由magic(4bytes (ZKLG)) version(4bytes) dbid (8bytes)组成,写入的顺序:4bytes 的ZKLG、4bytes的version、8bytes的dbid,读的时候也一样
设计每个内容所占的字节数,读写的时候按照顺序读写就行。zk是借助BinaryOutputArchive BinaryInputArchive 工具类实现
每块内容的字节如何设计呢
1 原始数据类型,如:int long 就用原本的字节大小
2 字符串类型,在前面先写入字符串长度,长度是原始类型。之后在写入具体的字符串内容
FileTxnLog 事物日志的二进制格式设计
不同类型的type具体的record,要看Record接口的实现类。
快照日志数据格式
DataTree 借助BinaryOutputArchive 字节工具将对象模型转换成字节保存。
将record数据的每个字段都按照基础数据类型char int long dubbo float bool 基础数据类型的字节占用大小进行写入;String 类型的先写入int类型的大小在写入内存;
BinaryOutputArchive 二进制输出数据流类
BinaryInputArchive 二进制输入数据流类
将record数据的每个字段都按照基础数据类型char int long dubbo float bool 基础数据类型的字节占用大小进行读取,string类型的先读取大小,在读取内容。
BinaryInputArchive 底层是一个DataInput