我有一个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
});
});
答案 0 :(得分:0)
我还没有尝试过您的代码,但我认为它正在运行。
这似乎是正确的,并且基本上是TSerializer等人在其他语言中所做的事情。当然,它可以以更友好的方式包裹在vanilla JS库中。
我唯一可以建议的是减少它" hacky"将只是创建一个Thrift服务方法,返回您需要的对象...然后序列化/反序列化逻辑将在生成的服务客户端中自动包装好。