使用纯Javascript库从/向JSON序列化Thrift对象的更好方法是什么?

时间:2015-12-19 21:08:17

标签: javascript json thrift thrift-protocol

我有一个Web服务器返回一个序列化的thrift对象,使用纯Javascript Thrift库(thrift.js)将JSON协议用于客户端html页面。

服务器例如:

from MyThriftFile.ttypes import ThriftClass
from thrift import TSerialization
from thrift.protocol import TJSONProtocol

thrift_obj = new ThriftClass()
result = TSerialization.serialize(
    thrift_obj,
    protocol_factory=TJSONProtocol.TJSONProtocolFactory())

return result

现在在C#,Python,Java,甚至node.js Thrift库中,存在某种形式的通用TSerialization或TDeserialization utlity,它或多或少地实现如下:

def deserialize(base,
        buf,
        protocol_factory=TBinaryProtocol.TBinaryProtocolFactory()):

    transport = TTransport.TMemoryBuffer(buf)
    protocol = protocol_factory.getProtocol(transport)
    base.read(protocol)
    return base

因此,它获取数据,将其加载到一个丢弃的传输中(因为我们不会在任何地方发送此信息),创建一个新的协议对象来编码这些数据,最后实际的thrift对象将这些数据读取到填充自己。

然而,纯javacript库似乎缺乏此功能。我理解为什么客户端库只支持JSON协议(网页不处理原始二进制数据),但为什么不从/到JSON进行de / serialization的方法?

我做了自己的方法来做这项工作,但看起来很糟糕。谁有更好的伎俩?

$(document).ready(function() {
    $.get("www.mysite.com/thrift_object_i_want/", function(data,     status) {
        var transport = new Thrift.Transport();
        var protocol  = new Thrift.Protocol(transport);

        // Sets the data we are going to read from.
        transport.setRecvBuffer(data);

        // This is basically equal to
        // rawd = data
        rawd = transport.readAll();

        // The following is lifited from 
        // readMessageBegin().
        // These params I am setting are private memeber
        // vars that protocol needs set in order to read
        // data set in setRevBuff()
        obj = $.parseJSON(rawd);
        protocol.rpos = []
        protocol.rstack = []
        protocol.rstack.push(obj)

        // Now that the protocl has been hacked to function
        // populate our object from it
        tc = new ThriftClass();
        tc.read(protocol);

        // u is now a js object equal to the python object
    });
});

1 个答案:

答案 0 :(得分:0)

我还没有尝试过您的代码,但我认为它正在运行。

这似乎是正确的,并且基本上是TSerializer等人在其他语言中所做的事情。当然,它可以以更友好的方式包裹在vanilla JS库中。

我唯一可以建议的是减少它" hacky"将只是创建一个Thrift服务方法,返回您需要的对象...然后序列化/反序列化逻辑将在生成的服务客户端中自动包装好。