Node Js 使用Protobuf

134 篇文章 1 订阅
53 篇文章 1 订阅

1,先去Nodjs下载 下载一个安装文件


2,安装完毕后呢, 就利用命令:

npm install protobufjs

进行安装


查看node js版本:

node -v

3,用IDE 打开,我使用webstom



4, 创建 协议文件:awesome.proto, 内容为:

package awesomepackage;
syntax = "proto3";

message AwesomeMessage {
    string awesome_field = 1; // becomes awesomeField ,特别要注意, 这里下划线后面在初始化的时候, 修改为大写,这里是个大坑. 只有string 类型才这样。
}

关键字:syntax


 

下面介绍下proto3的一些细节变化

Proto3的语法变化

语法标记

这个版本的protoc的protobuf编译器已经可以支持proto2语法和proto3的语法

如果你的proto文件没有添加syntax说明的话, 用这个版本的编译器会报错, 提示你默认proto2支持, 请添加语法标记

syntax = "proto2";

optional不需要了

只保留repeated标记数组类型, optional和required都被去掉了

实际使用证明, required的设计确实是蛋疼, C++的调试版会弹出assert,release版和optional也没啥区别

5,创建一个server.js 文件,代码为:

//  Test1.encode = function encode(message, writer) {
//  if (!writer)
//  writer = $Writer.create();
//  if (message.field1 !== undefined && message.hasOwnProperty("field1"))
//  writer.uint32(/* id 1, wireType 2 =*/10).string(message.field1);
// if (message.field2 !== undefined && message.hasOwnProperty("field2"))
//     writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.field2);
// if (message.field3 !== undefined && message.hasOwnProperty("field3"))
//     writer.uint32(/* id 3, wireType 0 =*/24).bool(message.field3);
// return writer;
// };



ProtoBuf = require("./protobufjs")
ProtoBuf.load("./awesome.proto", function(err, root) {
    if (err) throw err;


    // Obtain a message type
    var AwesomeMessage = root.lookup("awesomepackage.AwesomeMessage");


    // Create a new message
    var dataTable= {
        awesome_field:"AwesomeStringteTYRFG Create By Pjgan 2017 02 14"
    }

    var message = AwesomeMessage.create(dataTable);

    console.log(message.awesome_field) //取值

    // Encode a message to an Uint8Array (browser) or Buffer (node)
    var buffer = AwesomeMessage.encode(message).finish();

    // ... do something with buffer

    // Or, encode a plain object
    var buffer = AwesomeMessage.encode({ awesomeField: "AwesomeString" }).finish();
    // ... do something with buffer

    // Decode an Uint8Array (browser) or Buffer (node) to a message
    var message = AwesomeMessage.decode(buffer);
    // ... do something with message

});

6, 创建的文件放在node_modules 根目录即可。


7,创建完毕, 太多坑了。

以下是使用Node.js解析protobuf的两个例子: 1. 使用protobuf.js库解析protobuf文件 ```javascript const protobuf = require('protobufjs'); // 加载protobuf文件 protobuf.load('path/to/your/proto/file.proto', function(err, root) { if (err) throw err; // 获取消息类型 const MessageType = root.lookupType('your.package.MessageType'); // 创建一个消息对象 const message = MessageType.create({ /* 消息字段 */ }); // 将二进制数据解码为消息对象 const buffer = Buffer.from('your_protobuf_data', 'base64'); const decodedMessage = MessageType.decode(buffer); // 将消息对象编码为二进制数据 const encodedMessage = MessageType.encode(message).finish(); // 将消息对象转换为JSON格式 const jsonMessage = MessageType.toObject(message, { longs: String, enums: String, bytes: String }); // 打印解析结果 console.log(decodedMessage); console.log(encodedMessage); console.log(jsonMessage); }); ``` 2. 使用google-protobuf库解析protobuf文件 ```javascript const protobuf = require('google-protobuf'); // 加载protobuf文件 const root = protobuf.loadSync('path/to/your/proto/file.proto'); // 获取消息类型 const MessageType = root.lookupType('your.package.MessageType'); // 创建一个消息对象 const message = MessageType.create({ /* 消息字段 */ }); // 将二进制数据解码为消息对象 const buffer = Buffer.from('your_protobuf_data', 'base64'); const decodedMessage = MessageType.decode(buffer); // 将消息对象编码为二进制数据 const encodedMessage = MessageType.encode(message).finish(); // 将消息对象转换为JSON格式 const jsonMessage = MessageType.toObject(message, { longs: String, enums: String, bytes: String }); // 打印解析结果 console.log(decodedMessage); console.log(encodedMessage); console.log(jsonMessage); ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值