5

異なる言語で実装されたアプリケーション間でメッセージを渡すためにApacheThriftを使用しようとしています。これは必ずしもRPCとして使用されるわけではありませんが、メッセージのシリアル化/逆シリアル化に使用されます。1つのアプリケーションはnode.jsにあります。Apache thriftがnode.jsでどのように機能するかを理解しようとしていますが、Cassandraに関する1つの小さなものを除いて、あまり多くのドキュメントと例を見つけることができません: https ://github.com/apache/thrift/tree/ trunk / 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);

また、thriftのためにnodejsライブラリからindex.jsファイルに次の行を追加する必要があります。

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

さらに、nodejsライブラリには少なくとも1つのバグがあります。

于 2012-11-25T22:54:51.063 に答える
4

上記の答えは間違っています。これは、バッファの配列であるoutBuffersを直接使用しようとするためです。nodejsでthriftを使用する実際の例を次に示します。

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は正しいですが、前の例は間違っています。IMHO outBuffersはトランスポートクラスのプライベートプロパティであり、アクセスしないでください。

于 2014-10-09T17:41:19.107 に答える