2017-01-13 19 views
0

Мне интересно, как лучше всего бинарно закодировать список структур с ThriftPy. Единственный способ, который я нашел, - создать еще один обертку struct и удалить бинарный префикс/суффикс из потока, но это очень взломано, и определенно должен быть лучший способ.Списки кодирования в Thrift (Python)

foobar.thrift:

struct Object { 
    1: i32 num1 = 0, 
    2: i32 num2, 
} 

struct ListContainer { 
    1: list<Object> objects 
} 

app.py

foobar = thriftpy.load('foobar.thrift', module_name="foobar_thrift") 

objects = [ ... list of Objects ... ] 

thrift_obj = foobar.ListContainer(objects) 

trans = TMemoryBuffer() 
thrift_obj.write(TBinaryProtocol(trans)) 

encoded_list = bytes(trans.getvalue())[3:-1] 
+0

Как бы вы определить «лучший путь» в контекст этого вопроса? И почему вы вообще удаляете заголовок? IOW, ** чего вы хотите достичь **? – JensG

+0

Существует существующий API, который ожидает объект Array of Thrift, и я хочу его использовать. API реализован на Java, который, как представляется, поддерживает чтение списков объектов (см. [Здесь] (https://github.com/openzipkin/zipkin/blob/fe14098030ab7ee5e305376c232ac72d852890b5/zipkin/src/main/java/zipkin/internal/ThriftCodec. java # L409)) – neverlastn

ответ

0

Я нашел решение ... не особо элегантный, но лучше, чем предыдущий.

foobar.thrift:

struct Object { 
    1: i32 num1 = 0, 
    2: i32 num2, 
} 

typedef list<Object> ObjectList 

app.py:

import thriftpy 
from thriftpy.transport import TMemoryBuffer 
from thriftpy.protocol.binary import write_val 


foobar = thriftpy.load('foobar.thrift') 


def write_list(trans, val, list_type): 
    ttype, spec = list_type 
    write_val(trans, ttype, val, spec=spec) 

val = [foobar.Object(num1=8, num2=12)] 

trans = TMemoryBuffer() 
write_list(trans, val, foobar.ObjectList) 
encoded_list = bytes(trans.getvalue()) 

Я попытался посмотреть, что делает стандартная реализация бережливость. Это не облегчает. Он ничего для ObjectList не генерируют так, чтобы достичь того же вы должны сделать thrift -gen py foobar.thrift, а затем:

app.py:

import sys 
sys.path.append('gen-py') 

from foobar.ttypes import * 
from thrift.protocol import TBinaryProtocol 
from thrift.transport import TTransport 


def write_list(trans, val): 
    protocol = TBinaryProtocol.TBinaryProtocol(trans) 
    protocol.writeListBegin(TType.STRUCT, len(val)) 
    for values in val: 
     values.write(protocol) 
    protocol.writeListEnd() # This is a nop 

val = [Object(num1=8, num2=12)] 

trans = TTransport.TMemoryBuffer() 
write_list(trans, val) 
encoded_list = trans.getvalue() 
+0

Я собирался предложить просто написать содержимое списка (но не самого списка) один за другим. Но это только дикая догадка, я никогда сам не использовал Зипкина. Нет ли доступного документа или учебника, который охватывает ваш прецедент? – JensG

+0

Есть что-то маленькое [здесь] (https://github.com/openzipkin/pyramid_zipkin-example/blob/master/transport.py), но, как вы можете видеть, у него также есть хакерство. – neverlastn

+0

Я предполагаю, что главный вопрос заключается в том, позволяет ли Thrift кодировать автономные списки структур (не внутри других структур) или нет? Если да, то эти библиотеки Python должны обеспечить способ. Если нет (что кажется вероятным), то Zipkin использует нестандартные функции. – neverlastn

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

  • Нет связанных вопросов^_^