2015-12-19 5 views
1

У меня есть веб-сервер, возвращающий сериализованный объект бережливости, используемый протокол 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 
    }); 
}); 

ответ

0

Я не пробовал ваш код, но я предполагаю, что он работает.

Кажется правильным и, по существу, то, что TSerializer и другие классы делают на этих других языках. Разумеется, его можно было бы обернуть более дружелюбным способом для библиотеки ванили JS.

Единственное, что я мог бы рекомендовать сделать его менее «взломанным», это просто создать метод службы Thrift, который возвращает нужные вам объекты ... тогда логика сериализации/десериализации будет автоматически завершена хорошо для вас в сгенерированном сервисном клиенте.

+1

предложение использовать RPC-аспект Thrift было бы полезно, но, к сожалению, требования моего проекта я использую Thrift только для его генерации кода и сериализации. По сути, я выбрал его поверх protobuffer, потому что он поддерживал мои требуемые языки и поддерживал больше типов данных (например, например). – 10cool

Смежные вопросы