visual studio -在哪里可以获得神话般的Microsoft msgtool,用于c++序列化




上阅读演员信息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 ';}'

相关内容

  • 没有找到相关文章

最新更新