我会简单地使用 Python 作为消息定义文件格式。
让你的消息定义文件是一个普通的 Python 文件:
# file messages.py
messages = dict(
struct1=[
dict(field="name", type="string", ignore=False),
dict(field="id", type="int", enums={0: "val1", 1: "val2"}),
],
struct2=[
dict(field="object", type="struct1"),
]
)
然后您的程序可以直接导入和使用该数据结构:
# in your program
from messages import messages
print messages['struct1'][0]["type"]
print messages['struct1'][1]['type']
print messages['struct1'][1]['enums'][0]
print messages['struct2'][0]['type']
使用这种方法,您可以让 Python 为您进行解析。
而且你也获得了很多可能性。例如,假设您(出于某种奇怪的原因)有一个包含 1000 个名为“field_N”的字段的消息结构。使用传统的文件格式,您将不得不添加 1000 行字段定义(除非您在配置文件解析器中构建一些循环 - 无论如何,您都在创建编程语言的路上)。为此目的使用 Python,您可以执行以下操作:
messages = dict(
...
strange_msg=[dict(field="field_%d" % i) for i in range(1000)],
...
)
顺便说一句,在 Python 2.6 上,使用命名元组而不是 dict 是一种选择。或者使用众多可用的“Bunch”类(请参阅 Python 食谱以了解 2.5 的命名元组)。
编辑:
下面是读取命令行中指定的消息定义文件的代码。它使用execfile 而不是import。
# file mainprogram.py
def read_messages_from_file(filename):
module_dict = {}
execfile(filename, module_dict)
return module_dict['messages']
if __name__ == "__main__":
from pprint import pprint
import sys
for arg in sys.argv[1:]:
messages = read_messages_from_file(arg)
pprint(messages)
执行:
$ python mainprogram.py messages1 messages2 messages3
将读取并打印每个文件中定义的消息。