5

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

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

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

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

但是我找不到使用 Thrift 的 nodejs 库是如何做到这一点的。有人可以帮忙吗?

4

3 回答 3

8

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

//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;
于 2012-11-20T17:57:30.583 回答
0

这是我在浏览器中运行的 TypeScript 版本。npm install buffer使用前。

如果你删除它应该在节点上工作import { Buffer }

/*
 Thrift serializer for browser and node.js

 Author: Hirano Satoshi

 Usage:
    let byteArray = thriftSerialize(thriftObj);
    let thriftObj2 = thriftDeserialize(byteArray, new ThriftClass())
    let mayBeTrue = byteArrayCompare(byteArray, thriftSerialize(thriftObj2))
 */

import { TBufferedTransport, TFramedTransport, TJSONProtocol, TBinaryProtocol } from 'thrift';
import { Buffer } from 'buffer';

export function thriftSerialize(thriftObj: any): Buffer {
    let transport = new TBufferedTransport(null);
    let protocol = new TBinaryProtocol(transport);
    thriftObj.write(protocol);

    // copy array of array into byteArray
    let source = transport.outBuffers;
    var byteArrayLen = 0;
    for (var i = 0, len = source.length; i < len; i++)
        byteArrayLen += source[i].length;
    let byteArray = new Buffer(byteArrayLen);
    for (var i = 0, len = source.length, pos = 0; i < len; i++) {
        let chunk = source[i];
        chunk.copy(byteArray, pos);
        pos += chunk.length;
    }
    return byteArray;
}

export function thriftDeserialize(byteArray: Buffer, thriftObj: any): any {
    let transport = new TBufferedTransport(byteArray);
    let callback = (transport_with_data) => {
        var proto = new TBinaryProtocol(transport_with_data);
        //    var proto = new TJSONProtocol(transport);
        thriftObj.read(proto);
    }
    // var buf = new Buffer(byteArray);

    TBufferedTransport.receiver(callback)(byteArray);
    return thriftObj;
}

export function byteArrayCompare(array1, array2): boolean {
    if (!array1 || !array2)
        return false;
    let val = array1.length === array2.length && array1.every((value, index) => value === array2[index])
    return val;
}
于 2018-11-14T11:58:32.677 回答
0

不知何故,我没有在以下位置找到字节数组:

transport.outBuffers

我需要做以下事情:

         var transport = new Thrift.TFramedTransport(null, function(bytes){
            dataWrapper.out = bytes;
            cb(dataWrapper)
        })


        var binaryProt = new Thrift.TCompactProtocol(transport);
        notification.write(binaryProt) ;
        transport.flush() ; //important without the flush the transport callback will not be invoked
于 2019-07-24T11:59:13.833 回答