【发布时间】:2015-11-11 16:41:28
【问题描述】:
我正在尝试使用 Python 将 protobuf 文件“转换”为 Objective-C 类。例如,给定 protobuf 消息:
message Person {
required string name = 1;
required int32 id = 2;
optional string email = 3;
}
我想把它翻译成一个objc类:
@interface Person : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) int ID;
@property (nonatomic, copy) NSString *email;
@end
关键点是获取每个属性的名称和类型。例如protobuf消息中的'optional string email',它的名字是'email',类型是'string',所以在objective-c中应该是NSString *email。我按照官方教程,写了一个和教程中的一样的addressbook.proto并编译它。然后我写了我的python代码:
import addressbook_pb2 as addressbook
p = addressbook.Person()
all_fields = p.DESCRIPTOR.fields_by_name
# print "all fields: %s" %all_fields
field_keys = all_fields.keys()
# print "all keys: %s" %field_keys
for key in field_keys:
one_field = all_fields[key]
print one_field.label
这只是给了我:
1
2
3
2
所以我猜 label 不是我需要的,而 field_keys 只是我期望的名称列表。我尝试了一些其他词,并在网络上进行了一些搜索,但没有找到正确的答案。
如果没有办法获取类型,我还有一个想法,就是以纯“Pythonic”的方式读取和分析protobuf源文件的每一行,但如果它真的不想这样做没必要。
谁能帮帮我?
【问题讨论】:
-
你所说的“类型”是什么意思?你期待什么样的事情?有一个“wire type”描述了数据是如何打包的,并且可能有“proto”声明的类型,以及您选择的平台的运行时类型......你的意思是什么?
-
“type”是指protobuf消息中的“string, int32”,名称是“name, id, email”。例如,我想获取“字符串”类型,将其转换为 objecitve-c 中的“NSString”。
-
没有
type某种成员吗?与c版本相比:developers.google.com/protocol-buffers/docs/reference/cpp/… -
谢谢!为什么我没有找到这个?我猜是因为我是 protobuf 的新手,而 google 的 python protobuf 文档比 C++ 版本丑得多。