在
上阅读演员信息http://msdn.microsoft.com/en-us/devlabs/hh975426.aspx我注意到序列化部分:
因为序列化对于程序的正确功能至关重要而且很容易出错,c++ Actors库包含一个简单的消息定义生成工具,' msgtool ',它给出了一个XML文档将创建必要的类型和序列化定义。
我找不到msgtool在VS命令提示符,或使用谷歌搜索。
这是Casablanca项目的一部分,这是微软的一个孵化项目,由DevLabs集团拥有。这是一个相当新鲜的项目,我第一次听说它是大约3个月前。可能持续的时间更长,我不确定。
你不会在标准的VS发行版中找到任何Casablanca工具,这个项目离成为一个核心的微软产品还有很长的路要走。孵化项目是探索有朝一日可能获得回报的有前途的技术的工具。微软从不羞于公开他们正在做的事情,从他们的客户那里得到反馈,以找出哪些是有效的,哪些是无效的。没有"不要把手指放在手机天线上"的惊喜。
他们绝对是在逆云计算的主流潮流而动,他们使用原生c++。这在VM语言领域已经存在很长时间了。反射支持是一项非常重要的资产。但是很明显,要使这些工作顺利进行,重要的是要可靠地序列化c++对象。因此这个"msgtool"
项目的登陆页面在这里。他们提供VS2010、VS2012和最新Express版本的安装程序。点击右边的按钮来启动它。我实际上没有尝试过,但你应该在安装它后以"msgtool.exe"结束。确保你能处理一个项目在投入后破产的情况,这是微软这类项目最典型的结果。
更新:请注意链接的网页在DevLabs网站上不再可用。真正的项目主页提到:
我们的文档不再在DevLabs网站上提供,只能在下载的文件
您可以在Casablanca_Samples.zipDocumentsactors.html中找到链接页面的副本。导航到"Serialization"部分并比较两者。在提到"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 ';}'