在我的代码中,一个函数返回一个protobuf对象,我想将它保存在一个文件xyz. pb中。当我尝试使用fs.writefilesync保存它时,它没有保存它。它本质上是循环的。所以,我尝试使用circular-json模块保存它,以确认它里面是否有任何东西,它是否有数据。但是,正如我一开始使用circular-json,它没有正确的信息(没有正确的格式),它是没有用处的。如何使用nodejs将此protobuf保存到文件中?谢谢!
htzpubme1#
可以尝试使用文档中提到的流如下
const crypto = require('crypto'); const fs = require('fs'); const wstream = fs.createWriteStream('fileWithBufferInside'); // creates random Buffer of 100 bytes const buffer = crypto.randomBytes(100); wstream.write(buffer); wstream.end();
或者你可以将buffer转换为JSON并保存在文件中,如下所示:
const crypto = require('crypto'); const fs = require('fs'); const wstream = fs.createWriteStream('myBinaryFile'); // creates random Buffer of 100 bytes const buffer = crypto.randomBytes(100); wstream.write(JSON.stringify(buffer)); wstream.end();
如果你的应用程序逻辑不需要使用同步性质,你不应该使用writeFileSync,因为它会阻塞你的代码,直到它结束,所以要小心。尝试使用writeFile或Streams,这更方便。
writeFileSync
writeFile
2j4z5cfb2#
Protocol Buffers的目的是将强类型消息序列化为二进制格式,然后再序列化回消息。如果要将消息从内存写入文件,请首先将消息序列化为二进制,然后将二进制写入文件。NodeJS Buffer docsNodeJS write binary buffer into a file协议缓冲区JavaScript SDK文档它应该看起来像这样:
const buffer = messageInstance.serializeBinary() fs.writeFile("filename.pb", buffer, "binary", callback)
bvuwiixz3#
我发现了如何轻松地将protobuf对象保存在文件中。将protobuf对象转换为buffer并保存。
const protobuf = somefunction(); // returning protobuf object const buffer = protobuf.toBuffer(); fs.writeFileSync("filename.pb", buffer);
23c0lvtd4#
如果使用protobufjs模块,finish()方法返回您要保存的二进制数组。
finish()
const protoWriter = ProtoResource.encode(ProtoResource.fromObject(someJson)); fs.writeFileSync("./resources/output", protoWriter.finish());
当然,someJson应该符合您的ProtoResource消息定义。
someJson
ProtoResource
4条答案
按热度按时间htzpubme1#
可以尝试使用文档中提到的流
如下
或者你可以将buffer转换为JSON并保存在文件中,如下所示:
如果你的应用程序逻辑不需要使用同步性质,你不应该使用
writeFileSync
,因为它会阻塞你的代码,直到它结束,所以要小心。尝试使用writeFile
或Streams,这更方便。2j4z5cfb2#
Protocol Buffers的目的是将强类型消息序列化为二进制格式,然后再序列化回消息。如果要将消息从内存写入文件,请首先将消息序列化为二进制,然后将二进制写入文件。
NodeJS Buffer docs
NodeJS write binary buffer into a file
协议缓冲区JavaScript SDK文档
它应该看起来像这样:
bvuwiixz3#
我发现了如何轻松地将protobuf对象保存在文件中。
将protobuf对象转换为buffer并保存。
23c0lvtd4#
如果使用protobufjs模块,
finish()
方法返回您要保存的二进制数组。当然,
someJson
应该符合您的ProtoResource
消息定义。