У меня есть веб-сервер, возвращающий сериализованный объект бережливости, используемый протокол JSON на клиентскую html-страницу, используя чистую библиотеку Javascript Thrift (thrift.js
).Лучший способ де-сериализации объекта Thrift от/до JSON с использованием чистой библиотеки Javascript?
сервер, например:
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 Бережливость библиотеки есть некоторая форма этого общего 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
так он получает его данные, загружает его в Выбросьте транспорта (потому что мы не будем посылать эту информацию в любом месте), создает новый объект протокола для кодирования этой информации, и, наконец, фактический бережливый объект читает эти данные населению т. е. сам.
Чистая библиотека javacript, похоже, не обладает такой функциональностью. Я понимаю, почему клиентская библиотека поддерживает только протокол JSON (веб-страницы не обрабатывают необработанные двоичные данные), но почему бы не использовать метод для/сериализации из/в JSON?
Я сделал свой собственный метод для выполнения задания, но он кажется взломанным. У кого-то есть лучший трюк?
$(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
});
});
предложение использовать RPC-аспект Thrift было бы полезно, но, к сожалению, требования моего проекта я использую Thrift только для его генерации кода и сериализации. По сути, я выбрал его поверх protobuffer, потому что он поддерживал мои требуемые языки и поддерживал больше типов данных (например, например). – 10cool