在
http://msdn.microsoft.com/en-us/devlabs/hh975426.aspx上阅读有关演员的信息时,
我注意到关于序列化的部分:
由于序列化对程序的正确功能至关重要,而且很容易出错,因此 C++ Actors 库包含一个简单的消息定义生成工具“msgtool”,给定 XML 文档将创建必要的类型和序列化定义。
我在 VS 命令提示符下或使用 Google 搜索时找不到 msgtool。
在
http://msdn.microsoft.com/en-us/devlabs/hh975426.aspx上阅读有关演员的信息时,
我注意到关于序列化的部分:
由于序列化对程序的正确功能至关重要,而且很容易出错,因此 C++ Actors 库包含一个简单的消息定义生成工具“msgtool”,给定 XML 文档将创建必要的类型和序列化定义。
我在 VS 命令提示符下或使用 Google 搜索时找不到 msgtool。
这是卡萨布兰卡项目的一部分,该项目是微软的一个孵化项目,由 DevLabs 集团拥有。这是一个非常新鲜的项目,我第一次听说它是在大约 3 个月前。它可能会持续更长时间,不确定。
您不会在标准 VS 发行版中找到任何 Casablanca 工具,该项目距离成为核心收缩包装的 Microsoft 产品还有很长的路要走。孵化项目是探索有前途的技术的工具,总有一天会得到回报。微软从不羞于公开他们正在做的事情,从客户那里获得反馈以找出哪些有效,哪些无效。没有“不要将手指放在手机天线上”的惊喜。
他们肯定在逆向云计算的主要趋势,他们使用的是原生 C++。这在 VM 语言领域已经存在很长时间了。反射支持是一项非常重要的资产。但很明显,要使这些工作顺利进行,可靠地序列化 C++ 对象是一项主要要求,这一点非常重要。因此这个“msgtool”。
该项目的登录页面在这里。他们为 VS2010、VS2012 和最新的 Express 版本提供安装程序。单击右侧的按钮以启动它。我实际上并没有尝试过,但你应该在安装后得到“msgtool.exe”。确保你可以处理一个项目在承诺之后就会破产,这是微软这类项目最典型的结果。
更新:请注意,DevLabs 站点上不再提供链接的网页。真正的项目主页提到:
DevLabs 网站上不再提供我们的文档,仅在下载的文件中提供
您可以在 Casablanca_Samples.zip\Documents\actors.html 中找到链接页面的副本。导航到“序列化”部分并比较两者。在提到“msgtool”的确切位置,您现在会看到它在谈论msg_ptr<T>
模板类。所以,是的,看起来这个工具似乎不再支持或包含在当前的 SDK 中,如果它曾经是的话。
给你,在 python 中——又快又脏!当然,错了,但你明白我希望的想法!
import xml.dom.minidom
s = '''
<Namespace name="test">
<Message name="FooBar">
<Type name="T"/>
<Field name="a" type="std::string"/>
<Field name="b" type="T"/>
<Field name="d" type="std::string"/>
</Message>
</Namespace>
'''
dom = xml.dom.minidom.parseString(s)
messages = []
def parseMessage(node):
print 'class', node.attributes['name'].value, '{'
for type in node.getElementsByTagName('Type'):
print 'template<typename', type.attributes['name'].value, '>'
for field in node.getElementsByTagName('Field'):
print field.attributes['type'].value, field.attributes['name'].value, ';'
print '}'
messages.append(node)
def parseNamespace(node):
print 'namespace', node.attributes['name'].value, '{'
for child in node.childNodes:
if child.nodeType == child.ELEMENT_NODE:
if 'Message'==child.tagName:
parseMessage(child)
print '}'
for child in dom.childNodes:
if 'Namespace'==child.tagName:
parseNamespace(child)
for node in messages:
message_name = node.attributes['name'].value
type_name = None
for type in node.getElementsByTagName('Type'):
type_name = type.attributes['name'].value
print 'template<typename %s>'%type_name
print 'size_t calculate_size(const test::%s<%s> &data)'%(message_name, type_name)
print '{ return'
print '+'.join(['::calculate_size(data.%s)'%field.attributes['name'].value for field in node.getElementsByTagName('Field')])
print ';}'