5

我正在尝试使用 Apache Thrift 在以不同语言实现的应用程序之间传递消息。它不一定用作 RPC,而更多用于序列化/反序列化消息。一个应用程序位于 node.js 中。我试图弄清楚 Apache thrift 如何与 node.js 一起工作,但我找不到太多文档和示例,除了一个关于 Cassandra 的小文档和示例: https ://github.com/apache/thrift/tree/主干/lib/nodejs

同样,我不需要在 .thrift 文件中声明的任何过程,我只需要序列化一个简单的数据结构,例如:

struct Notification {
   1: string subject,
   2: string message
 }

谁能帮我举个例子?

4

3 回答 3

6

在仅仅通过查看 nodejs 的库浪费了很多时间之后,我终于找到了这个问题的答案。

//SERIALIZATION:
var buffer = new Buffer(notification);
var transport = new thrift.TFramedTransport(buffer);
var binaryProt = new thrift.TBinaryProtocol(transport);
notification.write(binaryProt);

此时,可以在 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);

为了节俭,还需要将以下几行添加到 nodejs 库中的 index.js 文件中:

exports.TFramedTransport = require('./transport').TFramedTransport;
exports.TBufferedTransport = require('./transport').TBufferedTransport;
exports.TBinaryProtocol = require('./protocol').TBinaryProtocol;

另外,nodejs 库中也至少存在一个错误。

于 2012-11-25T22:54:51.063 回答
4

上面的答案是错误的,因为它试图直接使用 outBuffers,它是一个缓冲区数组。这是一个使用 thrift 和 nodejs 的工作示例:

var util = require('util');
var thrift = require('thrift');

var Notification = require('./gen-nodejs/notification_types.js').Notification;

var TFramedTransport = require('thrift/lib/thrift/transport').TFramedTransport;
var TBufferedTransport = require('thrift/lib/thrift/transport').TBufferedTransport;
var TBinaryProtocol = require('thrift/lib/thrift/protocol').TBinaryProtocol;

var transport = new TFramedTransport(null, function(byteArray) {
  // Flush puts a 4-byte header, which needs to be parsed/sliced.
  byteArray = byteArray.slice(4);

  // DESERIALIZATION:
  var tTransport = new TFramedTransport(byteArray);
  var tProtocol = new TBinaryProtocol(tTransport);
  var receivedNotification = new Notification();
  receivedUser.read(tProtocol);

  console.log(util.inspect(receivedNotification, false, null));
});

var binaryProt = new TBinaryProtocol(transport);

// SERIALIZATION:
var notification = new Notification({"subject":"AAAA"});
console.log(util.inspect(notification, false, null));
notification.write(binaryProt);
transport.flush();
于 2013-08-05T23:56:23.487 回答
1

DigitalGhost 是对的,前面的例子是错误的。恕我直言,outBuffers 是传输类的私有属性,不应访问。

于 2014-10-09T17:41:19.107 回答