文章目录加载中

NodeJS 与 protobuf

Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。

特点:语言无关、平台无关、可扩展序列化结构。

场景:数据存储和交换。

优点:定义简单、(反)序列化速度快、支持多种数据结构

# 编码优化

Varint 编码:不定长二进制整型编码

Zigzag: 有符号数编码优化

# 传输优化

protobuf 传输优化: Key-Value

# 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