2017-01-13 42 views
0

我想知道什么是用ThriftPy对结构列表进行二进制编码的最佳方法。我发现的唯一方法是创建另一个包装struct并从流中删除二进制前缀/后缀,但这是非常hacky,应该肯定有更好的方法。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需要一个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

我打算建议只写一个列表的内容(但不是列表本身)。但这只是一个疯狂的猜测,从来没有用过Zipkin。是否有任何涵盖您的用例的文档或教程? – JensG

+0

有些东西[这里](https://github.com/openzipkin/pyramid_zipkin-example/blob/master/transport.py),但正如你所看到的,它也有hackery。 – neverlastn

+0

我猜主要的问题是,Thrift允许编码独立的结构列表(不在另一个结构中)吗?如果是的话,那么这些Python库应该提供一种方法。如果没有(似乎可能),那么Zipkin正在使用非标准功能。 – neverlastn