文章目录加载中
NodeJS 与 protobuf
Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。
特点:语言无关、平台无关、可扩展序列化结构。
场景:数据存储和交换。
优点:定义简单、(反)序列化速度快、支持多种数据结构
# 编码优化
# 传输优化
# Node 中使用 protobuf
# .proto 定义
person.proto
:
package person; // 名字空间
syntax = "proto3";
message PersonMessage {
required string name = 1;
optional string email = 2;
// 枚举
enum SexType {
UNKNOWN = 0;
MALE = 1;
FEMALE = 2;
}
required SexType sex = 3 [default = UNKNOWN]; // 默认值
// 嵌套message
message LocationType {
required string country = 1;
}
optional LocationType location = 4;
}
student.proto
:
syntax = "proto3";
import "./person.proto"; // 模块引用
package student;
message StudentMessage {
required string school = 1;
required person.PersonMessage teacher = 2;
}
# 加载、验证、编/解码
const protobuf = require('protobufjs');
main();
function main() {
const payload = {
school: 'szu',
teacher: {
name: 'dongyuanxin',
sex: 2,
location: {
country: 'zh-cn',
},
},
};
protobuf.load('./student.proto').then((root) => {
const AwesomeMessage = root.lookupType('student.StudentMessage');
// step1:校验是否合法
let verified = AwesomeMessage.verify(payload);
if (verified) {
// verified 存放不合法信息
throw new Error(verified);
}
// step2: 工厂模式创建编译/解码器
let message = AwesomeMessage.create(payload);
console.log(message);
// step3: 编译为2进制
let buffer = AwesomeMessage.encode(message).finish();
console.log(buffer);
// step4: 解码
let decoded = AwesomeMessage.decode(buffer);
console.log(decoded);
});
}
# 参考链接
本文来自心谭博客:xin-tan.com,经常更新web和算法的文章笔记,前往github查看目录归纳:github.com/dongyuanxin/blog