richardartoul/molecule
GitHub: richardartoul/molecule
Molecule 提供了一个流式、零分配的 Go protobuf 解析接口,让开发者在性能关键路径上能够精确控制字段解析与内存分配。
Stars: 417 | Forks: 17
[](https://pkg.go.dev/github.com/richardartoul/molecule)
[](https://github.com/richardartoul/molecule/actions)
# Molecule
Molecule 是一个 Go 库,用于以高效且零分配的方式解析 protobuf。其 API 设计略微借鉴了[这个优秀的](https://github.com/buger/jsonparser) Go JSON 解析库。
该库目前处于 alpha 阶段,API 可能会发生更改。当前的 API 属于相当底层的接口,但未来可能会添加额外的辅助工具,以使某些操作更加易用。
## 设计初衷
Go 中标准的 `Unmarshal` protobuf 接口使得在解析 protobuf 时难以手动控制内存分配。此外,通常我们只需要访问单个 protobuf 中的部分字段。这些问题导致 protobuf 很难被应用在性能关键的路径上。
该库试图通过引入流式的、零分配的接口来解决这些问题,该接口允许用户完全控制需要解析哪些字段,以及如何/何时分配对象。
当然,其缺点是 `molecule` 比标准的 protobuf 库更难使用(也更容易被误用),因此建议仅在性能至关重要的情况下才使用它。它并不能作为 `proto.Unmarshal()` 的通用替代品。建议用户在尝试使用该库之前先熟悉 [proto3 编码](https://developers.google.com/protocol-buffers/docs/encoding)。
## 功能特性
1. 通过流式、零分配的 API 反序列化所有 protobuf 基本类型。
2. 支持以流式处理的方式遍历 protobuf 消息。
3. 支持以流式处理的方式遍历已打包(packed)的 protobuf 重复字段(数组)。
## 不支持的内容
1. Proto2 语法(部分功能可能会起作用,但未经过任何测试)。
2. 未使用 "packed"(打包)编码的重复字段(尽管理论上可以使用该库来解析它们,但目前没有任何专门的辅助工具)。
3. Map 字段。使用该库的 API *应该* 能够解析 Map,但过程会有点繁琐。我计划在确定合理的 API 后为其添加更好的支持。
4. 可能还有许多其他未涵盖的内容。
## 示例
[godocs](https://pkg.go.dev/github.com/richardartoul/molecule) 中包含许多可运行的示例。
## 致谢
该库很大程度上只是对他人工作成果的轻量级封装:
1. 其接口设计受到这个 [jsonparser](https://github.com/buger/jsonparser) 库的启发。
2. 与 protobuf 流交互的 codec 提取自这个 [protobuf 反射库](https://github.com/jhump/protoreflect)。为了减少依赖项,代码是手动 vendor(本地化依赖)的,而不是直接导入的。
## 依赖
`molecule` 核心库没有任何外部依赖。不过,`go.sum` 文件中确实包含了一些由测试包引入的依赖项,但是当使用该库时,这些依赖项*不应该*会被传递性地引入。
标签:EVTX分析, Go语言, Protobuf, 开发库, 日志审计, 程序破解, 解析器, 零内存分配