在nodejs中使用Apache Thrift进行序列化 - 反序列化

Cla*_*ara 5 serialization thrift node.js deserialization

我正在使用Node.js应用程序,我需要序列化和反序列化.thrift文件中定义的结构的实例,如下所示:

 struct Notification {
   1: string subject,
   2: string message
 }
Run Code Online (Sandbox Code Playgroud)

根据http://www.gettingcirrius.com/2011/03/rabbitmq-with-thrift-serialization.html上的教程,这在Java中很容易实现:

    Notification notification = new Notification();
    TDeserializer deserializer = new TDeserializer();
    deserializer.deserialize(notification, serializedNotification);
    System.out.println("Received "+ notification.toString());
Run Code Online (Sandbox Code Playgroud)

但我无法使用Thrift的nodejs库找到这是如何完成的.有人可以帮忙吗?

Cla*_*ara 8

好吧,在浪费了大量时间进行研究并尝试不同的解决方案之后,我终于找到了自己问题的答案:

//SERIALIZATION:
var buffer = new Buffer(notification);
var transport = new thrift.TFramedTransport(buffer);
var binaryProt = new thrift.TBinaryProtocol(transport);
notification.write(binaryProt);
Run Code Online (Sandbox Code Playgroud)

通知是我希望序列化的对象.此时,可以在transport.outBuffers字段中找到字节数组:var byteArray = transport.outBuffers;

对于反序列化:

var tTransport = new thrift.TFramedTransport(byteArray);
var tProtocol = new thrift.TBinaryProtocol(tTransport);
var receivedNotif = new notification_type.Notification();
receivedNotif.read(tProtocol);
Run Code Online (Sandbox Code Playgroud)

假设已经从nodejs库为thrift添加了以下行到index.js文件中:

exports.TFramedTransport = require('./transport').TFramedTransport;
exports.TBufferedTransport = require('./transport').TBufferedTransport;
exports.TBinaryProtocol = require('./protocol').TBinaryProtocol;
Run Code Online (Sandbox Code Playgroud)

  • 如何`新的缓冲区(通知)`应该工作?你将一个对象传递给构造函数,Node中没有这样的重载.你也不需要修改thrift的`index.js`,因为它只是`require('thrift/lib/thrift/transport')`等. (2认同)